基于单片机的数字温度计和数字钟设计.docx
《基于单片机的数字温度计和数字钟设计.docx》由会员分享,可在线阅读,更多相关《基于单片机的数字温度计和数字钟设计.docx(28页珍藏版)》请在冰豆网上搜索。
基于单片机的数字温度计和数字钟设计
摘要
随着时代的进步和发展,单片机技术已经普及到生活、工作、科研等各个领域,已经成为一种比较成熟的技术。
本文将介绍一种基于单片机控制的数字温度计和数字钟,本数字温度计属于多功能温度计,可以任意设置温度的上下限报警功能,当温度不在设定范围内时,可以报警;本数字钟可以同步显示时间日历,日期和时间都可通过按键校整。
本系统采用的DS1302可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
本系统显示部分采用LCD液晶显示屏显示,可通过按键切换工作界面,工作方便,外形美观。
关键词:
单片机AT89S52;时间同步;DS18B20;DS1302
Abstract
Withtheeraofprogressanddevelopment,single-chiptechnologyhasspreadtolive,work,researchandotherfields,hasbecomearelativelymaturetechnology.Thispaperwillintroduceasingle-chipmicrocomputer-basedcontrolofdigitalthermometeranddigitalclock,thedigitalthermometeraremulti-purposethermometer,youcanarbitrarilysettheupperandlowerlimitsoftemperaturealarmfunction,whenthetemperaturerangeisnotset,itcouldbereported;thedigitalclockcansynchronizethecalendarshowsthetime,dateandtimecanbethroughthewholeschoolkeys.ThesystemusestheDS1302canprovideprogrammablepower-downtoprotectthechargingfunction,andcanturnoffthechargingfunction.PartofthesystemshowedthattheuseofLCDliquidcrystaldisplayscreen,canworkthroughthekeyswitchinterfacetofacilitatetheworkofbeautifulappearance.
Keywords:
SingleChipAT89S52;TimeSynchronization;DS18B20;DS1302
1设计背景
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它给人带来的方便是不可否定的,其中数字温度计和数字钟就是一个典型的例子,但人们对它的要求越来越高,要为现代人工作、科研、生活提供更好的更方便的设施就需要从单片机技术入手,一切向着数字化、智能化控制的方向发展。
本文所介绍的数字温度计与传统的温度计相比,具有读数方便,测温范围广,测温准确度高,其输出温度采用数字显示,主要适用于对测温要求比较准确的场所或科研实验室;本文所介绍的数字钟采用了低功耗实时时钟电路DS1302,它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
同时可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
本系统选用低功耗、高性能CMOS8位微控制器AT89S52作为控制核心,采用温度传感器DS18B20准确测量温度,采用液晶显示屏LCD1604显示实时温度和同步的时间日历。
经过反复测试,本系统能准确完成各项功能。
2方案论证
2.1系统总体设计方案论证
2.1.1方案一
采用热敏电阻的感温效应测量温度,采用LED数码管显示实时温度和同步的时间日历。
本系统的测温电路可使用热敏电阻之类的器件利用其感温效应,将随被测温度变化的电压值或电流值进行采集,经过A/D转换后用单片机进行数据处理,然后用LED数码管将被测温度显示出来。
这种设计方案需要用到A/D转换电路,其感温电路比较繁杂,采用LED数码管显示时间日历至少需要8位数码管,显示电路繁杂,能量损耗大。
2.1.2方案二
采用温度传感器DS18B20测量温度,采用LCD液晶显示屏显示实时温度和同步的时间日历。
本系统可考虑选用一只温度传感器DS18B20,DS18B20不仅可以很容易直接读取被测温度值进行显示,而且温度传感器DS18B20具有独特的一线接口,只需要一条口线就可多点通信,无需外部元件,简化了分布式温度传感应用。
本系统采用液晶显示屏LCD1604显示实时温度和同步的时间日历,电路简单,功耗低,显示信息量大,显示质量高,显示界面美观、友好,可以很好的满足设计要求。
综上所述,方案一的感温电路和显示电路设计繁杂,能量损耗大;方案二的设计电路简单,显示界面美观、友好,并且软件设计也比较简单,所以本系统选用方案二实现实时温度和同步的时间日历的显示功能。
2.2系统总体设计框图
数字温度计和数字钟电路的总体设计方框图如图1所示。
图1总体设计方框图
本系统控制器采用单片机AT89S52,温度传感器采用DS18B20,采用DS1302实现掉电充电功能,用液晶显示屏LCD1604显示实时温度和同步的时间日历。
2.2.1主控制器
单片机AT89S52具有低电压供电和体积小等特点,四个端口只需要两个口就能满足电路系统的设计需要,很适合便携手持式产品的设计使用,系统可用二节电池供电。
2.2.2显示电路
显示电路采用液晶显示屏LCD1604进行显示,单片机从P0口传输温度和时间数据驱动LCD1604进行显示。
LCD1604的接口定义如表1所示。
表1LCD1604的接口定义
引脚号
标识
说明
PIN1
GND
接0V
PIN2
VCC
接4.8V-5V
PIN3
V0
对地接电阻470-2K
PIN4
RS
RS=0,指令寄存器;RS=1,数据寄存器
PIN5
R/W
R/W=0,写;R/W=1,读
PIN6
E
允许信号
PIN7
D0
数据0
PIN8
D1
数据1
PIN9
D2
数据2
PIN10
D3
数据3
PIN11
D4
数据4
PIN12
D5
数据5
PIN13
D6
数据6
PIN14
D7
数据7
PIN15
LED+
背光正极,接4.8V-5V
PIN16
LED-
背光负极,接0V
LCD1604显示字符或汉字的原理如下。
(1)线段的显示
点阵图形式液晶由M*N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16*8=128个点组成,屏上64*16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
例如屏的第一行的亮暗由RAM区的00H~00FH的16字节的内容决定,当(000)=FFH时,如屏的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则显示屏的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=FFH,(003H)=00H,…(00EH)=FFH,(00FH)=00H时,则在屏的顶部显示一条由8段亮线和8段暗线组成的虚线。
(2)字符的显示
用LCD显示一个字符时比较复杂,因为一个字符由6*8或8*8点阵组成,既要找到和显示屏上某几个位置对应的显示RAM区的8字节,还要使每字节的不同的位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮,这样就组成某个字符。
但若内带字符发生器则可工作在文本方式,根据行列号及每行的列数找出对应RAM地址,光标处送上字符对应的代码即可。
(3)汉字的显示
汉字的显示一般采用图形方式,事先从微机中提取要显示的汉字的点阵码,每个汉字占32B,分左右两半部,各占16B,左边为1、3、5…右边为2、4、6…根据在LCD上开始显示的行列号及每行的列数可找到显示RAM对应的地址,设立光标,送上要显示的汉字的一字节,光标位置加1,送第二字节,按行按列对齐,送第三字节……直到32B显示完就可在LCD上得到一个完整的汉字。
2.2.3温度传感器
温度传感器DS18B20是一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
DS18B20具有独特的单线接口,仅需一个端口引脚进行通信,并且多个DS18B20可并联在惟一的三线上,实现多点组网功能;用户还可根据需要定义报警设置,十分方便。
2.2.3.1DS18B20内部结构
DS18B20采用3脚PR-35封装或8脚SOIC封装,其内部结构框图如图2所示。
图2DS18B20内部结构
温度报警触发器TH和TL,可通过软件写入户报警上下限。
DS18B20温度传感器的内部存储器包括一个高速暂存RAM和一个非易失性1可电擦除的EERAM。
高速暂存RAM的结构为8字节的存储器,结构如图3所示。
头2个字节包含测得的温度信息,第3和第4字节TH和TL的拷贝是易失的,每次上电复位时被刷新。
第5个字节为配置寄存器,它的内容用于确定温度值的数字转换分辨率。
DS18B20工作时寄存器中的分辨率转换为相应精度的温度数值。
该字节各位的定义如图3所示。
低5位一直为1,TM是工作模式位,用于设置DS18B20在工作模式还是在测试模式,DS18B20出厂时该位被设置为0,R1和R0决定温度转换的精度位数,来设置分辨率。
图3DS18B20字节定义
当DS18B20接收到温度转换命令后,开始启动转换。
单片机通过单线接口读出该数据,读数据时低位在前,高位在后,数据格式以0.0625℃/LSB形式表示。
当符号位S=0时,表示测得的温度值为正值,可以直接将二进制位转换为十进制;当符号位S=1时,表示测得的温度值为负值,要先将补码变成原码,再计算十进制数值。
表2是一部分温度值对应的二进制温度数据。
表2 一部分温度对应值表
温度/℃
二进制表示
十六进制表示
+125
0000011111010000
07D0H
+85
0000010101010000
0550H
+25.0625
0000000110010000
0191H
+10.125
0000000010100001
00A2H
+0.5
0000000000000010
0008H
0
0000000000001000
0000H
-0.5
1111111111110000
FFF8H
-10.125
1111111101011110
FF5EH
-25.0625
1111111001101111
FE6FH
-55
1111110010010000
FC90H
DS18B20完成温度转换后,就把测得的温度值与RAM中的TH、TL字节内容作比较。
若T>TH或T<TL,则将该器件内的报警标志位置位,并响应主机发出的报警搜索命令。
2.2.3.2DS18B20测温原理
如图4所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其振荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入。
图中还隐藏着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲进行计数,进而完成温度测量。
计数门的开启时间由高温度系数振荡器来决定,每次测量前,首先将-55℃所对应的一个基数分别置入减法计数器1和温度寄存器中,计数器1和温度寄存器被预置在-55℃所对应的一个基数值。
图4DS18B20测温原理图
减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时,温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数。
如此循环直到减法计数器2计数到0时,停止温度寄存器的累加,此时温度寄存器中的数值就是所测温度值。
图4中的斜率累加器的输出用于修正减法计数器的预置值,只要计数器门仍未关闭就重复上述过程,直到温度寄存器值大致被测温度值。
另外,由于DS18B20单线通信功能是分时完成的,它有严格的时隙概念,因此读写时序很重要。
系统对DS18B20的各种操作按协议进行。
操作协议为:
初使化DS18B20(发复位脉冲)→发ROM功能命令→发存储器操作命令→处理数据。
2.2.4掉电保护电路
传统的数据记录方式是隔时采样或定时采样,没有具体的时间记录,因此只能记录数据而无法准确记录其出现的时间。
低功耗时钟芯片DS1302可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能。
同时可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。
DS1302内部结构图如图5所示。
图5DS1302内部结构图
DS1302是一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、日、时、分、秒进行计时,且具有闰年补偿功能,工作电压宽达2.5~5.5V。
采用三线接口与单片机进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源和后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。
3系统整体硬件电路
3.1主板电路
系统整体硬件电路包括:
传感器数据采集电路,温度和时间显示电路,上下限报警调整电路,单片机主板电路等,如图6所示。
图6单片机主板电路
单片机主板电路中有三个独立式按键可以调整温度计的上下限报警设置和数字钟时间校准,蜂鸣器可以在被测温度超出上下限范围内时,发出报警鸣叫声音,同时液晶显示屏LCD1604也将显示报警提示信息,这时可以调整报警上下限,从而测出被测的温度值。
单片机主板电路中的按健复位电路是上电复位加手动复位,使用比较方便,在程序跑飞时,可以手动复位,这样就不用在重起单片机电源,就可以实现复位。
3.2DS18B20与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源。
另一种是寄生电源供电方式,如图7所示单片机端口接单线总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉,上拉开启时间最大为10us。
采用寄生电源供电方式时VDD端接地。
由于单线制只有一根线,因此发送接口必须是三态的。
图7DS18B20与单片机的接口电路
3.3掉电充电电路
实时时钟电路DS1302是一种具有涓细电流充电能力的电路,采用32.768kHz晶振,可为掉电保护电源提供可编程的充电功能。
DS1302实时时钟电路如图8所示。
图8DS1302实时时钟电路
3.4系统整体硬件电路
图9系统整体硬件电路
4系统软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
4.1主程序
主程序的主要功能是负责温度和时间日历的实时显示,读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。
这样可以在一秒之内测量一次被测温度,其程序流程见图10所示。
图10主程序流程图图11读温度流程图
4.2读出温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。
其程序流程图如上图图11所示。
4.3温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。
温度转换命令子程序流程图如上图,图12所示。
图12温度转换流程图
4.4计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图13所示。
图13 计算温度流程图
4.5显示数据刷新子程序
显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高显示位为0时将符号显示位移入下一位。
程序流程图如图14。
图14 显示数据刷新流程图
5功能测试
5.1温度测试
1、用一只精度为0.1℃的水银温度计作对照标准,把它和温度传感器DS18B20一起放入同一杯冷水中,水银温度计读数为4.0℃,调节数字温度计电位器,使其显示值也为4.0℃,然后逐次向烧杯加热水改变水温,记下每次两只温度计的读数θ1(标准值)与θ2(测试值),其数据表格如表3所示。
表3温度数据列表
θ1/℃
4.0
10.2
16.3
22.7
31.8
43.0
51.8
57.4
65.6
70.6
78.0
θ2/℃
4.0
10.5
16.1
22.6
31.3
42.6
51.7
57.2
65.6
71.0
78.1
经对对照,两只温度计读数相差最大为0.5℃,平均相差仅有0.26℃。
总体上讲,符合设计要求。
2、通过按键key1键、key2键(增1键)和key3键(减1键)可任意设定温度的上下限报警功能,当所测温度超出设定的上下限温度范围,则液晶显示屏会产生报警提示。
5.2时间测试
1、本系统上电后,会以前一次的时间为基础显示同步时间,将此时间与北京时间相比,误差小于1秒钟,数字钟计时准确。
2、若按下key1键,年份开始闪动,表示可以通过key2键(增1键)和key3键(减1键)校整年份,若再按下key1键,则选择月份可以校整,日期、时分、秒、周均可通过key1键选定后经key2键(增1键)和key3键(减1键)进行校整。
经反复测试,本系统很好的完成了各项功能,完全符合系统设计要求。
6总结与体会
经过2周紧张的单片机课程设计,终于完成了基于单片机的数字温度计和数字钟的设计。
在这2周的课程设计中,有很多的心得体会,有关于单片机方面的,更多的是关于与人合作方面的。
在这次课程设计的整个过程中,我做了一次全面、较规范的设计练习,全面地温习了以前所学过的知识,用理论联系实际并结合单片机原理课程和解决实际问题,巩固、加深和扩展了有关单片机设计方面的知识。
尤其重要的是让我们养成了科学的习惯,在设计过程中一定要注意掌握设计进度,按预定计划完成阶段性的目标,在底图设计阶段,注意设计计算与结构设计画图交替进行,采用正确的设计方法。
在整个设计过程中注意对设计资料和计算数据的保存和积累,保持记录的完整性。
在课程设计的实践中进行了设计基本技能的训练,掌握了查阅和使用标准、规范、手册、图册、及相关技术资料的基本技能以及计算、数据处理等方面的能力。
在本次设计过程中,我也发现很多的问题,虽然以前学习并设计过简单单片机电路,但这次课程设计仍然让我学到了很多。
本次单片机课程设计重点就在于软件算法的设计及液晶显示,不仅需要巧妙的程序算法,而且需要一些单片机编程经验。
在编程设计过程中,遇到了许多困难,每当这个时候,我就再仔细检查几遍,如果自己仍然不能解决,就主动去找其他同学帮忙,相互讨论,相互学习,逐步解决遇到的一个个问题,最终完成整个系统的设计。
通过对通用89C52单片机机处理器铁电存储器芯片、常用元器件的设计,掌握了一般单片机设计的程序和方法,让我对整个单片机程序的设计,C语言有了一个比较深的理解。
从这次的课程设计中,我真正的意识到,在学习过程中理论联系实际的重要性。
只有把所学的理论知识用到实际当中,所学的知识才会有价值,学习单机片机更是如此,软件编程能力只有在经常的写与读的过程中才能得到提高,这是我在这次课程设计中的最大收获。
参考文献
[1] 全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品选编.北京 :
北京理工大学出版社,2007
[2]陈永真.全国大学生电子设计竞赛试题精解选.北京:
电子工业出版社,2007
[3]李朝青.单片机原理及接口技术.北京:
北京航空航天大学出版社,1998
[4]张琳娜,刘武发.传感检测技术及应用.北京:
中国计量出版社,1999
[5]李广弟.单片机基础.北京:
北京航空航天大学出版社,1994
[6]李建民.单片机在温度控制系统中的应用.江汉大学学报,1996
[7] AT89S52DATASHEEPPhilipsSemiconductors,1999
[8] ATechnicalTutorialonDigitalSignalSynthesis.AnalogDeviceInc.,1999
[9] K.Alexander,SadikuFundamentalsofelectricCircuits,2000
附录
1实物图
2主程序
/**********************************************/
/**********时钟日历显示温度控制器**************/
/******************2009/1/6*********************/
/**********************************************/
#include
#include
#include
#defineLCM_RSP2_0//1602定义引脚
#defineLCM_RWP2_1
#defineLCM_EP2_2
#defineLCM_DataP0
#defineBusy0x80//用于检测LCM状态字中的Busy标识
#defineucharunsignedchar
ucharid,timecount,dipsmodid;
bitlmcinit_or_not;
bitflag,sflag;//flag是时钟冒号闪烁标志,sflag是温度负号显示标志
voidDisp_line1(void);//显示屏幕第一行
voidDisp_line2(void);//显示屏幕第二行
voidDisp_line3(void);//显示屏幕第二行
voidDisp_line4(void);//显示屏幕第二行
voidid_case1_key();
voidDispmod_id_case_key(void);//选择显示模式
voidDisp_mod0(void);//显示模式0
voidDisp_mod1(void);//显示模式1