热水器控制器(软件)-大学毕业设计.doc
金 华 职 业 技 术 学 院J I N H U A P O L Y T E C H N I C毕业教学环节成果 (2014届)题 目 热水器控制器(软件)学 院 信息工程学院 专 业 电气自动化技术 2014年 5月 20日金华职业技术学院毕业教学成果 目 录摘 要1英文摘要1引言21 方案选择与论证21.1控制器方案选择21.2 显示方案选择22 硬件设计32.1 硬件结构32.2 温度采集电路设计33 软件总设计43.1 控制软件总设计43.2 中断程序设计63.3 按键设计73.3.1功能按键设计73.3.2上调按键功能设计83.3.3下调按键功能设计103.4 DS18B20温度测量设计113.5 LCD1602液晶程序设计133.5.1 1602液晶初始化程序设计133.5.2 LCD写命令程序设计153.5.3 LCD写数据程序设计163.5.4 LCD检测忙碌程序设计164调试与仿真18结论与谢辞21参考文献22附件1.硬件电路图23附件2.程序清单24热水器控制器(软件)摘 要:本设计是以AT89C51为核心的热水器控制器。以温度传感器DS18B20作为温度采集器,DS1302作为实时时间控制元件,使该控制器具有定时开机关机功能,方便用户使用。同时该控制器具有在一定温度范围内自动加热功能。文中详细介绍了软件设计部分,主要有:时间控制模块、温度采集程序设计模块、按键程序设计模块、显示程序设计模块等。实践证明该系统具有价格低廉,抗干扰性好,结构简单,操作方便等特点,对其他类似系统有一定的借鉴作用。关键词:AT89C51单片机 DS18B20温度采集芯片 温度控制 Water Heater Controller(software)Abstract:This design is the water heater controller based on AT89C51. The temperature sensor DS18B20 as the temperature collector, DS1302 as the real time control element, so that the controller has the timing on-off function, user-friendly. At the same time, the controller with automatic heating function in a certain temperature range. This paper introduces in detail the software design part, mainly has: time control module, temperature acquisition program design module, key program design module, display module program design. The practice proves that the system has the advantages of low cost, good anti-interference performance, simple structure, convenient operation, and has certain reference function to other similar systems.Keywords: AT89C51 microcontroller DS18B20 temperature acquisition core temperature control引言热水器是一种可供浴室,洗手间及厨房使用的家用电器。目前市场上热水器主要品种有电热水器、太阳能热水器、燃气热水器。在生活中热水器的使用与温度息息相关。温度高了就需要降温,温度低了要提高温度。因此温度的控制就非常的重要,因此研究温度的控制器也有重要的意义。测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:1.传统的分立式温度传感器;2.模拟集成温度传感器;3.智能集成温度传感器。目前,国际上新型温度传感器正从模拟式转向数字式,从集成化向智能化、网络化的方向飞速发展。本论文阐述了智能集成温度传感器DS18B20的结构特征及控制方法,用温度传感器DS18B20、AT89C51单片机为控制器构成温度控制器装置的工作原理做了详细介绍。1 方案选择与论证1.1控制器方案选择方案1:采用FPGA(现场可编程门阵列)作为系统的控制器。FPGA 可以实现系统的各种复杂的逻辑功能,规模大,密度高,它将所有的器件集成在一块芯片上,减小了体积,提高了稳定性,并且可以利用EDA 软件仿真、调试,易于进行功能扩展。FPGA 采用并行的输入方式,提高了系统的处理速度,适合作为大规模实时系统的控制核心。但是由于本设计对数据处理的速度要求不是很高,FPGA 高速处理的优势得不到充分的体现,并且由于其集成度高,使其成本偏高,同时由于芯片的引脚较多,实物硬件电路板布线复杂,加重了电路设计和实际焊接的操作。 方案2:采用ATMEL 公司的AT89C51 作为系统的控制器。单片机算术运算功能强,软件编程灵活,自由度大,可用软件编程实现各种算法,并且具有功耗低,体积小,技术成熟,成本低廉等有点,使其在各个领域应用广泛。 综上所述介绍中由于设计对数据处理的速度要求不是很高。FPGA 比AT89C51的成本高,AT89C51单片机算术运算功能强,软件编程灵活,自由度大。所以选择方案2。1.2 显示方案选择 方案1:LCD显示LCD 液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点,在袖珍式仪表和低功耗应用系统中得到广泛的应用。目前字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件。LCD1602液晶显示模块,它可以显示两行,每行16个字符,采用单+5V电源供电,外围电路配置简单,价格便宜,具有很高的性价比。 方案2:LED显示LED 数码管有静态显示和动态显示2种,静态显示不用另加外界驱动直接与单片机输出口相连,不需要单独的程序来完成显示;动态显示需加外部驱动以此增加输出电流来更好的驱动数码管显示,电路简单,成本稍高,需要特定的编程来完成动态刷新。从上述的比较中LCD更符合设计的需求。2 硬件设计2.1 硬件结构设计要求热水器控制器要有定时开机、定时关机等功能的时钟电路,要求能测量温度的温度采集电路,测量出的温度要显示在液晶显示屏上的显示电路,要有控制键能控制温度的按键电路,有加热指示的加热指示电路。图2-1 系统硬件框图2.2 温度采集电路设计DS18B20数字温度传感器接线方便,封装成后可应用于多种场合,如管道式,螺纹式,磁铁吸附式,不锈钢封装式,型号多种多样,有LTM8877,LTM8874等等。主要根据应用场合的不同而改变其外观。封装后的DS18B20可用于电缆沟测温,高炉水循环测温,锅炉测温,机房测温,农业大棚测温,洁净室测温,弹药库测温等各种非极限温度场合。耐磨耐碰,体积小,使用方便,封装形式多样,适用于各种狭小空间设备数字测温和控制领域。根据DS18B20的通讯协议,主机控制DS18B20完成温度转换必须经过三个步骤:(1)每一次读写之前都要对DS18B20进行复位,复位成功后发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20进行预定的操作。(2)复位要求主CPU将数据线下拉500微秒,然后释放,DS18B20收到信号后等待1660微秒左右,后发出60240微秒的存在脉冲。(3)主CPU收到此信号表示复位成功。特点独特的一线接口,简化了分布式温度传感应用无需外部元件可用数据总线供电,电压范围为3.0V至5.5V无需备用电源 测量温度范围为-55至+125。相当于华氏的67°F到257华氏度。-10 至+85范围内精度为±0.5 。3 软件总设计在此设计中要实现热水器控制器具有定时开机、定时关机等功能,实现测量的温度范围可以在055,误差在2度范围内。用LCD显示。主要包括温度测量模块、LCD液晶显示模块、定时开关模块、按键控制模块。最主要的程序是温度测量和LCD液晶显示部分和按键控制。3.1 控制软件总设计主程序它判断输入的数据是否符合要求。当数据符合要求时则进行下一步的步骤,当所有的数据要求都符合时则加热,当数据不符合要求时则停止加热。开始调用液晶初时化函数,调用初始化DS1302时钟芯片函数调用定时器函数调用键盘处理程序判断当前时间是否大于开机时间如果是判断是否大于关机时间,否则停止加热。判断当前时间是否大于关机时间如果是则停止加热,否的话则判断当前温度是否下限温度如果是则判断当前温度是否小于55度,否的话则停止加热。判断当前温度是否小于55度如果是则加热,否的话则停止加热。实行加热开始则回到键盘处理程序停止加热回到键盘程序,是一个死循环。 图3-1主流程图while(1) /无限循环下面的语句: keyscan(); /调用键盘扫描子函数if(fen>=kf) /当前时间分大于开机时间分 if(shi>=ks) /当前时间小时大于开机时间的小时 if(flag<=sw&&flag<=55)/当前温度小于下限温度55度 led=0; / /灯亮 else led=1; /等灭 if(shi>=gs)/ 当前时间小时大于关机时间小时 led=1; /灯灭 if(shi=gs) /当前时间小时等于关机时间小时 if(fen>=gf) /当前时间分大于关机时间分 led=1; /灯灭 3.2 中断程序设计因为要读取当前温度和当前时间,在主程序里没有读取当前温度和当前时间的功能功能。所以要有中断程序。开始读当前温度,读当前时间,显示当前时间,显示当前开机时间,显示当前温度和下限温度,显示开机时间后显示当前温度和下限温度,显示关机时间后返回。图3-2 中断流程图3.3 按键设计本次设计总共设计了3个按键,分别是功能按键,上调按键,下调按键。它们用于切换调节LCD上显示的内容。3.3.1功能按键设计按键1是设置功能键。用于切换光标位置。按下按键1延时抖动,再次按下按键1等待按键释放。按键1被按则按键循环加1。当按键是第1次时关中断器将光标移动到当前时间的时的位置上,光标闪烁并返回。当按键是第2次时将光标移动到当前时间的分的位置上,光标闪烁并返回。当按键是第3次时将光标移动到开机时间时的位置上,光标闪烁并返回。当按键是第4次时将光标移动到开机时间分的位置上,光标闪烁并返回。当按键是第5次时将光标移动到当前温度的位置上,光标闪烁并返回。当按键是第6次时将光标移动到设定温度的位置上,光标闪烁并返回。当按键是第7次时将光标移动到关机时间时的位置上,光标闪烁并返回。当按键是第8次时将光标移动到关机时间分的位置上,光标闪烁并返回。当按键是第9次时光标不闪烁,打开定时器并返回。 图3-3 功能按键流程图3.3.2上调按键功能设计按键2是设置上调键。用于上调光标所在位置上的数字。当时间的小时大于24时则数字归零当分大于60是则分的数字归零当温度大于55度时则不能上调。按下按键2延时抖动,再次按下按键2等待按键释放。按键2被按则按键循环加1。当按键是第1次时光标在当前时间时的位置上,加小时值判断是否到24小时,是则小时为0,送入液晶显示,否的话送入液晶显示。将当前小时重置写入DS1302并返回。当按键是第2次是光标在当前时间分的位置上,加分值判断是否到60分,是则分为0,送入液晶显示,否的话送入液晶显示。将当前分重置写入DS1302并返回。当按键是第3次时光标在当前时间秒的位置上,加分值判断是否到60秒,是则分为0,送入液晶显示,否的话送入液晶显示。将当前分重置写入DS1302并返回。当按键是第4次时光标在开机时间时的位置上,加小时值判断是否到24小时,是则小时为0,送入液晶显示,否的话送入液晶显示。将开机小时重置写入DS1302并返回。当按键是第5次时光标在开机时间分的位置上,加分值判断是否到60分,是则分为0,送入液晶显示,否的话送入液晶显示。图3-4 上调按键流程图将开机的分重置写入DS1302并返回。当按键是第6次时光标在当前温度位置上,加温判断是否到55度,温度为55度时,送入液晶显示。将当前温度重置写入DS1302并返回。当按键是第7次时光标在设定温度位置上,加温判断是否到55度,是温度为55度,送入液晶显示。否的话送入液晶显示。将设定温度重置写入DS1302并返回。当按键是第8次时光标在关机时间时的位置上,加小时值判断是否到24小时,是则小时为0,送入液晶显示,否的话送入液晶显示。将关机小时重置写入DS1302并返回。当按键是第9次时光标在关机时间分的位置上,加分值判断是否到60分,是则分为0,送入液晶显示,否的话送入液晶显示。将关机分重置写入DS1302并返回。3.3.3下调按键功能设计按键3是设置下调键。用于下调光标所在位置的数字当=-1是则归零。按下按键3延时抖动,再次按下按键3等待按键释放。按键3被按 则按键循环加1。当按键是第1次时光标在当前时间时的位置上,加小时值判断是否到-1小时,是则小时为0,送入液晶显示,否的话送入液晶显示。将当前小时重置写入DS1302并返回。当按键是第2次是光标在当前时间分的位置上,加分值判断是否到-1分,是则分为0,送入液晶显示,否的话送入液晶显示。将当前分重置写入DS1302并返回。当按键是第3次是光标在当前时间秒的位置上,加分值判断是否到-1秒,是则秒为0,送入液晶显示,否的话送入液晶显示。将当前分重置写入DS1302并返回。当按键是第4次是光标在当前时间秒的位置上,加分值判断是否到-1秒,是则分为0,送入液晶显示,否的话送入液晶显示。将当前分重置写入DS1302并返回。当按键是第5次时光标在开机时间时的位置上,加小时值判断是否到-1小时,是则小时为0,送入液晶显示,否的话送入液晶显示。将开机小时重置写入DS1302并返回。当按键是第6次时光标在开机时间分的位置上,加分值判断是否到-1分,是则分为0,送入液晶显示,否的话送入液晶显示。将开机分重置写入DS1302并返回。当按键是第7次时光标在当前温度位置上,加温判断是否到-1度,是温度为0度,送入液晶显示。否的话送入液晶显示。将当前温度重置写入DS1302并返回。当按键是第8次时光标在设定温度位置上,加温判断是否到-1度,是温度为0度,送入液晶显示。否的话送入液晶显示。将设定温度重置写入DS1302并返回。当按键是第9次时光标在关机时间时的位置上,加小时值判断是否到-1小时,是则小时为0,送入液晶显示,否的话送入液晶显示。将关机小时重置写入DS1302并返回。图3-5 下调按键流程图3.4 DS18B20温度测量设计设计要求温度显示不大与55度,当温度大于55度时,程序停止加热,并且要求温度误差在2度范围内。所以选择DS18B20温度传感器。DS18B20 数字式温度传感器,与传统的热敏电阻有所不同的是,使用集成芯片,采用单总线技术,其 能够有效的减小外界的干扰,提高测量的精度,同时,它可以直接将被测温度转化成串行数字信号供微机处理,接口简单,使数据传输和处理简单化。 部分功能电路的集成,使总体硬件设计更简洁,能 有效地降低成本,搭建电路和焊接电路时更快,调试也更方便简单化,这也就缩短了开发的周期 。 DS18B20 中的温度传感器用于完成对温度的测量,它的测量精度可以配置成 9 位,10 位,11 位或 12 位 4 种状态。温度传感器在测量完成后将测量的结果存储在 DS18B20 的两个 8BIT 的 RAM 中,单片机可通过单线接口读到该数据,读取时低位在前,高位在后数据的存储格式如下表(以 12 位转化为例): 图3-6 温度信号寄存器格式图 这是 12 位转化后得到的 12 位数据,存储在 18B20 的两个 8 比特的 RAM 中,二进制中的前面 5 位是符号位,如果测得的温度大于 0 ,这 5 位为 0 ,只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于 0 ,这 5 位为 1 ,测到的数值需要取反加 1 再乘于 0.0625 即可得到实际温度。 例如:+125的数字输出07D0H 。+25.0625的数字输出为0191H , -25.0625 的数字输出为 FF6FH ,-55 的数字输出为 FC90H。 图3-7 温度测量流程图unsigned int ReadTemperature(void) Init_DS18B20(); /初始化,调用初始化函数WriteOneChar(0xcc); /跳过读序列号的操作,调用写函数,写0xcc指令码(跳过读序列号)WriteOneChar(0x44); /启动温度转换,调用写函数,写0x44指令码(启动温度转换)DS18_delay(125); /转换需要一点时间,延时Init_DS18B20(); /初始化,调用初始化函数WriteOneChar(0xcc); /跳过读序列号的操作,调用写函数,写0xcc指令码(跳过读序列号?WriteOneChar(0xbe); /调用写函数,写0xbe指令码,读温度寄存器(头两个值分别为温度的低位和高位)tempL=ReadOneChar(); /读出温度的低位LSBtempH=ReadOneChar(); /读出温度的高位MSB /tempH&=0x0f;/高字节和0f"与"运算,留住后4位有用值,赋给tempHtempa=(tempH*256)+tempL)*0.0625; /温度转换,把高低位做相应的运算转化为实际温度,使用DS18B20温度传感器手册规定的公式,结果是十进制数值DS18_delay(20);return(tempa);/运算结果返回到函数 :ReadTemperature()调用时需要采用i=ReadTemperature(),然后再对i(任意uchar型变量)进行操作3.5 LCD1602液晶程序设计3.5.1 1602液晶初始化程序设计首先对1602显示屏进行初始化(初始化大约持续10ms左右),然后检查忙信号,若BF=0,则获得显示RAM的地址,写入相应的数据显示;若BF=1,则代表模块正在进行内部操作,不接受任何外部指令和数据,直到BF=0为止。图3-8 LCD显示程序流程图我们采用的液晶都是有8位数据接口,双行显示、5*7点阵字符(0x38)。光标设置为读或写完一个数据操作后,地址指针AC加1,切光标加1(光标右移1格),但是整屏不移动。打开显示器时,光标不显示、不闪烁。为了能使液晶正常启用,我们需要对液晶进行4次的显示模式设置,然后关闭显示,对液晶清屏,设置光标,打开液晶显示并设置光标不显示不闪烁。下面为液晶初始化程序:void lcd_init()/*液晶初始化函数*wgste_1602com(0x38);/设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据wgste_1602com(0x0c);/开显示不显示光标wgste_1602com(0x06);/整屏不移动,光标自动右移wgste_1602com(0x01);/清显示wgste_1602com(yh+0);/定符号从第一行第0位置之后开始显示for(a=0;a<16;a+)wgste_1602dat(tab1a);/向液晶屏写固定符号部分/delay(3);wgste_1602com(er+0);/时间显示固定符号写入位置,从第2个位置后开始显示for(a=0;a<16;a+)wgste_1602dat(tab2a);/delay(3);3.5.2 LCD写命令程序设计先要检测液晶是否忙碌,通过延时来使液晶处理完前面的数据,RS、RW给0信号,E一个由高脉冲到低脉冲的一个跳变过程,一个下降沿是需要25ns时间的,所以在高脉冲到低脉冲跳变的过程中用了2个空白延时。下面为LCD写命令程序:void xiemingling(unchar mingling)LcdBusy(); /检测液晶是否忙 RS=0;RW=0;P0=mingling;E=1;_nop_();_nop_();E=0;3.5.3 LCD写数据程序设计数据程序和写命令时一样要先检测液晶是否忙碌,如果不忙,RS给高信号,RW给低信号,E也是由一个高脉冲到低脉冲的跳变。下面为LCD写数据程序:void xieshuju(unchar shuju)LcdBusy();RS=1;RW=0;P0=shuju;E=1;_nop_();_nop_();E=0;3.5.4 LCD检测忙碌程序设计检测LCD是否忙碌要看忙碌标志位BF。当BF=1时,表示正在进行内部数据处理,不接收单片机送来的指令或数据;当BF=0时,表示已经准备接受命令或数据。RS给0信号,RW给1信号,E由一个高脉冲到低脉冲的跳变。下面为检测LCD是否忙碌程序:void LcdBusy(void)unchar i;P0=0xff;RS=0;RW=1;E=1;for(i=0;i<20;i+)if(P0&0x80) = 0) break; E=0;4调试与仿真本次仿真设计中在液晶上显示当前温度,显示开机时间,显示当前温度,显示设定温度,显示关机时间。按键1用于切换光标所在位置。按一下按键则光标闪烁在一下按键光标移动。 图4-1光标在当前时间的小时位置上 图4-2光标在当前时间的分位置上在设计中我把光标移动到最后位置时无法回到初始位置当光标移到最后位置后一直在最后位置无法移动。原因在于没有设置按键功能循环。温度调节当温度超过设定温度是等灭当温度没超过下限温度灯亮。 图4-3温度没超过下限温度图 图4-4 温度超过下限温度图在设置中遇到了温度显示超过下限温度时没有停止加热而是显示继续加热。原因在与程序中没有设定与设定温度进行比较。功能实现图 图4-5功能实现图结论与谢辞本系统历时15周完成,通过老师的悉心指导以及自己的努力终于完成。本次毕业设计是对所学知识的一次综合性运用。其中包括对模拟电子技术基础、和数字电子技术基础、单片机等知识的运用。从而完成了本次设计。在设计的过程中发现了自身知识的不足,也发现我们必须具备专业基础知识以外,才能成功的设计出一件合格的东西。这次毕业设计收获很多,体会也很深刻,并且对我们所学的东西也产生了浓厚的兴趣。在设计过程中,也学会了很多新的东西,以及一些仿真软件的应用,最典型的就是PROTEUS软件的应用,以及与KEIL软件的联合使用功能。当然最重要的是学到了关于基本电子设计的一些基本方法,同时也加深了对一些常用的电子元件的理解及其基本用法的掌握。除此之外,我觉得在这次设计的过程中,我发现团队精神的重要性,很多时候一个人的力量是有限的,一个人不可能什么都会,什么都能自己解决,还是有需要他人帮助的时候,我觉得人与人之间的相互帮助很有必要,这样不仅能帮助大家很快的解决问题,还能提高我们每个人的实际水平,也培养了我们的团队合作精神,这些能力对于我们今后的学习和工作都很有帮助。这次毕业设计历时4个月,中间也有在设计过程中遇到不少问题,在楼蔚松老师和同学的帮助和配合下才顺利的完成了毕业设计。楼蔚松老师在我们做设计的过程中,给予了我们极大的帮助,不仅从知识方面引导了我们的设计思路,同时,在人生观上也给了我们不少的启示。在此,我对老师和同学表示深深的谢意。参考文献1李法春单片机原理与接口技术M机械工业出版社,20081.2姜灵芝,余 健 编著C语言课程设计案例精编(配光盘)M,清华大学出版社,20082.3付家才 主编单片机实验与实践M高等教育出版社,200610.4刘鲲,孙春亮 编著单片机C语言入门M人民邮电出版社,20083.6李军编著51系列单片机高级实例开发指南M北京航天航空大学出版社,2004.9 .7冯汝星.单片机应用系统设计与制作M,人民邮电出版社 2010,1:831.8陈桂兰.电子线路板设计与制作M,人民邮电出版社 2010,1:344.9潘明.潘松.数字电子技术基础M,科学出版社2008,1:2339.10关健成,何碧霞.基于单片机的温度检测系统设计J.自动化用,2010(10):64-68.11张平川,许兴广.基于单片机电热水器模糊控制系统设计J.2007(10):145-146.12季晓芳,张春来.家用电热水器控制系统的实验研究J. 2009(10):77-81.附录1.硬件电路图附录2.程序清单#include<reg51.h>#include"DS18B20_3.H"#define uint unsigned int#define uchar unsigned charuchar a,miao,shi,fen,ks=7,kf=30,gs=18,gf=10,sw=40,key1n,flag ,temp;/flag用于读取头文件中的温度值,和显示温度值#define yh 0x80 /LCD第一行的初始位置,因为LCD1602字符地址首位D7恒定为1(100000000=80)#define er 0x80+0x40 /LCD第二行初始位置(因为第二行第一个字符位置地址是0x40)/液晶屏的与C51之间的引脚连接定义(显示数据线接C51的P0口)sbit rs=P20;sbit en=P22;sbit rw=P21; /如果硬件上rw接地,就不用写这句和后面的rw=0了/DS1302时钟芯片与C51之间的引脚连接定义sbit IO=P31;sbit SCLK=P30;sbit RST=P32;sbit key1=P10; sbit key2=P11; sbit key3=P12; sbit buzzer=P24;sbit led=P23;/*/uchar code tab1=" : : ON : " uchar code tab2=" C> C OFF : "/延时函数,后面经常调用void delay(uint xms)/延时函数,有参函数uint x,y;for(x=xms;x>0;x-)for(y=110;y>0;y-);/*液晶写入指令函数与写入数据函数,以后可调用*/*在这个程序中,液晶写入有关函数会在DS1302的函数中调用,所以液晶程序要放在前面*/void wgste_1602com(uchar com)/*液晶写入指令函数*rs=0;/数据/指令选择置为指令rw=0; /读写选择置为写P0=com;/送入数据delay(1);en=1;/拉高使能端,为制造有效的下降沿做准备delay(1);en=0;/en由高变低,产生下降沿,液晶执行命令void wgste_1602dat(uchar dat)/*液晶写入数据函数*rs=1;/数据/指令选择置为数据rw=0; /读写选择置为写P0=dat;/送入数据delay(1);en=1; /en置高电平,为制造下降沿做准备delay(1);en=0; /en由高变低,产生下降沿,液晶执行命令void lcd_init()/*液晶初始化函数*wgste_1602com(0x38);/设置液晶工作模式,意思:16*2行显示,5*7点阵,8位数据wgste_1602com(0x0c);/开显示不显示光标wgste_1602com(0x06);/整屏不移动,光标自动右移wgste_1602com(0x01);/清显示wgste_1602com(yh+0);/定符号从第一行第0位置之后开始显示for(a=0;a<16;a+)wgste_1602dat(tab1a);/向液晶屏写固定符号部分/delay(3);wgste_1602com(er+0);/时间显示固定符号写入位置,从第2个位置后开始显示for(a=0;a<16;a+)wgste_1602dat(tab2a);/delay(3);/*over*/*DS1302有关子函数*/void wgste_byte(uchar dat)/写一个字节ACC=dat;RST=1;for(a=8;a>0;a-)IO=ACC0;SCLK=0;SCLK=1;ACC=ACC>>1;uchar read_byte()/读一个字节RST=1;for(a=8;a>0;a-)ACC7=IO;SCLK=1;SCLK=0;ACC=ACC>>1;eturn (ACC);/-void wgste_1302(uchar add,uchar dat)/向1302芯片写函数,指定写入地址,数据RST=0;SCLK=0;RST=1;wgste_byte(add);wgste_byte(dat);SCLK=1;RST=0;uchar read_1302(uchar add)/从1302读数据函数,指定读取数据来源地址uchar temp;RST=0;SCLK=0;RST=1;wgste_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);uchar BCD_Decimal(uchar bcd)/BCD码转十进制函数,输入BCD,返回十进制 uchar Decimal; Decimal=bcd>>4; return(Decimal=Decimal*10+(bcd&=0x0F);/-void ds1302_init() /1302芯片初始化子函数(2010-01-07,12:00:00,gf4)RST=0;SCLK=0;wgste_1302(0x8e,0x00); /允许写,禁止写保护 wgste_1302(0x8e,0x80); /打开写保护/-/温度显示子函数void wgste_temp(uchar add,uchar dat)/向LCD写温度数据,并指定显示位置uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字wgste_1602com(er+add);/er是头文件规定的值0x80+0x40wgste_1602dat(0x30+sw);/数字+30得到该数字的LCD1602显示码wgste_1602dat(0x30+gw);/数字+30得到该数字的LCD1602显示码/wgste_1602dat(0xdf);/显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码/wgste_1602dat(0x43);/显示"C"符号,0x43是液晶屏字符库里大写C的地址/-/时分秒显示子函数void wgste_sfm(uchar add,uchar dat)/据,两个参数uchar gw,sw;gw=dat%10;/取得个位数字sw=dat/10;/取得十位数字wgste_1602com(er+add);/er是头文件规定的值0x