基于单片机的智能数字温度计设计.docx
《基于单片机的智能数字温度计设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的智能数字温度计设计.docx(13页珍藏版)》请在冰豆网上搜索。
![基于单片机的智能数字温度计设计.docx](https://file1.bdocx.com/fileroot1/2023-4/16/c74b5f36-316b-4091-a2d4-1f74dc25c92d/c74b5f36-316b-4091-a2d4-1f74dc25c92d1.gif)
基于单片机的智能数字温度计设计
现代测量仪器实验报告
基于单片机的智能数字温度计设计
2012/11/27
实验内容:
基于单片机的智能数字温度计设计
1.引言
温度作为我们地球上一个重要物理参数在我们的生活、生产、科研、医疗等环节起着举足轻重的作用。
比如,我们日常生活中穿什么衣服、食物怎样储存、是不适宜出行等等都与温度密切相关。
再如,消防电气的非破坏性温度检测,电力设备的过热故障预知检测,空调系统的温度检测,各类运输工具组件的过热检测,医疗与诊断设备的温度测试等等。
及时准确的知道实时温度的多少成为了一个提高我们生活质量,工作效率的重要消息。
而生活中的温度计并不多见,偶尔看见有温度计也是玻璃制成,极易破碎而且读数极为不方便。
本设计为基于单片机的数字智能温度计能实现温度的实时测量并通过数码管进行实时显示,测量准确、读数方便、使用简单制作成本低。
2.方案设计
2.1总体方案
总体结构
总体构架如上图,具体器件采用stc公司生产的STC12C5A60S2作为我们的主控芯片,它有40个通用I/O口,1280字节片上RAM,具有高速、低功耗、抗干扰能力强等优点完全能够胜任温度的监测与显示。
温度传感器选用美国DALLAS公司生产的DS18B20。
DS18B20独特的单总线技术只需一个引脚进行通讯无需外部器件,可通过数据线供电待机零功耗。
测温范围-55°C~+125°C,以0.0005°C递增完全能够满足我们日常测温需求。
显示部分采用74HC138进行数码管段选、74HC573进行数码管位选完成显示转换。
电源部分采用7V供电,7805芯片进行稳压输出5V工作电压。
2.2硬件设计
2.2.1电源稳压模块
电路采用7V供电,用7805芯片进行稳压,得到5V稳定电压输出,为单片机、74HC138、74HC573和温度传感器DS18B20供电。
D2为电源指示灯。
稳压电路如图:
2.2.2温度检测模块
温度检测由单片机的P1^0口接温度传感器,进行数据传输。
DS18B20单独供电,P3为插DS18B20的接口。
S4为复位按钮电路图如下:
2.2.3温度显示模块
数码管显示我们采用了74HC573和74HC138分别进行数码管的位选与段选,完成数码管显示。
电路如图:
2.3软件设计
采用DS18B20分辨力为0.0005°C,为提高转化速率,采用外部供电,测量为能到达—55°C——128°C,仅采用单总线方式进行数据传输,工作稳定,实用于多种复杂环境,实用性强。
价格便宜,分辨率高,可在温度显示要求较高的环境下实用。
下面介绍一下DS18B20的工作时序
初始化时序图:
读时序图:
DS18B20测温流程图如下:
3.实验结果
我们将DS18B20测温程序在51开发板上进行了测试能进行到小数点后四位的温度显示,且温度变化及时。
达到了温度的实时测量显示效果如图:
我们在开发板上进行了温度计测试:
1、用一只精度为0.1℃的水银温度计作对照标准,把它和温度传感器DS18B20一起放入同一杯冷水中,水银温度计读数为4.0℃,调节数字温度计,使其显示值也为4.0℃,然后逐次向烧杯加热水改变水温,记下每次两只温度计的读数θ1(标准值)与θ2(测试值后三位忽略),其数据表格如表所示。
表温度数据列表
标准温度计/℃
4.0
10.0
15.0
20.0
25.0
30.0
35.0
40.0
45.0
50.0
60.0
数字温度计/℃
4.0
10.3
15.1
20.3
24.9
30.2
34.8
39.7
45.1
50.0
60.3
经对对照,两只温度计读数相差最大为0.3℃,平均相差仅有0.17℃。
总体上讲,此温度计达到了预期设计要求。
4.问题与不足
由于本方案仅仅限于理论设计未做实物,对于器件的选择未做大小选择,实物做出来会比较大不方便携带。
如果选择集成度更高的器件本温度计可实现随身携带。
同时加上扩展接口,可以实现多种功能。
由于时间较短等问题只做了硬件电路的设计并未作硬件电路的调试可能硬件电路有瑕疵。
5.结论
利用STC12C5A60S2单片机和DS18B20数字温度传感器可以实现温度的实时检测。
系统具有信号数字化、硬件简单化和抗干扰能力强等特点,为我们的日常生活提供了重要参考指标。
如果与相应的可扩展接口芯片相连,并在简单修改程序则可实现更多路温度的测量与控制,以适应工业生产的需要。
附:
温度计源程序
1:
对DS18B20操作子程序
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitDQ=P1^0;//DS18B20数据口
/*===========================================================
延时N*16us
=============================================================*/
voiddelay(uintN)
{
uinti;
for(i=0;i}
/*===========================================================
复位
=============================================================*/
ucharreset_DQ()
{
ucharpresence;
DQ=1;
delay(4);
DQ=0;
delay(470);//延时480us
DQ=1;
delay(60);//延时60us
presence=DQ;
delay(400);//延时400us
return(presence);
}
/*voidreset_DQ(void)
{
ucharn;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(8);
n=DQ;
delay(4);
}*/
/*===========================================================
写位
=============================================================*/
voidW_bit(ucharbitval)
{
DQ=0;
if(1==bitval)
{
DQ=1;
}
delay(60);//延时60us
DQ=1;
}
/*===========================================================
写字节
=============================================================*/
voidW_byte(ucharval)
{
uchari,temp;
for(i=0;i<8;i++)
{
temp=val>>i;
temp&=0x01;
W_bit(temp);
}
delay(60);
}
/*===========================================================
读位
=============================================================*/
ucharR_bit()
{
DQ=0;
DQ=1;
returnDQ;
}
/*===========================================================
读字节
=============================================================*/
ucharR_byte()
{
uchari,value=0;
for(i=0;i<8;i++)
{
if(R_bit())
{
value|=0x01<
}
delay(60);
}
returnvalue;
}
/*===========================================================
=============================================================*/
2.测温子程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharcodetable[10]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
uintTH,TL;
voiddelay_1ms(uintk)
{
uchari,j;
for(i=0;ifor(j=0;j<114;j++);
}
voiddelay(uint);
voidinit_ds18b20();
ucharreset_DQ();
voidW_bit(uchar);
voidW_byte(uchar);
ucharR_bit();
ucharR_byte();
voidmain()
{
unsignedlonginttemp;
while
(1)
{
reset_DQ();
W_byte(skip_ROM);
W_byte(c_temper);
delay(300);
reset_DQ();
W_byte(skip_ROM);
W_byte(r_scrat);
TL=R_byte();
TH=R_byte();
temp=(TL|(TH<<8));
temp=(temp*625);
P0=table[temp/1000000];
P2=0;
delay_1ms(5);
P0=table[temp%1000000/100000];
P2=1;
delay_1ms(5);
P0=table[temp%100000/10000]|0x80;
P2=2;
delay_1ms(5);
P0=table[temp%10000/1000];
P2=3;
delay_1ms(5);
P0=table[temp%1000/100];
P2=4;
delay_1ms(5);
P0=table[temp%100/10];
P2=5;
delay_1ms(5);
P0=table[temp%10];
P2=6;
}
}