《基于单片机的温度传感器电子设计论文.doc》由会员分享,可在线阅读,更多相关《基于单片机的温度传感器电子设计论文.doc(41页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、上海第二工业大学 机器人2课程设计 机器人2课程设计题 目: 基于单片机的温度传感器学 号:20134823091,20134823143,20134823188 姓 名:_王秀峰、付帅、雷强 班 级: 13自动C1 专 业:自动化专业 _学 院:工学部 _入学时间: 2013.9 _指导教师: 马良伟 _日 期: 2015年6 月 1日摘要该系统是设计一个能在液晶屏幕上显示当前日期和温度的单片机控制系统。本设计多功能数字始终系统是由中央控制器、始终系统、温度检测器、显示器和键盘部分主成。控制器采用单片机AT89C52,温度检测部分采用DS18B20温度传感器,其温度测量范围为55125,精确
2、到0.5。数字温度计所测量的温度采用数字显示时钟系统采用时钟芯片DS1302,用LCD液晶1602作为显示器。关键词:传感器;控制器;显示器;时钟芯片目录1绪论11.1设计目的及意义11.2设计任务11.3设计系统的主要功能12系统总体方案及硬件设计22.1系统总体方案22.2系统设计总框图22.3硬件设计22.3.1单片机最小系统设计22.3.2 时钟电路42.3.3报警电路设计52.3.4 LCD1602液晶屏介绍及电路62.3.5 DS18B20温度传感器介绍及电路设计83.软件设计153.1主程序流程图153.2定时中断子程序流程图173.3 DS18B20程序流程图173.4程序设计
3、204设计总结和感悟21参考文献23附录241绪论1.1设计目的及意义学习并使用单片机才能使自己学过的知识得到巩固,有更深层次的理解,使用各种传感器的同时还能加强对传感器的认识,在完成电子设计的同时还能学到很多的电子技术的知识。学会独立深入的思考,提高自己的自学能力和独立分析问题的能力,把理论知识运用到实际的问题当中,做到学以致用,同时培养科学严谨的态度。1.2设计任务本文设计的基于STC89C52单片机温度时间显示器 采用STCT89C52单片机,月、日、时、分、秒、星期、温度等信息使用LCD1602液晶屏显示。本系统共有7种模式,在电路中通过四个按键key1、key2、key3和key4来
4、进行模式选择1.3设计系统的主要功能(1)能显示时分秒星期温度模式。(2)利用key1-4修改时间,进行模式选择。2系统总体方案及硬件设计2.1系统总体方案(1)由于LED1602液晶显示屏体积较小、功耗低、显示操作简单,得到广泛的使用,本设计的显示内容在LCD1602上进行输出。(2)时间的定时用单片机的定时器中断。修改时间和闹钟手动按键控制,报警声通过蜂鸣器发出。这样可以使得硬件电路设计较为简单,且软件设计也易于实现,并能够降低成本。(3)核心控制器采用STC89C52单片机,该芯片稳定性高,操作简单,功能强、通用性好、价格便宜,且易于控制。加上外围器件(数码管、排阻、按键和蜂鸣器)和应用
5、程序,便构成了相应的应用系统。2.2系统设计总框图(如图1所示)图1系统设计总框图2.3硬件设计2.3.1单片机最小系统设计(1)芯片:STC89C52STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案,所以本设计采用该芯片。具有以下标准功能: 8k字节Flash,512字节RAM, 32 位I/O
6、 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,3个16 位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外 STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。图2 STC89C52单片机引脚图STC89C52管脚说明如下:供电电压端。:接地端。P0口:P0口为三态双向口,能
7、带8个TTL电路。P1口:P1口是一个内部带上拉电阻的8位准双向I/O口(使用前有一个准备动作),负载能力为4个TTL电路。在FLASH编程和校验时,P1口作为第八位地址接收。P2口:P2口为一个内部带上拉电阻的8位准双向I/O口,P2口缓冲器可接收、输出4个TTL门电流。P3口:P3口是一个内部带上拉电阻的准双向I/O口,可接收输出4个TTL门电流。:为复位信号输入端。当振荡器复位器件时,要保持RST脚两个机器周期(24个时钟周期)以上的高电平时间。:为地址锁存允许信号,当访问外部存储器时,用来锁存口送出的低8位地址信号。:外部程序存储器的读选通信号。在由外部程序存储器取指期间,产生负脉冲做
8、为外部的选通信号,每个机器周期两次有效。 :访问外部程序存储器控制信号。:晶体振荡电路的反向器输入端。:晶体振荡电路的反向器输出端。2.3.2 时钟电路(1)单片机的时钟产生方法有两种: 内部时钟方式和外部时钟方式。 本系统中AT89C51单片机采用内部时钟方式。最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。振荡晶体可在1.2MHz12MHz之间。电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF100pF之间取值。STC89C52单片机的时钟电路如图3所示。图3 STC89C52单片机的时钟电路(2) 复位电路复位是单片机的初
9、始化操作。单片机系统在上电启动运行时,都需要先复位。其作用是使CPU和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。单片机的外部复位电路有上电自动复位和按键手动复位两种。本系统中STC89C52单片机采用上电加按键手动复位电路,如图4所示。图4 STC89C52单片机的复位电路2.3.3报警电路设计为实现设计的定时闹钟系统在定时时间到时发出报警声,采用蜂鸣器作为报警发声装置。在本设计中有多种报警声可供选择,可选择报警时播放音乐。报警电路设计如图5所示。图5报警电路2.3.4 LCD1602液晶屏介绍及电路本系统采用LCD1602液晶屏显示时间、温度、留言等信息,本次使用的LCD
10、1602液晶为5V电压驱动,带背光,可显示两行,每行16个字符,不能显示汉字,内置含128个字符的ASII字符集字库,只有并行接口,无串行接口。(1)液晶显示器液晶是一种高分子材料,因为其特殊的物理、化学、光学特性,20世纪中叶开始广泛应用在轻薄显示器上。液晶显示器的主要原理是以电流刺激液晶分子产生点、线、面并配合背景灯管构成的画面。为叙述简便,通常把各种液晶显示器都直接叫做液晶。1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如图6所示图6 带背光与不带背光尺寸差别1602LCD主要技术参数:显示容量:1
11、62个字符芯片工作电压:4.55.5V工作电流:2.0mA(5.0V)模块最佳工作电压:5.0V字符尺寸:2.954.35(WH)mm引脚功能说明1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表二所示:表1 LCD1602引脚说明编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极第1脚:VSS为地电源。第2脚:VDD接5V正电源。第3脚:VL为液晶显示器
12、对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第714脚:D0D7为8位双向数据线。第15脚:背光源正极。第16脚:背光源负极。(2) 硬件原理图1602液晶显示模块
13、可以和单片机STC89C52直接接口,电路如图7所示。图7 LCD1602硬件原理图2.3.5 DS18B20温度传感器介绍及电路设计单总线数字温度传感器芯片DS18B20是美国DALLAS半导体公司(现已并入MAXIM公司)于20世纪90年代新推出的一种串行总线技术。该技术只需要一根信号线(将计算机的地址线、数据线、控制线合为一根信号线)便可完成串行通信。单根信号线,既传输时钟,又传输数据,而且数据传输是双向的,在信号线上可挂上许多测控对象,电源也由这根信号线供给,所以在单片机的低速(约100kbps以下的速率)测控系统中,使用单根总线技术可以简化线路结构,减少硬件开销(1)DS18B20温
14、度传感器特性适应电压范围宽,电压范围在3.05.5V,在寄生电源方式下可由数据线供电。独特的单线接口方式,它与微处理器连接在一起的时仅需要一条口线即可实现微处理器与DS18B20的双向通信。支持多点组网功能,多个DS18B20可以并联在唯一的三条线上,实现组网多点测温。在使用中不需要任何外围元件,全部传感器元件及转换电路集成在形如一只三极管的集成电路内。测温范围-55C+125C,在-10C +85C时精度为0.5C。可编程分辨率为912位,对应的可分辨温度分别为0.5C,0.25C,0.125C和0.0625C,可实现高精度测温。在9位分辨率时,最多在93.75ms内把温度转换为数字;12位
15、分辨率时,最多在750ms内把温度转换为数字,显然速度更快。测量温度结果直接输出数字温度信号,以“一线总线”串行传送给CPU,同时可传送CRC检验码,具有极强的抗干扰纠错能力。负压性。电源极性接反时,芯片不会因发热二烧毁,但不能正常工作。(2)工作原理DS18B20的测温原理如图8所示,图中低温度系数晶振的振荡频率受温度的影响很小,用于产生固定频率的脉冲信号送给减法计数器1,高温度系数晶振随温度变化其震荡频率明显改变,所产生的信号作为减法计数器2的脉冲输入,图中还隐含着计数门,当计数门打开时,DS18B20就对低温度系数振荡器产生的时钟脉冲后进行计数,进而完成温度测量。计数门的开启时间由高温度
16、系数振荡器来决定,每次测量前,首先将-55 所对应的基数分别置入减法计数器1和温度寄存器中,减法计数器1和温度寄存器被预置在 -55 所对应的一个基数值。减法计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当减法计数器1的预置值减到0时温度寄存器的值将加1,减法计数器1的预置将重新被装入,减法计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到减法计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图2中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正减法计数器的预置值,只要计数门仍未关闭就重复上述过程,直至温度寄存器值达到被测温度值
17、,这就是DS18B20的测温原理。另外,由于DS18B20单线通信功能是分时完成的,他有严格的时隙概念,因此读写时序很重要。系统对DS18B20的各种操作必须按协议进行。操作协议为:初始化DS18B20(发复位脉冲)发ROM功能命令发存储器操作命令处理数据。图8 DS18B20的测温原理(3)DS18B20工作过程及时序DS18B20内部的低温度系数振荡器是一个振荡频率随温度变化很小的振荡器,为计数器1提供一频率稳定的计数脉冲。高温度系数振荡器是一个振荡频率对温度很敏感的振荡器,为计数器2提供一个频率随温度变化的计数脉冲。初始时,温度寄存器被预置成-55,每当计数器1从预置数开始减计数到0时,
18、温度寄存器中寄存的温度值就增加1,这个过程重复进行,直到计数器2计数到0时便停止。初始时,计数器1预置的是与-55相对应的一个预置值。以后计数器1每一个循环的预置数都由斜率累加器提供。为了补偿振荡器温度特性的非线性性,斜率累加器提供的预置数也随温度相应变化。计数器1的预置数也就是在给定温度处使温度寄存器寄存值增加1计数器所需要的计数个数。DS18B20内部的比较器以四舍五入的量化方式确定温度寄存器的最低有效位。在计数器2停止计数后,比较器将计数器1中的计数剩余值转换为温度值后与0.25进行比较,若低于0.25,温度寄存器的最低位就置0;若高于0.25,最低位就置1;若高于0.75时,温度寄存器
19、的最低位就进位然后置0。这样,经过比较后所得的温度寄存器的值就是最终读取的温度值了,其最后位代表0.5,四舍五入最大量化误差为1/2LSB,即0.25。温度寄存器中的温度值以9位数据格式表示,最高位为符号位,其余8位以二进制补码形式表示温度值。测温结束时,这9位数据转存到暂存存储器的前两个字节中,符号位占用第一字节,8位温度数据占据第二字节。DS18B20测量温度时使用特有的温度测量技术。DS18B20内部的低温度系数振荡器能产生稳定的频率信号;同样的,高温度系数振荡器则将被测温度转换成频率信号。当计数门打开时,DS18B20进行计数,计数门开通时间由高温度系数振荡器决定。芯片内部还有斜率累加
20、器,可对频率的非线性度加以补偿。测量结果存入温度寄存器中。一般情况下的温度值应该为9位,但因符号位扩展成高8位,所以最后以16位补码形式读出。DS18B20工作过程一般遵循以下协议:初始化ROM操作命令存储器操作命令处理数据 初始化单总线上的所有处理均从初始化序列开始。初始化序列包括总线主机发出一复位脉冲,接着由从属器件送出存在脉冲。存在脉冲让总线控制器知道DS1820 在总线上且已准备好操作。 ROM操作命令一旦总线主机检测到从属器件的存在,它便可以发出器件ROM操作命令之一。所有ROM操作命令均为8位长。这些命令列表如下:Read ROM(读ROM)33h此命令允许总线主机读DS18B20
21、的8位产品系列编码,唯一的48位序列号,以及8位的CRC。此命令只能在总线上仅有一个DS18B20的情况下可以使用。如果总线上存在多于一个的从属器件,那么当所有从片企图同时发送时将发生数据冲突的现象(漏极开路会产生线与的结果)。Match ROM( 符合ROM)55h此命令后继以64位的ROM数据序列,允许总线主机对多点总线上特定的DS18B20寻址。只有与64位ROM序列严格相符的DS18B20才能对后继的存贮器操作命令作出响应。所有与64位ROM序列不符的从片将等待复位脉冲。此命令在总线上有单个或多个器件的情况下均可使用。Skip ROM( 跳过ROM )CCh在单点总线系统中,此命令通过
22、允许总线主机不提供64位ROM编码而访问存储器操作来节省时间。如果在总线上存在多于一个的从属器件而且在Skip ROM命令之后发出读命令,那么由于多个从片同时发送数据,会在总线上发生数据冲突(漏极开路下拉会产生线与的效果)。Search ROM( 搜索ROM)F0h当系统开始工作时,总线主机可能不知道单线总线上的器件个数或者不知道其64位ROM编码。搜索ROM命令允许总线控制器用排除法识别总线上的所有从机的64位编码。Alarm Search(告警搜索)ECh此命令的流程与搜索ROM命令相同。但是,仅在最近一次温度测量出现告警的情况下,DS18B20才对此命令作出响应。告警的条件定义为温度高于
23、TH 或低于TL。只要DS18B20一上电,告警条件就保持在设置状态,直到另一次温度测量显示出非告警值或者改变TH或TL的设置,使得测量值再一次位于允许的范围之内。贮存在EEPROM内的触发器值用于告警。 存储器操作命令Write Scratchpad(写暂存存储器)4Eh这个命令向DS18B20的暂存器中写入数据,开始位置在地址2。接下来写入的两个字节将被存到暂存器中的地址位置2和3。可以在任何时刻发出复位命令来中止写入。Read Scratchpad(读暂存存储器)BEh这个命令读取暂存器的内容。读取将从字节0开始,一直进行下去,直到第9(字节8,CRC)字节读完。如果不想读完所有字节,控
24、制器可以在任何时间发出复位命令来中止读取。Copy Scratchpad(复制暂存存储器)48h这条命令把暂存器的内容拷贝到DS18B20的E2存储器里,即把温度报警触发字节存入非易失性存储器里。如果总线控制器在这条命令之后跟着发出读时间隙,而DS18B20又正在忙于把暂存器拷贝到E2存储器,DS18B20就会输出一个“0”,如果拷贝结束的话,DS18B20 则输出“1”。如果使用寄生电源,总线控制器必须在这条命令发出后立即起动强上拉并最少保持10ms。Convert T(温度变换)44h这条命令启动一次温度转换而无需其他数据。温度转换命令被执行,而后DS18B20保持等待状态。如果总线控制器
25、在这条命令之后跟着发出读时间隙,而DS18B20又忙于做时间转换的话,DS18B20将在总线上输出“0”,若温度转换完成,则输出“1”。如果使用寄生电源,总线控制器必须在发出这条命令后立即起动强上拉,并保持500ms。Recall E2(重新调整E2)B8h这条命令把贮存在E2中温度触发器的值重新调至暂存存储器。这种重新调出的操作在对DS18B20上电时也自动发生,因此只要器件一上电,暂存存储器内就有了有效的数据。在这条命令发出之后,对于所发出的第一个读数据时间片,器件会输出温度转换忙的标识:“0”=忙,“1”=准备就绪。Read Power Supply(读电源)B4h对于在此命令发送至DS
26、18B20之后所发出的第一读数据的时间片,器件都会给出其电源方式的信号:“0”=寄生电源供电,“1”=外部电源供电。 处理数据DS18B20的高速暂存存储器由9个字节组成,其分配如图3所示。当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。单片机可通过单线接口读到该数据,读取时低位在前,高位在后。 图9 高速暂存存储器分配图上表是DS18B20温度采集转化后得到的12位数据,存储在DS18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于或等于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0
27、,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。(4)引脚介绍图10 DS18B20 To-92表2 DS18B20引脚定义引脚定义GND电源负极DQ信号输入输出Vcc电源正极3.软件设计3.1主程序流程图图11 主函数流程图3.2定时中断子程序流程图图12 定时中断子程序流程图3.3 DS18B20程序流程图(1)读温度主程序 读温度主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每500ms进行一次。图13 温度主函数流程图(2)读出温度子程序读出温度子程序的主要功能是读出RAM中的9字节,在读出时需要CRC校验,校验有错时
28、不进行温度数据的改写。如图13所示(3)温度转换命令子程序温度转换命令子程序主要是发温度转换开始命令。如图14所示(4)计算温度子程序计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定。如图15所示(5)显示数据刷新子程序显示数据刷新子程序主要是对分离后的温度显示数据进行刷新操作,当标志位为1时将符号显示位移入第一位。如图16所示 图14 读温度流程图 图15 温度转换流程图图16 计算温度流程图 图17 显示数据刷新流程图3.4程序设计根据程序流程图采用C语言进行程序设计,除主程序外还有2个模块化程序如下。(程序源代码见附录1)(1)主函数程序设计(2)DS18B2
29、0温度读取程序设计(3)LCD1602液晶显示程序设计4设计总结和感悟通过这次的课程设计,使我们更加扎实的掌握了有关电子设计方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露了前期我们在这方面的知识欠缺和经验不足。实践出真知,通过亲手制作,使我们掌握的知识不再是纸上谈兵。过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检验修改环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在我们的不懈的努力下,终于迎刃而解。在今后社会的发展和学习实
30、践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可! 课程设计不仅是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我们许多道,给了我很多思路,给了我们莫大的空间。同时,设计让我我们感触很深。使我对抽象的理论有了具体的认识。我们认为,在这课程设计中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。更重要的是,在课程设计过程中,我们学会了很多学习
31、的方法。而这是日后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。这对于我们的将来也有很大的帮助。以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。就像中国提倡的艰苦奋斗一样,我们都可以在课程设计结束之后变的更加成熟,会面对需要面对的事情。 回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相
32、结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,但可喜的是最终都得到了解决。此次设计也让我们明白了思路即出路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。总之,认真对待每一个学习的机会,珍惜过程中的每一分一秒,学到最多的知识和方法,锻炼自己的能力,这个是我们在在本次课程设计中学到的最重要的东西,以后也将受益匪浅的!参考文献1栾桂冬等.传感器及其应用 西安:电子科技大学出版社 2002年2何希才,薛永毅.传感器及其应用实例M 北京:机械工业出版社
33、 2001年3何立民.单片机应用技术大全.北京:北京航空航天大学出版社,19944张智,邹智荣.基于单片机的日光室温控制系统设计 微计算机信息 2006年5谭浩强.单片机课程设计.北京:清华大学出版社,1989年6杨俊华,黄明辉基于80C196单片机的温度检测及显示系统,机械与电子2003年7 23附录附录1:源程序代码(1) C语言程序#include#includeDS18B20.h#includeLCD1602.hsbit key1=P20;sbit key2=P21;sbit key3=P22;sbit key4=P23;sbit Buzz=P37;uchar Key_Value=0;
34、uchar times,SecondFlag;uchar Month=01,Day=01;Hour=00,Minute=00,Second=00,Week;uchar code S_Week=4; /2015年1月1号星期四uchar code Day_Month12=31,28,31,30,31,30,31,31,30,31,30,31;void LcdDisplayTemp(uchar x,uchar y,int temp);void LcdDisplayTime();void Key_Scan();void RefreshTime();void RefreshWeek();void Ti
35、me_Init() /50毫秒11.0592MHzTMOD=0x01; /定时器工作方式1TH0=0x4c; /定时50msTL0=0x00;EA=1; /打开总中断ET0=1; /打开定时器0中断TR0=1; /打开定时器0void Timer0Interrupt(void) interrupt 1TH0=0x4c;TL0=0x00;TR0=1;times+;if(times=20)times=0;Second+;SecondFlag=1;void main()Buzz=0;LcdInit(); /初始化LCD1602Time_Init(); /初始化定时器/*显示时间相关符号*/Show
36、Char(2,0,-);Show Char(5,0, );ShowChar(8,0,:);ShowChar(11,0,:);RefreshTime();/*显示温度相关符号*/ShowString(2,1,T:);ShowChar(11,1,223); ShowChar(12,1,C);key1=1;key2=1;key3=1;key4=1;while(1)if(times=10) LcdDisplayTemp(4,1,ReadTemperature();LcdDisplayTime();Key_Scan();ShowNum(14,1,Key_Value);/*刷新时间*/void Refre
37、shTime()ShowNum(12,0,Second);ShowNum(9,0,Minute);ShowNum(6,0,Hour);ShowNum(3,0,Day);ShowNum(0,0,Month);RefreshWeek();/*刷新星期*/void RefreshWeek()unsigned char i;unsigned int Days;Days=0;if(Month!=1)for(i=0;i28) Day=28;if(Month=4|Month=6|Month=9|Month=11) if(Day30) Day=30;break;if(!key4)LCD1602_Delay1m
38、s(100);switch(Key_Value)case 1:if(Second=0) Second=59;else Second-;break;case 2:if(Month=0) Minute=59;else Minute-;break;case 3:if(Hour=0) Hour=23;else Hour-;break;case 4:Day-;if(Day=0)if(Month=2) Day=28;if(Month=4|Month=6|Month=9|Month=11) Day=30;if(Month=1|Month=3|Month=5|Month=7|Month=8|Month=10|
39、Month=12) Day=31;break;case 5:if(Month=1) Month=12;else Month-;if(Month=2)if(Day28) Day=1;if(Month=4|Month=6|Month=9|Month=11) if(Day30) Day=1;break;RefreshTime();Buzz=0;/*温度显示*/void LcdDisplayTemp(uchar x,uchar y,int temp)float tp;LcdWriteCom(0x80+x+y*0x40);if(temp0)LcdWriteData(-);temp=temp-1;temp=temp;tp=temp;elseLcdWriteData(+);tp=temp;temp=tp*0.0625*100+0.5;LcdWriteData(0+temp / 10000); LcdWriteData(0+temp % 10000 / 1000); LcdWriteData(0+temp % 1000 / 100); LcdWriteData(.); LcdWriteData(0+temp %
限制150内