数字温度计Word文档下载推荐.docx
《数字温度计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《数字温度计Word文档下载推荐.docx(28页珍藏版)》请在冰豆网上搜索。
3.1602功能函数18
4.DS1302功能函数21
5.参考文献24
1.摘要
本设计是采用单片机技术的数字温度计,近年来集成电路技术的出现和应用,推动了人类文明的突飞猛进。
基于集成电路技术的单片机产品更是方便了人们的生活和工作,目前以单片机技术的应用为核心的产品种类非常丰富,应用我们所学过的知识和查阅的相关资料,我们按照所给的要求制作了这个以单片机技术为核心的时间温限可调数字式多路测温温度计。
本“数字温度计”的设计采用了STC89C52为主控芯片,DS18B20为温度传感器,DS1302为外部时钟计时,测试结果和记录时间通过LCD1602显示输出,在充分理解了设计及要求后,准确地定位了设计的目的,构思了总体的方案,在完成了基于KEIL编译环境下软件设计并通过开发板模拟后,又选择了合适的硬件进行了PCB电路设计和调试。
2.功能简介
(1)能数字显示被测温度,测量温度范围0~1000C;
(2)分辨率0.10C;
(3)带有计时和时间显示功能;
(4)有高、低两路限温控制输出接口控制外部电路;
(5)高、低两路限温控制点可在0~1000C范围内独立设置;
(6)当温度达到高、低限温控制点发出声光报警。
(7)自动顺时测量并保存温度值和测量时间;
(8)两路温度巡检和温度、时间保存;
(9)可以查询、回显存储器中自动测量的温度值和测量时刻;
3.硬件电路
硬件电路是程序的一个依托,没有一个完整坚固的硬件系统,那么程序就如同架空的灵魂。
考虑到焊接以及稳定性的因素,本设计采取印制电路板来做硬件电路。
电路总共分为6个模块,分别是:
电源电路、DS18B20温度探测模块、1602显示模块、1302时钟震荡电路、光电报警电路、按键电路。
3.1数字温度计电源模块
本设计的电源模块采用的是220V交流电转4.8V直流电的电路。
通过一个220-8的变压器减压,一个全桥整流电路,7805稳压之后在尾端形成约4.8V的直流电,最后外加一个发光二极管作为电源开断的信号标志。
图1 电源电路图
3.2数字温度计主控电路
温度计电路设计总体设计方框图如图1所示,控制器采用单片机STC80C51,温度传感器采用DS18B20,用3位LED数码管以串口传送数据实现温度显示。
图2 总体设计方框图
图3 主控电路图
主控制器STC80C51
单片机STC80C51具有低电压供电和体积小等特点,
1602显示模块
由于系统要求实现测量环境温度,过界报警、温度存储及回显等诸多功能,要显示的信息不仅仅是温度值,所以采用数码管显示几乎不太现实,所以最后选择1602液晶显示。
图4 1602显示电路图
DS18B20测温模块
图5 DS18B20温度探测电路图
DS18B20温度传感器是美国DALLAS半导体公司推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
●独特的单线接口仅需要一个端口引脚进行通信;
●多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
●无须外部器件;
●可通过数据线供电,电压范围为3.0~5.5V;
●零待机功耗;
●温度以9或12位数字;
●用户可定义报警设置;
●报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
●负电压特性,电源极性接反时,温度计不会因发热而烧毁,但不能正常工作;
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2所示。
图6DS18B20内部结构
64位ROM的结构开始8位是产品类型的编号,接着是每个器件的惟一的序号,共有48位,最后8位是前面56位的CRC检验码,这也是多个DS18B20可以采用一线进行通信的原因。
温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器还包括一个高速暂存RAM和一个非易失性的可电擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如图3所示。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝,是易失的,每次上电复位时被刷新。
第5个字节,为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
该字节各位的定义如图3所示。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,用户要去改动,R1和R0决定温度转换的精度位数,来设置分辨率。
在64位ROM的最高有效字节中存储有循环冗余检验码(CRC)。
主机ROM的前56位来计算CRC值,并和存入DS18B20的CRC值作比较,以判断主机收到的ROM数据是否正确。
DS18B20的测温原理是这样的,器件中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1;
高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
器件中还有一个计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1、温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
其输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
时钟震荡电路
DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×
8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
图7DS1302时钟震荡电路
4系统软件算法分析
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
4.1主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图7所示。
4.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图8示
4.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图,图9所示
4.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图10所示。
图7主程序流程图图8读温度流程图
图9温度转换流程图
图10 计算温度流程图图11 显示数据刷新流程图
4.5显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图11。
1.主函数程序(包括传感器切换、时间温度保存、回显程序)
//===============主函数=================
voidmain()
{
inttemp0,temp1,tempH=60,tempL=1;
//传感器1,2温度暂存区
uchari;
//ucharin=0,un;
//字地址位
uchardisplaytemp[16],num,feature,sensor;
//lcd显示位,键盘按键提取位,功能切换标记位,传感器切换标志位
bitecho;
//回显控制位
speak=1;
speak1=1;
lcd_init();
//初始化液晶
delayms(20);
//稳定延迟
lcd_clear();
//清屏
init_timer0();
//定时器0初始化
uart_init();
//串口初始化
ds1302_init();
//ds1302初始化
lcd_user_char();
//定义新字符
ds1302_read_time();
//首次读取时间
if((time_0ds1302[2]+time_0ds1302[7])==0)//若所有参数为零,写入一个数据
ds1302_write_time();
while
(1)
{
if(setflag)//若收到串口信息,则更新时钟
{
for(i=0;
i<
8;
i++)
time_0ds1302[i]=time_2ds1302[2*i]*10+time_2ds1302[2*i+1];
ds1302_write_time();
setflag=0;
}
//--------------------键盘扫描--------------
num=keyscan();
//--------------------判断功能切换-----------
if(num==3)
num=0;
feature++;
if(feature==4)//四种功能
{
feature=0;
}
switch(feature)//设置显示标志位
case0:
lcd_write_char(10,0,'
H'
);
break;
//上温限
case1:
L'
//下温限
case2:
h'
//小时
case3:
m'
//分钟
default:
if(num<
=2)
if(feature==0)//更改上温限
switch(num)
{
case1:
if(tempH<
101)tempH++;
case2:
if(tempH>
-1)tempH--;
default:
}
if(feature==1)//更改下温限
if(tempL<
101)tempL++;
if(tempL>
-1)tempL--;
if(feature==2)//更改小时位
time_0ds1302[4]++;
if(time_0ds1302[4]==24)time_0ds1302[4]=0;
ds1302_write_time();
time_0ds1302[4]--;
if(time_0ds1302[4]==255)time_0ds1302[4]=23;
if(feature==3)//更改分钟位
time_0ds1302[5]++;
if(time_0ds1302[5]==60)time_0ds1302[5]=0;
time_0ds1302[5]--;
if(time_0ds1302[5]==255)time_0ds1302[5]=59;
//-----------------------------------------
lcd_write_char(12,0,'
D'
lcd_write_char(7,1,0x00);
lcd_write_char(8,1,'
C'
sprintf(displaytemp,"
H%0dL%02d"
tempH,tempL);
lcd_write_string(10,1,displaytemp);
if(readtempflag==1)
ds1302_read_time();
//读时间参数
sprintf(displaytemp,"
%02d:
%02d"
(int)time_0ds1302[4],(int)time_0ds1302[5],(int)time_0ds1302[6]);
lcd_write_string(0,0,displaytemp);
//------------------------超温报警+延迟--------------
temp0=readtemperature();
temperature0=(float)temp0*0.0625;
temp0>
>
=4;
if(temp0>
tempH)
delayms(10);
temp0=readtemperature();
temp0>
if(temp0>
alarm_h(temp0,tempH);
if(temp0<
tempL)
if(temp0<
alarm_l(temp0,tempL);
temp1=readtemperature_a();
temperature1=(float)temp1*0.0625;
temp1>
if(temp1>
temp1=readtemperature_a();
temp1>
if(temp1>
alarm_h1(temp1,tempH);
if(temp1<
if(temp1<
alarm_l1(temp1,tempL);
//----------------传感器切换显示-----------
if(num==4)
sensor++;
if(sensor==2)//两个传感器
sensor=0;
switch(sensor)
if(readtempflag==1)//传感器一
readtempflag=0;
delayms(10);
temp0=readtemperature();
temperature0=(float)temp0*0.0625;
sprintf(displaytemp,"
%7.3f"
temperature0);
lcd_write_string(0,1,displaytemp);
lcd_write_char(13,0,0x41);
break;
if(readtempflag==1)//传感器二
temp1=readtemperature_a();
temperature1=(float)temp1*0.0625;
temperature1);
lcd_write_char(13,0,0x42);
//-----------------保存温度和时间----------------
if(cun==1)
cun=0;
time%02d:
16;
memory[m].time[i]=displaytemp[i];
A%6.3fB%6.3f"
temperature0,temperature1);
memory[m].temp[i]=displaytemp[i];
m++;
if(m==4)
m=0;
//------------------回显存储器里的温度和时间----
if(num==5)
m=0;
lcd_clear();
echo=1;
while(echo==1)
num=keyscan();
displaytemp[i]=memory[m].temp[i];
lcd_write_string(0,1,displaytemp);
displaytemp[i]=memory[m].time[i];
if(num<
m++;
if(m==3)m=0;
lcd_clear();
m--;
if(m==255)m=2;
num=0;
if(num==6)
echo=0;
lcd_clear();
}
}
2.DS18B20功能程序
//================18b20复位==============
bitinit_ds18b20()
bitdat=0;
DQ=1;
delayus2x(50);
DQ=0;
//单片机将数据线激发为低电平,保持480~960us
delayus2x(200);
//释放数据线,拉升15~16us
dat=DQ;
delayus2x(25);
returndat;
//================读一个字节================
ucharreadonechar()
uchari=0;
uchardat=0;
for(i=8;
i>
0;
i--)
DQ=0;
dat>
=1;
DQ=1;
if(DQ)
dat|=0x80;
delayus2x(25);
//================写一个字节================
voidwriteonechar(uchardat)
DQ=dat&
0x01;
//================读取温度==================
uintreadtemperature()
uchara=0;
uintb=0;
uintt=0;
init_ds18b20();
writeonechar(0xcc);
writeonechar(0x44);
delayms(10);
writeonechar(0xc