前言
本章讲解了51单片机中用DS18B20采集温度,然后通过串口输出显示,只讲使用,不讲原理,快速上手。
一、绘制仿真
1、新建仿真和添加器件
(1)引脚连接
DS18B20
VCC----VCC
DQ------P37
GND---GND
(2)添加器件
主要就是DS18B20
(3)添加串口

(4)绘制完成
注意DS18B20加上上拉电阻,在实际实物中这个电阻必不可少!
(5)设置时钟频率
双击芯片,修改时钟频率,如果没有正确设置,串口会出错
二、编写代码
1、暴力测试版
在keil里新建工程后,将代码直接复制进main.c可以直接编译使用。
(1)main.c
c
#include "reg52.h"
#include "intrins.h"
#include "stdio.h"
sbit DQ0 = P3^7;//单总线接口
//单总线延时函数
static void Delay_OneWire(unsigned int t)
{
//t = t * 12; // STC15f
while (t--)
;
}
//通过单总线向DS18B20写一个字节
static void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ0 = 0;
DQ0 = dat & 0x01;
Delay_OneWire(5);
DQ0 = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//从DS18B20读取一个字节
static unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for (i = 0; i < 8; i++)
{
DQ0 = 0;
dat >>= 1;
DQ0 = 1;
if (DQ0 )
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
// DS18B20设备初始化
static bit init_ds18b20(void)
{
bit initflag = 0;
DQ0 = 1;
Delay_OneWire(12);
DQ0 = 0;
Delay_OneWire(80);
DQ0 = 1;
Delay_OneWire(10);
initflag = DQ0 ;
Delay_OneWire(5);
return initflag;
}
//读取温度,已经是转换后的,如值为25.6
float Get_Current_T0(void)
{
unsigned int temp;
float temperature;
unsigned char low, high;
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0xBE);
low = Read_DS18B20();
high = Read_DS18B20();
temp = high;
temp <<= 8;
temp |= low;
temperature = temp * 0.0625;
return temperature;
}
// ---- 串口初始化 (9600, 11.0592MHz 晶振) ----
void UART_Init()
{
SCON = 0x50; // 模式1, 8位数据, 可变波特率
TMOD &= 0x0F;
TMOD |= 0x20; // 定时器1, 模式2
TH1 = 0xFD; // 9600bps @ 11.0592MHz
TL1 = 0xFD;
TR1 = 1;
TI = 1;
EA = 1;
}
// ---- 基础串口发送 ----
void UART_SendChar(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void UART_SendString(char *s)
{
while(*s) UART_SendChar(*s++);
}
void Delay1000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
float temp = 25;
char send[20];
UART_Init();
while(1)
{
Delay1000ms();
temp = Get_Current_T0();//读取温度
sprintf(send,"temp:%.1f \r\n",temp);//拼接字符串
UART_SendString(send);//串口发送温度
}
}
记得勾选输出文件
(2)功能测试
前面编译成功后,我们在仿真里找到我们编译后产生的文件,双击芯片进行导入。
然后我们点击左下角的三角形运行仿真。
这里通过串口我们可以看到数据一致。
我们接着调整温度值,点击温度传感器中的上下箭头,可以看到温度的变化。
(3)串口界面消失

2、封装版
(1)新建c文件和h文件
串口的uart文件可以从前几章的文件复制到文件夹再添加,也可以去本栏第一章学习添加--一键传送
(2)代码文件
将代码复制进相应的地方。
DS18B20.c
c
#include "reg52.h"
#include "DS18B20.h"
sbit DQ0 = P3^7;//单总线接口
//单总线延时函数
static void Delay_OneWire(unsigned int t)
{
//t = t * 12; // STC15f
while (t--)
;
}
//通过单总线向DS18B20写一个字节
static void Write_DS18B20(unsigned char dat)
{
unsigned char i;
for (i = 0; i < 8; i++)
{
DQ0 = 0;
DQ0 = dat & 0x01;
Delay_OneWire(5);
DQ0 = 1;
dat >>= 1;
}
Delay_OneWire(5);
}
//从DS18B20读取一个字节
static unsigned char Read_DS18B20(void)
{
unsigned char i;
unsigned char dat;
for (i = 0; i < 8; i++)
{
DQ0 = 0;
dat >>= 1;
DQ0 = 1;
if (DQ0 )
{
dat |= 0x80;
}
Delay_OneWire(5);
}
return dat;
}
// DS18B20设备初始化
static bit init_ds18b20(void)
{
bit initflag = 0;
DQ0 = 1;
Delay_OneWire(12);
DQ0 = 0;
Delay_OneWire(80);
DQ0 = 1;
Delay_OneWire(10);
initflag = DQ0 ;
Delay_OneWire(5);
return initflag;
}
//读取温度,已经是转换后的,如值为25.6
float Get_Current_T0(void)
{
unsigned int temp;
float temperature;
unsigned char low, high;
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0x44);
Delay_OneWire(200);
init_ds18b20();
Write_DS18B20(0xCC);
Write_DS18B20(0xBE);
low = Read_DS18B20();
high = Read_DS18B20();
temp = high;
temp <<= 8;
temp |= low;
temperature = temp * 0.0625;
return temperature;
}
DS18B20.h
c
#ifndef _DS18B20_H
#define _DS18B20_H
float Get_Current_T0(void);
#endif
main.c
c
#include "reg52.h"
#include "intrins.h"
#include "stdio.h"
#include "DS18B20.h"
#include "uart.h"
void Delay1000ms(void) //@11.0592MHz
{
unsigned char data i, j, k;
_nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
void main()
{
float temp = 25;
char send[20];
UART_Init(9600);
while(1)
{
Delay1000ms();
temp = Get_Current_T0();//读取温度
sprintf(send,"temp:%.1f \r\n",temp);//拼接字符串
UART_SendString(send);//串口发送温度
}
}
(3)功能测试
同暴力测试版
三、总结
本文章讲解了DS18B20温度读取的代码,下一章讲解一个单片机挂载多个DS18B20设备读取温度。