DS18B20电子温度计设计与制作
一、制作要求
测量范围为0℃~+100℃,测量精度为1℃,测量误差小于2℃,并利用数码管显示测量值。
二、温度传感器的物理原理
-
1.随物体的热膨胀相对变化而引起的体积变化; 2.蒸气压的温度变化; 3.电极的温度变化; 4.热电偶产生的电动势; 5.光电效应; 6.热点效应; 7.介电常数; 8.磁导率的温度变化; 9.物质的变色、溶解; 10.强性振动温度变化; 11.热放射和热噪声;
温度传感器按照敏感元件是否与被测量接触,温度传感器分为接触式和非接触式。
1.接触式温度传感器
常用热电阻:范围:-260~+850℃;精度:0.001℃
管缆热电阻:范围: -20~+850℃;最高上限为1000℃;精度为0.5级
陶瓷热电阻:范围:-200~+500℃;精度为0.3、0.15级
超低温热电阻:两种碳电阻,可测量 -268.8~ 253℃ 272.9~ 272.99℃
热敏电阻器:适于在高灵敏度的微小温度测量场合使用
2.非接触式温度传感器
辐射高温计:测量1000℃以上高温,分四种:光学高温计、比色高温计、辐射高温计和光电高温计
光谱高温计
超声波温度传感器
激光温度传感器
三、设计结构框图
四、Proteus 8 Professional仿真电路搭建
五、相关管脚定义
#include<reg51.h>
unsigned char code segcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴不带小数点0-9段码
unsigned char code segcodeD[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //共阴带小数点0-9段码
unsigned char code weixuan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //数码管对应的8位管脚
sbit DQ=P2^2; //DS18B20选择位,将DQ位定义为P2.2引脚,读写口
sbit Latch1=P2^7; //位锁存器定义为P2.7引脚
sbit Latch2=P2^6; //段锁存器定义P2.6引脚
sbit Beep=P2^3; //蜂鸣器定义P2.3引脚
sbit LED_RED=P1^0; //高温红灯定义P1.0引脚
sbit LED_GREEN=P1^2; //常温绿灯定义P1.2引脚
sbit LED_BLUE=P1^3; //低温蓝灯定义P1.3引脚
sbit key1=P3^0; //温度上下限切换控制定义P3.0引脚
sbit key2=P3^1; //键盘控制温度- 定义P3.1引脚
sbit key3=P3^2; //键盘控制温度+ 定义P3.2引脚
bit fg=1; //编译器在可寻址区分配的fg变量
bit flag=0; //判断温度上下限切换标志位
unsigned char TL=0; //储存暂存器的温度低位
unsigned char TH=0; //储存暂存器的温度高位
unsigned int sdata; //储存温度
unsigned char xiaoshu1; //储存温度的小数第一位
unsigned char xiaoshu2; //储存温度的小数第二位
unsigned char xiaoshu; //存储温度的小数部分
unsigned char HT=30; //高温上限
unsigned char LT=29; //低温下限
六、对DS18B20进行初始化
初始化步骤
(1)先将数据线置高电平1;
(2)延时(该时间要求不是很严格,但是要尽可能短一点);
(3)数据线拉到低电平0;
(4)延时750μs(该时间范围可以在480~960 μs );
(5)数据线拉到高电平1;
(6)延时等待;
(7)若CPU读到数据线上的低电平0后,还要进行延时,其延时
的时间从发出高电平算起(第(5)步时间算起)最少要480 μs;
(8)将数据线再次拉到高电平1后结束;
初始化代码
void Init_DS18B20(void)
{
unsigned int x=0;
DQ=1; //置为高电平,DQ复位
delay(8); //延时4ms
DQ=0; //置为低电平
delay(80); //延时60ms,大于480us(操作手册)
DQ=1;
delay(5); //延时8ms
x=DQ; //连续两次确保初始化成功,并判断x=0是否初始化成功,x=1则为失败
delay(20); //延时4ms
}
/*读一个字节*/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=1; //单片机信号
delay(1); //单片机信号
DQ=0; //单片机信号
dat>>=1; //dat的值右移动一位,dat的最高位写1,其他七位不变,单片机信号
DQ=1; //单片机信号
if(DQ) //判断DS18B20是否被释放,DS18B20信号
dat|=0x80; //变量data的值与0x80做"或"运算,最高位1,其他位
delay(4);
}
return(dat);
}
/*写一个字节*/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01; //与1按位运算,dat最低位为1时DQ总线为1,dat最低位为0时DQ总线为0 0x01=0000 0001=1
delay(5);
DQ=1;
dat>>=1; //dat的值右移动一位
}
delay(4); //延时4ms
}
七、读取温度部分
读数据步骤
(1)将数据线拉高到1;
(2)延时2 μs;
(3)将数据线拉低到0 ;
(4)延时6 μs;
(5)将数据线拉高到1;
(6)延时4 μs;
(7)读数据线的状态得到一个状态位,并进行数据处理;
(8)延时30 μs;
(9)重复(1)~(7)步骤,直到读取完一个字节;
读取温度代码
void ReadTemperature(void)
{
Init_DS18B20();
WriteOneChar(0xcc); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
delay(125);
Init_DS18B20();
WriteOneChar(0xcc); //跳过读序号列号的操作
WriteOneChar(0xbe); //启动温度转换
TL=ReadOneChar(); //读低8位
TH=ReadOneChar(); //读高8位
if(TH>0xf7)
{
TL=~TL+1; //将右边的表达式按位取反+1,存放的是补码,符号位是负位,如果是8个0要做一次判断
TH=~TH; //符号位是正位,不作运算
fg=0;
}
sdata = TL/16+TH*16;
xiaoshu1 = (TL&0x0f)*10/16;
xiaoshu2 = (TL&0x0f)*100/16%10;
xiaoshu=xiaoshu1*10+xiaoshu2;
}
八、功能设计
报警设置
实时对温度进行判读,当温度大于30度时,自动打开红色LED灯和蜂鸣器;当温度小于10度时,自动打开蓝色LED和蜂鸣器,常温状态下保持绿色LED灯显示。
(*此处为查看红色、绿色和蓝色的LED灯亮起)
独立键盘控制模块
本实验采取三个独立键盘控制。第一个键盘为主控制键设置切换温度上下限+或-,第二个键盘为控制温度的下限,第三个键盘为控制温度的上限。当主控键按下第一次时,切换到温度上限控制,此时第二第三键盘钧控制低、高温度的限值+。当再次按下主控键时,则切换到温度的下限控制,此时第二第三键盘均为控制低、高温度的限值-。代码部分可以给定温度上下限的初始值。
键盘代码部分
void keycan()
{
if(key2==0) //键盘key2按下
{
delay(10); //延时消抖
while(key2==0); //如果确认按下按键等待按键释放
if(flag==0)
{
LT++; //温度下限+
}
else
{
LT--; //温度下限-
}
}
}
void keyscan()
{
if(key3==0) //键盘key3按下
{
delay(10); //延时消抖
while(key3==0); //如果确认按下按键等待按键释放
if(flag==0) //判断现在为调节温度上限
{
HT++; //温度上限+
}
else
{
HT--; //温度上限-
}
}
}
九、主函数部分
void main()
{
while(1)
{
if(key1==0) //键盘key1按下
{
delay(10); //延时消抖
while(key1==0) //如果确认按下按键等待按键释放
flag=~flag; //取反
}
ReadTemperature(); //调用读取
Led(sdata); //显示温度
keycan(); //键盘key2温度下限控制
keyscan(); //键盘key3温度上限控制
if(sdata>HT) //判断温度在高于上限时
{
Beep=0; //蜂鸣器响起
LED_RED=0; //红色LED灯亮起
LED_BLUE=1; //蓝色LED灯关闭
LED_GREEN=1; //绿色LED灯关闭
}
else if(sdata<LT) //判断温度在低于下限时
{
Beep=0; //蜂鸣器响起
LED_RED=1; //红色LED灯亮起
LED_BLUE=0; //蓝色LED灯亮起
LED_GREEN=1; //绿色LED灯关闭
}
else //常温下
{
Beep=1; //蜂鸣器关闭
LED_RED=1; //红色LED灯关闭
LED_BLUE=1; //蓝色LED灯关闭
LED_GREEN=0; //绿色LED灯亮起
}
}
}
十、最终成果展示
DS18B20温度传感器自动启动完毕后,将自动获取并显示当前温度。