设计概述
基于DS18B20的多点温度测量监控系统设计,以AT89C52单片机作为主控制器,不断循环读取4组DS18B20(T1、T2、T3和T4)温度数据,同时使用LCD1602液晶循环显示4组测取的温度值以及每组设定的温度上下限值,通过按键可设置每组温度报警上下限和液晶显示的模式(循环显示模式和手动切换显示模式)。
当前组的温度值若不在设定范围内,则蜂鸣器报警,对应的LED灯点亮;具体过程为:温度高于上限值,红色LED灯点亮;温度低于下限值,蓝色LED灯亮。
多点测温
由于每个DS18B20内部均有一个独立的64位序列号,单片机通过序列号可以对一条总线上的多支DS18B20进行控制,读取他们的温度。
单总线本身也可以向所挂接的多个DS18B20供电,而无需额外电源。4组温度传感器的连接网络如下。
Proteus仿真电路
**原理图 **
仿真结果分析
把在KEIL里编译、调试生成的Multi_temp的hex文件导入到Proteus中的AT89C52里进行仿真,整体结果如下:
(1)开机LCD显示界面。
(2)系统正常状态下,循环显示4组DS18B20的温度值以及各组设定的温度上下限值。
(3)由上图可以看出T1的温度值,低于设定的温度下限值,蜂鸣器报警,且相应的LED指示灯点亮。
(4)用户可通过按键设置每组温度传感器的上下限值,以及从循环显示切换为手动显示。
C代码
void tmpchange2(void)
{ uchar j;
dsreset2();//初始化 DS18B20
delay_DS(1);//延时
tmpwritebyte2(0x55);
for(j=0;j<8;j++)
{ tmpwritebyte2(str3[j]); }
tmpwritebyte2(0x44); //发送温度转换命令
}
void tmpchange3(void)
{ uchar j;
dsreset3();//初始化 DS18B20
delay_DS(1); //延时
tmpwritebyte3(0x55);
for(j=0;j<8;j++)
{ tmpwritebyte3(str4[j]); }
tmpwritebyte3(0x44);//发送温度转换命令
}
//get the temperature 获得温度
uint tmp0()
{
float tt;
uchar a,b,j;
dsreset0();
delay_DS(1);
//发送读取数据命令
tmpwritebyte0(0x55);
for(j=0;j<8;j++)
{ tmpwritebyte0(str1[j]); }
tmpwritebyte0(0xbe);
//连续读两个字节数据
a=tmpread0();
b=tmpread0();
//two byte compose a int variable
//两字节合成一个整型变量。
temp_DS=b;
temp_DS<<=8;
temp_DS=temp_DS|a;
if(temp_DS&0xf800)
{
ZF1=1;
temp_DS=~temp_DS+1;
}
else
ZF1=0;
//得到真实十进制温度值,因为 DS18B20
tt=temp_DS*0.0625;
//可以精确到 0.0625 度,所以读回数据的最低位代表的是
//0.0625 度。
//设计获取,蒋宇智QQ(2327603104)
//放大十倍,这样做的目的将小数点后第一位
temp_DS=tt*10+0.5;
//也转换为可显示数字,同时进行一个四舍五入操作。
//返回温度值
return temp_DS;
}
uint tmp1()
{
float tt;
uchar a,b,j;
dsreset1();
delay_DS(1);
tmpwritebyte1(0x55);
for(j=0;j<8;j++)
{ tmpwritebyte1(str2[j]); }
tmpwritebyte1(0xbe);
//连续读两个字节数据
a=tmpread1();
b=tmpread1();
//two byte compose a int variable
//两字节合成一个整型变量。
temp_DS=b;
temp_DS<<=8;
资源内容
(1)基于DS18B20的多点温度测量监控系统设计论文完整版;
(2)Proteus仿真文件;
(3)C程序;
(4)原理图;
(5)Visio流程图文件;
(6)元器件清单;
(7)参考资料;
资源截图
更多回帖