基于单片机的数字温度计.docx
《基于单片机的数字温度计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字温度计.docx(25页珍藏版)》请在冰豆网上搜索。
![基于单片机的数字温度计.docx](https://file1.bdocx.com/fileroot1/2023-1/26/3138d490-29c7-4d39-b4d4-7219dfdb2e02/3138d490-29c7-4d39-b4d4-7219dfdb2e021.gif)
基于单片机的数字温度计
单片机课程设计
课设题目:
数字显示温度计
学院:
电气与控制工程学院
专业班级:
自动化1105班
设计者:
何瑢(1106050503)、蔡驰(1106050505)、
刘阿敏(1106050507)
设计时间:
17周——18周
指导老师:
杨良煜刘晓荣
第一部分:
整体方案
1.1摘要…………………………………………………………………………………………1
1.2设计任务及要求……………………………………………………………………………1
1.2.1基本功能
1.2.2扩展功能
1.3方案辩证……………………………………………………………………………………1
1.3.1温度传感器的选取
1.3.2显示模块的选择
第二部分:
方案设计框图
2.1硬件电路框图………………………………………………………………………………2
2.2主控电路……………………………………………………………………………………3
2.3显示电路……………………………………………………………………………………3
2.4报警温度调节电路…………………………………………………………………………4
2.5温度传感器及DS18B20测温原理………………………………………………………4
第三部分:
系统软件算法设计
3.1主程序………………………………………………………………………………………5
3.2读出温度子程序……………………………………………………………………………5
3.3温度转换命令子程序……………………………………………………………………6
3.4计算温度子程序……………………………………………………………………………6
3.5显示数据刷新子程序………………………………………………………………………6
3.61602的液晶显示…………………………………………………………………………6
第四部分:
软件仿真图…………………………………………………………………………7
第五部分:
参考文献……………………………………………………………………………8
第六部分:
设计心得体会………………………………………………………………………8
第七部分:
附录………
附录一:
系统总体原理图………………………………………………………………………9
附录二:
系统程序清单…………………………………………………………………………10
附录三:
元件清单………………………………………………………………………………18
题目:
数字显示温度计
1、摘要:
本文介绍一种基STC89C52单片机的一种温度测量及报警电路,以DS18B20数字温度传感器为信号源来实现数字钟温度的显示,测量范围是:
-20~100℃,使用1602液晶显示屏显示,能设置温度报警上下限。
一般而言数字温度计的设计与制作可以采用数字电路来完成,也可以采用单片机来完成,若采用数字电路来完成,则设计的电路图太复杂,其功能也主要是依赖于数字电路的各功能模块的组合来实现,而且电路板的制作比较复杂,采用单片机来设计制作,由于其功能的实现主要是通过软件编程来完成,这样大大降低了电路的复杂性,而且成本也较便宜。
关键字:
温度测量温度传感器DS18B20
Abstract:
ThispaperintroducesakindofakindofbaseAT89S52singlechipmicrocomputertemperaturemeasurementandalarmcircuit,carryingoutthemanifestationofthedigitalthermometer,itsMeasuringrangeis:
-20~100℃,whichuse1602LCDscreendisplayandcansetthelowerlimittemperaturealarm.Generallyspeakingthedesignandmanufacturesofthedigitalthermometercanadoptthenumericalelectriccircuittocomplete,canalsoadoptamachinetocomplete.Ifadoptthenumericalelectriccircuittocomplete,thentheelectriccircuitdiagramofdesignistoocomplicated,itsfunctionalsomainlyisdependoninthenumericalelectriccircuitofthecombinationofeachfunctionmoldpiecetocarryout,andthecreationofthecircuitboardismorecomplicated.Adoptamachinetodesignthecreation,becauseoftherealizationofitsfunctionmainlyistopassthesoftwareplaitdistancetocomplete,thusloweredthecomplexityoftheelectriccircuitconsumedly,andthecostalsocomparesthecheapness.
Keywords:
STC89C52,,DS18B20,1602
2.1设计任务及要求:
基本功能:
1)温度测量范围:
-20~100℃,测量误差小于0.5℃
2)1602LCD液晶显示屏直接显示
扩展功能:
1)可以任意设定上下限报警温度
2)温度显示有华氏度和摄氏度两种,由按键控制
2.2方案辩证
2.2.1温度传感器的选取:
(1)方案一:
采用热敏电阻传感器。
利用热敏电阻随温度变化而显著变化,能直接将温度的变化转换为能量的变化,进而制成温度计。
但是其测温传感器比较复杂,而且不易通过编制程序来控制测温精度,增大系统设计的难度。
(2)方案二:
采用DS18B20温度传感器。
DS18B20的内部3脚(或8脚)封装;使用特有的温度测量技术,将被测温度转换成数值信号;3.0~5.5V的电源供电方式和寄生电源供电方式;ROM由64位二进制数字组成,共分为8个字节;RAM由9个字节的高速暂存器和非易失性电擦写ROM组成。
综上所述:
温度传感器选取智能测温器件DS18B20。
2.2.2显示模块的选择
显示电路采用LCD液晶显示,从P3口RXD,TXD串口输出段码。
显示电路是使用的串口显示,这种显示最大的优点就是使用口资源比较少.
本设计显示电路采用1602液晶显示模块芯片。
用LED数码管来显示。
显示器件为7段码数码管,适于制作时钟屏、利率屏等,显示数字的电子显示屏。
综上各方案所述,对此次课设的方案选定:
采用STC89C52作为主控制系统;1602液晶显示模块芯片作为温度数据显示装置;而智能温度传感器DS18B20器件作为测温电路主要组成部分。
至此,系统最终方案确定。
2、设计方案的总体设计框图
温度计电路设计总体设计方框图如图所示,控制器采用单片机STC89C52,温度传感器采用DS18B20,用1602液晶显示屏以串口传送数据实现温度显示。
2.1硬件电路框图:
图1——总体设计方框图
系统由单片机最小系统、显示电路、按键、温度传感器等组成。
本电路是由STC89C52单片机为控制核心,具有与MCS-51系列单片机完全兼容,程序加密等功能,带2KB字节可编程闪存,工作电压范围为2.7~6V,全静态工作频率为0~24MHZ;显示电路由1602液晶显示模块芯片,可以进行多行显示;温度报警按键设为五个,可以显示华氏温度,调节高低报警温度;温度传感器电路主要由DS18B20测温器件构成,该器件主要功能有:
采用单总线技术;每只DS18B20具有一个独立的不可修改的64位序列号;低压供电,电源范围为3~5V;测温范围为-20℃~+125℃,误差为±0.5℃;复位电路是10K电阻构成的上电自动复位。
2.2主控电路
单片机AT89C51具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用系统可用二节电池供电。
晶振采用12MHZ。
复位电路采用上电加自动复位。
图二——主控芯片STC89C52
图三——晶振电路
图四——复位电路
2.3显示电路
本设计显示电路采用1602液晶显示模块芯片,该芯片可现实16x2个字符,比以前的七段数码管LED显示器在显示字符的数量上要多得多。
1602A芯片的接口信号说明如下表:
图五——液晶显示电路
2.4报警温度调节电路
本系统一共设置了五个按键,k1键只是显示华氏温度,k4键按下不松开显示高低报警温度,松开后恢复显示正常温度,k2键和k3键是分别用来调节高低报警温度,k键控制调节时的上调或下调。
具体调节如将高温报警温度调高,第一步将k4键按下不松,k键升起位置,调节k2键,则高温报警温度向上增加,反之亦然。
低温报警同理。
K1显示华氏温度
K加减控制开关
K4低温报警温度调节——
K3高温报警温度调节+
=
K2显示温度报警、返回
图六——报警点调节电路
2.5温度传感器及DS18B20测温原理
由于测温电路采用了单总线数字式可编程温度传感器,硬件实现十分简单,而且仅占用一个I/O口。
节约了成本,大大简化了电路,从而使得调试容易。
图七——测温电路
3、系统软件算法设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
3.1主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图所示。
3.2读出温度子序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如图示
图八——主程序流程图图九——读温度流程图
3.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图,图9所示
3.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图所示。
图十温度转换流程图图十一计算温度流程图
3.5显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图。
3.61602的液晶显示
图十二——显示数据刷新流程图1602液晶显示流程图:
4、软件仿真
本设计是在Proteus环境下进行仿真的,仿真所用到的器件有:
单片机AT89C51,DS1820温度传感器,蜂鸣器,液晶显示器,一些电阻,电容等。
仿真结果如下:
显示器显示传感器温度
高低报警温度
参考文献
[1]李朝青.单片机原理及接口技术(简明修订版).杭州:
北京航空航天大学出版社,1998
[2]李广弟.单片机基础[M].北京:
北京航空航天大学出版社,1994
[3]阎石.数字电子技术基础(第三版).北京:
高等教育出版社,1989
[4]廖常初.现场总线概述[J].电工技术,1999.
[5]刘军.单片机原理与接口技术[M].华东理工大学出版社.2006.
[6]谢自美.电子线路设计、实验、测试[M].武汉,华中理工大学出版社.2000.
[7]张元良.单片机综合设计实用教程[M].北京,机械工业出版社.2013年8月.
设计心得体会
经过将两周的单片机课程设计,在我们小组的共同努力下终于完成了液晶屏显示数字温度计的设计。
经历了这次的课程设计,我深深地感到自己在程序应用方面的不足,程序只有在使用中才能得以练习和巩固,这一点是我在这两周里最大收获。
我了解了设计电路的步骤,对于这些电路还是应该自己动手实际操作才会有深刻理解。
我也了解了关于数字温度计的原理与设计理念还有液晶屏的每一个接点的功能特性。
对于单片机这门课,我学的很吃力,总觉得上课讲解的相对简单,而其实课程的真正要求不仅仅是课本上的知识,在实验课编写程序的时候,就已经感到难度很大,还好和同学讨论才能够理解,汇编语言的掌握远远达不到自己编写的程度,仅仅是看懂语句的功能而已,对于语言的逻辑关系感到很吃力,不容易理解。
实践出真知,从这次的课程设计中,我真真正正的意识到,在以后的学习中,要多多练习和实践,才能把抽象的理论变为自己的知识,才能得以运用。
何瑢1106050503
在实训中,我们认识了很多器件,了解了它们的性能,使用方法及作用。
它们为我们的生活带来了很多的便捷。
通过实训,同学们的友谊也增进了不少,很多不太会做的实验在同学们的帮助下完成了。
我们通过相互学习,相互沟通,一起研究,让很多的实验都做得相当的成功,心中的成就感与自豪感油然而生。
班级的那种团结氛围填满了整个实训间。
我们的老师,他们也顶着酷热和我们一起忙活,看着围在他身边的那一圈圈的人,他也会耐心的为我们讲解,直到我们听懂为止。
在实训中到了编程时就出现了很大的障碍,先开始的显示温度还算顺利,下面的报警部分就花费了相当长的时间,不过经过我们一步步的努力,花费的时间与精力终于没有白费,效果渐渐地出现了。
其实本身程序的思维是正确的,只是步骤中有点小错误,所以导致整个程序的结果很乱,在仔细修改程序之后,终于一步步地达到效果了,对于软件我们加入了报警系统,可加了之后发现程序乱了,以前的时钟也不可以控制了,经过反复研究发现接地接错了位置,导致了用来报警的红灯跟绿灯根本不亮,然后就将接地线重新焊接了一下,功夫不负有心人,灯亮了。
这是我们共同努力的结果,在享受我们成果之时,我们从中学到了很多知识也让我们对数字温度计的设计有了更深一步的了解,
最后我希望我们班能在以后的生活、学习中表现得更出色,更团结。
老师们能够笑脸常开,万事如意。
蔡驰1106050505
这次课设是我们遇到过的较大的设计,所以遇到的问题也比较的多,尤其是以前没有接触过如此复杂的硬件电路以及软件编程,在软、硬件设计和调试中遇到了不少的困难,在同学的帮助以及经过自己在图书馆和网上查资料才逐一克服了难题,学习到了不少的专业知识。
在整个设计过程之前,我已经在网上找了相关方面的资料,在图书馆也借了许多书,万事开始难,在这次课设中,我掌握了很多单片机及其接口应用的知识,让我对我所学过的知识有所巩固和提高,并且让我对当今单片机的最新发展技术有所了解。
在整个过程中,我学到了新知识,增长了见识。
在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。
脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。
我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。
在此我也要感谢老师和同学的帮助,以及同组同学的合作和协助,才能顺利的完成这次课设。
总之,这次的课设收获很大。
刘阿敏1106050507
附录:
附录一:
系统总体原理图
附录二:
系统程序清单
//******************************************************
#include
#include//shiyongyanshi
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDQ=P3^3;
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;
sbitk=P1^0;
sbitk1=P1^4;
sbitk2=P1^5;
sbitk3=P1^6;
sbitk4=P1^7;
sbitled_red=P2^5;
sbitled_blue=P2^6;
sbitBEEP=P3^7;
ucharbz=1;
//BEEP=0;
ucharng=0;//fuhaobiaoshiwei
ucharTempBuffer[]={"TEMP:
"};
inttemp_value;//温度值
ucharcodedis_title[]={"--currenttemp--"};
voidxianshi_huashi();
uchargw=40;
chardw=10;
ucharxianshi_title[]={"TEMPALARM"};
ucharxianshi_baojing[]={"HI:
LO:
"};//34510``12
//----------------延时--------------------------------
voiddelayxus(uintx)
{
uchari;
while(x--)for(i=0;i<200;i++);
}
//*********************LCD控制********************
//读lcd状态
ucharread_lcd_state()
{
ucharstate;
RS=0;RW=1;EN=1;delayxus
(1);state=P0;EN=0;delayxus
(1);
returnstate;
}
//忙等待
voidlcd_busy_wait()
{
while((read_lcd_state()&0x80)==0x80);
delayxus(5);
}
//向LCD写数据
voidwrite_lcd_data(uchardat)
{
lcd_busy_wait();
RS=1;RW=0;EN=0;P0=dat;EN=1;delayxus
(1);EN=0;
}
//向LCD写指令
voidwrite_lcd_cmd(ucharcmd)
{lcd_busy_wait();
RS=0;RW=0;EN=0;P0=cmd;EN=1;delayxus
(1);EN=0;
}
//-----------------------------------------------------------------------------------------------------
//LCD初始化
voidinit_lcd()
{
write_lcd_cmd(0x38);delayxus
(1);
write_lcd_cmd(0x01);delayxus
(1);
write_lcd_cmd(0x06);delayxus
(1);
write_lcd_cmd(0x0C);delayxus
(1);
}
//-----------------------------------------------
//设置液晶显示位置
voidset_lcd_pos(ucharp)
{
write_lcd_cmd(p|0x80);
}
//---------------------------------------
//在LCD上显示字符串
voiddis_lcd_string(ucharp,uchar*s)//位置,字符指针
{
uchari;
set_lcd_pos(p);
for(i=0;i<16;i++)//16*2
{
write_lcd_data(s[i]);
delayxus
(1);
}
}
//-------------------------------------------------------------------
voiddelay_18B20(unsignedinti)
{
while(i--);
}
//--------------------蜂鸣器---------------------------
voidbeep()
{
uchari;
for(i=0;i<100;i++)
{
delayxus
(1);
BEEP=~BEEP;
}
BEEP=1;
}
//延时2
voiddelay2(uintx)
{
while(--x);
}
//==================================================
//初始化DS!
*
/**********ds18b20初始化函数**********************/
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay_18B20(80);//精确延时大于480us
DQ=1;//拉高总线
delay_18B20(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay_18B20(20);
}
/***********ds18b20读一个字节**************/
ucharReadOneChar(void)
{
uchari=0;
uchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(4);
}
return(dat);
}
/*************ds18b20写一个字节****************/
voidWriteOneChar(uchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay_18B20(5);
DQ=1;
dat>>=1;
}
}
/**************读取ds18b20当前温度************/
voidReadTemp(void)
{
unsignedchara=0;
unsignedcharb=0;
unsignedchart=0;
Init_DS18B20();
WriteOneChar(0xCC)