基于单片机的数字温度计设计.docx
《基于单片机的数字温度计设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字温度计设计.docx(16页珍藏版)》请在冰豆网上搜索。
基于单片机的数字温度计设计
单片机课程设计报告
姓名:
学号:
班级:
学院:
机电学院
指导老师:
基于单片机的数字温度计设计
摘要:
本文介绍一种基于AT89S51单片机的一种温度测量电路,该电路采用DS18B20作为温度监测元件,测量范围0℃~99℃,使用2位LED模块显示。
正文着重给出了软硬件系统的各部分电路,介绍了集成温度传感器DS18B20的原理,AT89S51单片机功能和应用。
该电路设计新颖、功能强大、结构简单。
关键词:
温度测量DS18B20AT89S52
目录
1前言······························································3
2方案设计··························································3
3系统的硬件设计····················································4
3.1主控制器·····················································4
3.2显示电路······················································5
3.3温度传感器工作原理············································6
3.4温度传感器接口电路············································9
4系统的软件设计····················································9
4.1主流程图······················································9
4.2主程序·······················································10
5总结·····························································16
参考文献···························································17
1前言
数字温度计(DigitalThermometer)简称DTM,它是采用数字化测量技术,把连续的温度值转换成不连续、离散的数字形式并加以显示的仪表。
传统的温度计功能单一、精度低,不能满足数字化时代的需求,采用单片机的数字温度计,由于精度高、抗干扰能力强,可扩展性强、集成方便得到了广泛的应用。
温度是许多监控系统中的一个重要参数。
DS18B20直接把温度信息转换成相应的数字信号。
数据采集、处理模块主要由AT89S52单片机构成,完成温度数据的读取和显示。
本文将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对AT89S51单片机为控制器构成的数字温度测量装置的工作原理及程序设计作了详细的介绍。
2方案设计
本设计主要是介绍了单片机控制下的温度检测系统,详细介绍了其硬件和软件设计,并对其各功能模块做了详细介绍,其主要功能和指标如下:
●利用温度传感器(DS18B20)测量某一点环境温度
●测量范围为0℃~99℃,精度为
1℃
●用数码管进行实际温度值显示
采用AT89S51单片机P3.7口控制温度传感器DS18B20的温度测量,以两位数码感形式输出测量温度,原理图如下图2.1所示:
图2.1DS18B20与单片机接口
图2.2 总体设计方框图
3系统的硬件设计
3.1主控制器
AT89S51是一种低功耗、高性能CMOS8位微控制器,具有4K在系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S51具有以下标准功能:
4k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S51可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断为止。
8位微控制器4K字节在系统可编程FlashAT89S51
图3.1时钟电路
3.2显示电路
显示采用2位数码管,图3.2.1为数码管段驱动,图3.2.2为数码管位驱动,图3.2.3为温度显示电路
图3.2.1数码管段驱动
图3.2.2数码管位驱动
图3.2.3温度显示电路
3.3温度传感器工作原理
DS18B20温度传感器是美国DALLAS半导体公司最新推出的一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20的性能特点如下:
•独特的单线接口仅需一个端口引脚进行通讯
•简单的多点分布应用
•无需外部器件
•可通过数据线供电
•零待机功耗
•温度以9位数字量读出
•温度数字量转换时间200ms(典型值)
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
DS18B20的管脚排列、各种封装形式如图3.3.1所示,DQ为数据输入/输出引脚。
开漏单总线接口引脚。
当被用着在寄生电源下,也可以向器件提供电源;GND为地信号;VDD为可选择的VDD引脚。
当工作于寄生电源时,此引脚必须接地。
其电路图3.3.2所示。
图3.3.1外部封装形式图3.3.2传感器电路图
DS18B20的测温原理如图3.3.3所示,图中低温度系数晶振的振荡频率受温度的影响很小用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量.计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温图2中的斜率累加器用于补偿和修正测温过程中的非线性其输出用,于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值,这就是DS18B20的测温原理。
另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作必须按协议进行。
操作协议为:
初始化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
图3.3.3DS18B20测温原理图
在正常测温情况下,DS1820的测温分辨力为0.5℃,可采用下述方法获得高分辨率的温度测量结果:
首先用DS1820提供的读暂存器指令(BEH)读出以0.5℃为分辨率的温度测量结果,然后切去测量结果中的最低有效位(LSB),得到所测实际温度的整数部分Tz,然后再用BEH指令取计数器1的计数剩余值Cs和每度计数值CD。
考虑到DS1820测量温度的整数部分以0.25℃、0.75℃为进位界限的关系,实际温度Ts可用下式计算:
Ts=(Tz-0.25℃)+(CD-Cs)/CD
3.4温度传感器接口电路
图3.4.1温度传感器接口电路
4系统的软件设计
4.1主流程图
主程序的主要功能是负责温度的实时显示、读出并处理测量的当前温度值,其程序流程见图.
图4.1.1主程序流程图图4.1.2读温度流程图
4.2主程序
#include
#defineulongunsignedlong
#defineuintunsignedint
#defineucharunsignedchar
ucharcodeled[]={0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,
0xee,0x3e,0x9c,0x7a,0x9e,0x8e,0x02,0x00};//数码管码表
uchardisp[4]={1,2,3,4};//数码管显示缓冲区
//数码管位选P1低四位,段选P0
sbitLOCK=P1^4;//74573锁存端
sbitDQ=P3^5;//DS18B20数据端
uchartemplow;//温度值低字节
uchartemphigh;//温度值高字节
chartempzheng;//温度值整数
voidDelay(uintx);
voidDisplay();
voidTxReset();
voidRxWait();
bitRdBit();
ucharRdByte();
voidWrBit(bitb);
voidWrByte(uchard);
voidConvert();
voidRdTemp();
sbitACC0=ACC^0;
sbitACC7=ACC^7;
/*------------------主函数--------------------*/
voidmain()
{
while
(1)
{
Convert();//调用启动温度转换函数
RdTemp();//调用读取温度值函数
}
}
/*---------------初始化DS18B20----------------*/
voidTxReset()
{
uinti;
DQ=0;//发送复位脉冲
i=100;
while(i>0)i--;//拉低900us
DQ=1;//释放总线
i=4;
while(i>0)i--;
}
/*--------------等待DS18B20应答---------------*/
voidRxWait()
{
uinti;
while(DQ);//等待15-60us
while(~DQ);//DS18B20发出存在脉冲60-240us
i=4;
while(i>0)i--;
}
/*----------------读取一位数据----------------*/
bitRdBit()
{
uchari;
bitb;
DQ=0;//读开始1us
i++;
DQ=1;//产生读时间隙15us
i++;
i++;
b=DQ;//读位
i=8;
while(i>0)i--;//等待60us
DQ=1;//释放总线
returnb;
}
/*----------------读取字节数据----------------*/
ucharRdByte()
{
uchari,j,d;
d=0;
for(i=0;i<8;i++)//各位由低向高读出DS18B20
{
j=RdBit();
d=(j<<7)|(d>>1);
}
returnd;
}
/*----------------写入字节数据----------------*/
voidWrByte(uchard)
{
uinti;
ucharj;
bitbtmp;
for(j=0;j<8;j++)//各位由低向高写入DS18B20
{
btmp=d&0x01;
d=d>>1;
if(btmp)//写1
{
DQ=0;//延时15us
i++;
i++;
DQ=1;//写1时隙不低于60u
i=8;
while(i>0)i--;
}
else//写0
{
DQ=0;
i=8;
while(i>0)i--;//保持低电平60us到120us
DQ=1;//释放总线
i++;
i++;
}
}
}
/*----------------启动温度转换----------------*/
voidConvert()
{
uinti;
Delay(125);//延时1ms
TxReset();//初始化DS18B20
RxWait();//等待DS18B20应答
Delay(125);//延时
WrByte(0xcc);//跳过ROM命令
WrByte(0x44);//温度转换命令
for(i=0;i<250;i++)//延时1s
Display();
}
/*-----------------读取温度值-----------------*/
voidRdTemp(void)
{
shortinttemp;
uintx;
bitflag=1;
TxReset();//初始化DS18B20
RxWait();//等待DS18B20应答
Delay(125);//延时
WrByte(0xcc);//跳过ROM命令
WrByte(0xbe);//读暂存存储器命令
temphigh=RdByte();//温度值高字节
temp=(temphigh<<8)|templow;//温度为16位补码
if(temp<0)//负温度
{
flag=0;
temp=~temp+1;
}
tempzheng=temp>>4;//温度值整数
x=temp&0x000f;
if(flag)
disp[0]=tempzheng/100;//百位
else
disp[0]=16;
disp[1]=(tempzheng%100)/10;//十位
disp[2]=tempzheng%10;//个位
}
/*--------------------延时-------------------*/
voidDelay(uintx)
{
uinti;
for(i=x;i>0;i--);
}
/*----------------数码管显示-----------------*/
voidDisplay()
{
uchari,j;
j=0x08;
for(i=0;i<4;i++)
{
P1=j;//数码管位码输出
LOCK=1;//打开锁存
if(i==2)
elseP0=led[disp[i]];//数码管段码输出
LOCK=0;//关闭锁存
j=j>>1;//调整位码
Delay(125);
P0=0x00;
}
}
5总结
通过此次课程设计,使我更加扎实的掌握了有关基于单片机的数字温度计设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍所在,
课程设计是培养学生综合运用所学知识,发现,提出,分析和解决问题,锻炼实践能力的重要环节,是对我们学生实际工作能力的具体训练和考察过程,随着科学技术发展的越来越快,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说无出不在,因此学习和应用单片机的开发技术是十分重要的。
回顾起此次课程设计,至今我仍然感触良多,的确,从理论到实践,在整整一个星期里,可以说苦多甜少,但是我却学到了很多很多的东西,同时还巩固了学的知识,通过这次课程设计使我懂得了理论和实践相结合很重要的道理,只有理论是远远不够的,只有把理论知识和实践结合起来,从实践中得出理论知识,才能真正为社会服务,从而提高至今的实际的动手能力和独立思考能力。
在设计的过程中遇到的问题,可以说是困难重重,在做的过程中难免会遇到各种各样的问题,同时在设计中发现自己的不足之处,等等,通过这次课程设计之后,一定可以把以前所学的知识理解通透。
参考文献
[1]谢维成.单片机原理与应用及C51程序设计.北京:
清华大学出版社,2009
[2]李朝青.单片机原理及接口技术[M].北京:
北京航空航天大学出版社,2005
[3]马忠梅.单片机的C语言应用程序设计(第4版)[M].北京:
北京航空航天大学出版社,2007
[4]江世明.基于Proteus的单片机应用技术[M].北京:
电子工业出版社,2009
[5]彭伟.单片机C语言程序设计实训100例[M].北京:
电子工业出版社,2009
[6]张毅刚.新编MCS-51单片机应用设计(第3版)[M].哈尔滨:
哈尔滨工业大学出版社,2008