资源描述
智 能 电 子 钟 的 设 计 智能电摘要AT89S52单片机完全兼容51单片机,列单片机的应用日趋广泛。本文设计了一种基ATC89S52单片机,使用Dallas的一线制数字温度计DS18B20作为温度传感器,实时时钟芯片DS1302提供当前日期和时间数据,并将实时的日期和温度数据字符型液晶显示器LCD1602上显示,本次设计的智能电子钟钟采用数字电路对日期和温度进行控制设置,采用LCD液晶显示,以24小时的计时方式,根据LCD显示原理进行显示,定时器计数。在本次设计中,电路具有显示日期、时间、温度的基本功能,还可以实现对它们的调整。本次设计要达到的目的是:具有时间显示和手动校对功能,24小时制;具有年、月、日显示和手动校对功能;具有显示当前星期的功能;具有闹铃功能;具有环境温度采集功能;掉电后无需重新设置时间和日期;系统不但接口设计简单、便于控制,而且具有很好的人机界面,可以对当前的时间进行调整。关键字:单片机 智能电子钟 数字电路 1 设计的任务1.1 课题开发背景随着电子科技的飞速发展,电子技术正在逐渐改善着人们的学习、生活、工作,因此开发本系统希望能够给人们多带来一点生活上的乐趣。基于当前市场上的玩具市场需求量大,其中智能电子钟就是一个很好的应用方面,利用单片机能完成基本显示时间和日期的功能,同时还能显示温度的。1.2 课题研究的目的和意义利用AT89S52单片机自带资源,设计一款能实现显示时间和其它的智能功能的电子钟。1.3 课题的主要研究工作本课题设计的主要工作有以下几个方面:(1)设计出能实时的检测温度。(2)液晶屏可以显示当前的时间、日期、星期。(3)通过按键可以通过对上述内容进行调整。(4)具有定时功能和蜂鸣器报时功能。(5)根据定时功能来控制收音机和灯具的开关。 2总体方案设计2.1 设计内容完成基于LCD液晶显示的多功能数字钟的设计。要求该电路具有显示日期、时间、温度的基本功能,还可以实现对它们的调整。本次设计要达到的目的是:具有时间显示和手动校对功能,24小时制;具有年、月、日显示和手动校对功能;具有显示当前星期的功能;具有闹铃功能;具有环境温度采集功能;掉电后无需重新设置时间和日期;采用单片机AT89S52芯片以及相关的芯片来实现多功能的数字钟。该设计选用一线制温度计DS18B20 作为温度传感器,实时时钟芯片DS1302提供当前日期和时间数据,并将实时的日期和温度数据在字符型液晶显示器LCD1602上显示出来。本文设计了一种基AT89S52单片机,使用Dallas的一线制数字温度计DS18B20作为温度传感器,实时时钟芯片DS1302提供当前日期和时间数据,并将实时的日期和温度数据字符型液晶显示器LCD1602上显示,本次设计的多功能数字钟采用数字电路对日期和温度进行控制设置,我们采用LCD液晶显示,以24小时的计时方式,根据LCD显示原理进行显示,定时器计数。在本次设计中,电路具有显示日期、时间、温度的基本功能,还可以实现对它们的调整。本次设计要达到的目的是:具有时间显示和手动校对功能,24小时制;具有年、月、日显示和手动校对功能;具有显示当前星期的功能;具有闹铃功能;具有环境温度采集功能;掉电后无需重新设置时间和日期。系统不但接口设计简单、便于控制,而且具有很好的人机界面,可以通过几个按键对当前的时间进行调整,对闹钟进行随意设置,以及温度超过上下限会自动进行报警(LED亮)等功能。其原理框图如下图2.1所示:串行通信接口电路LCD1602液晶显示键盘控制电路时钟电路供电电路蜂鸣报时AT89S52单片机温度采集电压转换电路图2.1 数字钟原理框图在现代SOC技术的引领下,人们对低故障、高实时、高可靠、高稳定的性能更加青睐,其抗干扰性强,加密性强,超低功耗,可以远程升级,内部有专用复位电路,价格也较便宜,结合本设计的要求及综合以上比较的情况,我们选择用AT89S52单片机芯片来实现本次设计。3单元模块设计3.1各单元模块功能介绍及电路设计3.1.1 温度采集电路DS18B20是美国Dallas半导体公司生产的一线制数字温度传感器。测量范围为- 50 + 125 ,精度可达0. 1 ,不需A /D 转换电路,直接将温度值转换成数字量。温度数据的传输,只需要一根数据线,直接将数据线与单片机的P3.6口相连接。其图如下3.1所示:图3.1温度采集 3.1.2 DS1302时钟电路DS1302是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟芯片,它可以对年、月、日、周日、时、分、秒进行计时。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录。DS1302提供2个电源引脚:一个(VCC2)接主电源;另一个(VCC1)接备用电源。其图如下3.2所示:图3.2 DS1302时钟电路3.1.3 串行通信接口电路MAX232是电压转换芯片,将TTL电平转换成可以和电脑串口匹配的电压。DB9通过下载线缆与电脑连接,可以将程序下载到单片机上。其图如下3.3所示:图3.3 RS232串行通信3.1.4 电源电路 为了便于使用,本次采用了把交流的220V经变压器再经LM7805B 变为单片机所使用的5V电源,如图3.4。图3.4 电源电路3.1.5 按键电路本次设计中用到了4*4的矩阵键盘列阵,通过赋低电平选中其中一列,以便来控制时,分,秒,年,月,日,以及闹钟的调整。其电路如图3.5:图3.5 按键控制电路3.1.6液晶显示显示电路本设计中会将时分秒,年月日周以及闹钟的设置,温度全部都会显示到液晶LCD1602上面,其具有162能够显示所有英文大小写字母,0到9十个数字以及一些常用的符号。该液晶在4.5V到5.5V电压范围内都能正确工作,平均工作电流为2mA。液晶HS162共16个管脚。但是由于原理图中电路很简单并且只用到接插件所以此处没有给出原理图。3.2 特殊器件介绍3.2.1 AT89S52单片机芯片AT89S52功能特性描述AT89S52是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 AT89S52具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。其图如下3.6所示:图3.6 AT89S52引脚图3.2.2 DS1302介绍DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月、年,一个月小于31天时可自动进行调整,且具有闰年补偿功能。工作电压宽达2.55.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行。DS1302是以下的特性:双电源管脚用于主电源和备份电源供应,Vcc1为课编程涓流充电电源,附加七个字节存储器。其外部引脚分配如图所示:图3.7 DS1302的外部时钟引脚分配3.2.3 温度传感器DS18B20采用独特的一线接口,可用数据总线供电,电压范围为3.0 V至5.5 V 无需备用电源。测量温度范围为-55至+125 。华氏相当于是-67F到257华氏度 -10 C至+85 C范围内精度为0.5。温度传感器可编程的分辨率为912位 温度转换为12位数字格式最大值为750毫秒 用户可定义的非易失性温度报警设置应用范围包括恒温控制,工业系统,消费电子产品温度计,或任何热敏感系统。DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。该装置信号线高的时候,内部电容器储存能量通由1线通信线路给片子供电,而且在低电平期间为片子供电直至下一个高电平的到来重新充电。图3.8 DS18B20的管脚3.2.4 液晶显示LCD1602HS1602是目前最常用的字符液晶之一。具有162能够显示所有英文大小写字母,0到9十个数字以及一些常用的符号。该液晶在4.5V到5.5V电压范围内都能正确工作,平均工作电流为2mA。液晶HS162共16个管脚.RS为寄存器选择信号,RW为读写选择信号,通过这两种信号的不同组合可对液晶进行读写命令和读写数据的操作。1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个HS162是目前最常用的字符液晶之一。具有162能够显示所有英文大小写字母,0不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。在操作液晶时,先要对液晶进行初始化,即进行最初是的命令设置。要设置液晶的工作方式设置,显示状态设置,输入方式设置等。最后再向液晶写入数据,即写入想要显示字符的ASCII码。4软件设计4.1 软件选择本次设计选择的软件主要是Keil uVision3。 Keil公司成立于1986年,主要开发、制造和销售嵌入式8051、251、ARM、XC16x/C16x/ST10等微控制器软件开发工具,提供ANSI C编译器、宏汇编程序、实时管理、调试和模拟器、综合评估板等。Keil公司的uVision把编辑、编译、链接和仿真等模式打包成集成开发环境,当然其集成的C51编译器肯定跟Franklin公司的相关模块肯定有交叉性,uVision还包含项目管理和调试器等非常有用的功能。 4.2软件设计流程本次设计的系统软件设计主要包括主程序设计和温度采集子模块程序设计、日历日期数据子模块程序、按键控制子模块程序和LCD液晶显示子模块程序设计等。主程序主要完成器件的初始化,并判断有无按键按下,并根据判断的结果调用相应的子模块程序;而温度采集子模块程序和日历日期数据子模块程序完成相应的数据采集、处理和保存,按键处理子模块程序完成日期和闹钟的设置,而液晶显示子模块只要把上述子模块储存的数据送去显示即可。系统总的流程图如下图所示:开始日历日期数据处理温度数据处理液晶显示按键扫描按键按下按键控制初始化N Y 时间日期的修改 图4.1 主程序流程4.2.1 温度采集流程DS18B20在进行温度采集时,必须首先进行初始化,然后发ROM操作指令,再发存储器操作指令,最后才能传输数据。每次对器件进行读写操作时, 必须严格按照DS18B20 的时序要求。因为温度数据在DS18B20中是以2的补码形式存放的,且低4位为小数部分, 4位到10位为整数部分,其余为符号位,因此在读出2个字节的温度数据后,首先求一次补码得到原码,再将数据分离为整数温度值和小数温度值,整数部分的值可通过数据交换指令得到,而小数温度值部分可通过查表得到。因为在液晶显示器上显示的是字符的ASCII码,因而还要转换为BCD,在加30H转换为ASC码。其流程图如下所示:读温度数据初始化求原码温度数据的整数和小数处理转为ASCII码送去显示图4.3 温度采集流程4.2.2 日期数据处理流程对时钟芯片的操作主要包括一是将芯片中的日期等数据读出来,二是在进行日期等设置时将设置的数据写入芯片,这也是按键处理时的主要内容。无论是读数据还是写数据满足DS1302 对时序的要求。而对芯片各个数据部分的访问是通过地址进行的,且读和写的地址不一样。读出的数据同样要转为ASC II码,然后储存起来,等待送去显示,流程图如下图所示:初始化读日期数据数据处理将设置的数据写入芯片转为ASCII送去显示图4.2流程图如下图所5结论本设计在功能上基本上完成了本次智能化电子系统设计的要求,但是也尚存在一些问题。由于时间仓促和自身水平有限,对于电路的可靠性,稳定性等参数还未做过详细的测试。还可以通过修改程序,完成字符或数字的滚动显示。这些事我们组尚未完成的附加功能。6总结与体会6.1 设计小结在本次设计中,我们最终完成本次智能化电子系统设计系的基本要求及功能,并在此基础了对系统功能作了扩展,增加了闹钟设置以及温度测试等部分。在设计开始前我们对各个模块进行了详细的分析和设计准备工作,设计过程中,积极参与完成各个技术实现的难点,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和具体的使用方法。6.2 设计收获及改进通过本次设计,我们对单片机有了更深刻的认识,也从实践的例子中去感受到了单片机设计给我们设计带来的改变与进步。我们不仅掌握Keil uVision3软件的使用,与此同时,我们还对电子设计的思路有了更多的认识。这次对多功能数字钟的设计与制作,让我了解设计电路的程序,也了解了关于智能电子钟的原理与设计理念。在此次的智能电子钟设计过程中,更进一步地熟悉了芯片的结构及掌握了各芯片的工作原理和具体的使用方法。总之是受益匪浅。这为自己今后进一步深化学习,积累了一定宝贵经验。6.3 致谢此次智能电子钟设计中,我要特别感谢我的指导老师的热情关怀和悉心指导。让我从中更加的认识了单片机的功能的实现,同时也要感谢班内的一些同学的帮助,在设计中帮我解决一些设计方面的困难。7参考文献1 万胜前.基于KeilC51软件的电子钟设计与制作J.鄂州大学学报,2007年第2期2 蒋梅.单片机万年历设计J,职业大学报.2000年第2期3 彭小军.用单片机实现电子钟J.新余高专学报,2004年4月第9卷第2期4 付家才.单片机控制工程实践技术M.北京:化学工业出版社,2004.35 刘军等.单片机原理与接口技术M.上海:华东理工大学出版社,2006.26 何书森等.用电子线路设计速成M.胡州:互见科学技术出版社,2005.107 李晓静等.液晶显示控制器与单片机的接口及编程J.电子技术,2004年第6期8 张迎新.单片机原理、应用及接口技术(第二版)M.北京:国防工业出版社,2005.9附录:设计原理图:PCB图:1 实现程序:/介绍整个程序所包含的头文件#include#include#include#include#include/定义#define uchar unsigned char#define uint unsigned intUchar u,u1,u2,u3,u4,u5,u6,u7,u8,alarmOn;uint fen,miao,shi,nian,yue,ri,anshu,zh;uchar linshi,a,a1,a2,a3,a4,a5,a6;uint tab3;sbit rd=P35;sbit P30=P30;sbit P31=P31;sbit P32=P32;sbit P33=P33;sbit beep=P33;sbit ds1302_rst=P02;sbit ds1302_sclk=P00;sbit ds1302_io=P01;sbit ACC7=ACC7;sbit B1=B0;sbit lcd1602_en=P05;sbit lcd1602_rw=P06;sbit lcd1602_rs=P07;#define lcd1602_data P2uchar low,high; /存储温度的高位值和低位值sbit DQ=P36; / - 定义通信端口sbit D1=P07;uchar gw,sw,w4,tpl,tph;uint bai,b;/主函数部分void fenjia (uchar rddr,uchar wddr,uchar yddr,uchar fenjiajian)/键盘扫描u=ds1302_read(rddr);fen=(u&0x70)4)*10+(u&0x0f);/进制转换if(fenjiajian=1)fen+;if(fen=60)fen=0;elsefen-;if(fen+1)=0)fen=59;ds1302_write(wddr,(fen/10)4)*10+(a4&0x0f);/进制转换if(shijiajian=1)shi+;if(shi=24)shi=0;elseshi-;if(shi+1)=0)shi=23;ds1302_write(wddr,(shi/10)4)*10+(a&0x0f);/write_sfm(6,miao)lcd1602_writecom(0x80+0x40+6);lcd1602_writecom(0x0f);lcd1602_writecom(0x80+0x40+6);if(anshu=2)u1=ds1302_read(0x83)fen=(u1&0x70)4)*10+(u1&0x0f);write_sfm(3,fen);lcd1602_writecom(0x80+0x40+3);lcd1602_writecom(0x0f);lcd1602_writecom(0x80+0x40+3);if(anshu=3)u2=ds1302_read(0x85);shi=(u2&0x70)4)*10+(u2&0x0f);write_sfm(0,shi);lcd1602_writecom(0x80+0x40+0);lcd1602_writecom(0x0f);lcd1602_writecom(0x80+0x40+0);if(anshu=4)lcd1602_writecom(0x0c); lcd1602_writecom(0x80 + 0x40+14);lcd1602_writedata(s);lcd1602_writedata(t); lcd1602_writecom(0x0f);if(anshu=5)u7=ds1302_read(0x83)tab0=(u7&0x70)4)*10+(u7&0x0f); write_sfm(3,tab0);/table0为分存储器lcd1602_writecom(0x80+0x40+3);lcd1602_writecom(0x0f);lcd1602_writecom(0x80+0x40+3);if(anshu=6)u8=ds1302_read(0x85);tab1=(u8&0x70)4)*10+(u8&0x0f);write_sfm(0,tab1);/table1为时存储器lcd1602_writecom(0x80+0x40+0);lcd1602_writecom(0x0f);lcd1602_writecom(0x80+0x40+0);if(anshu=7)lcd1602_writecom(0x0c);lcd1602_writecom(0x80 + 0x40+14);lcd1602_writedata(O); /显示On,提示闹钟已开启 lcd1602_writedata(n);linshi=0;if(anshu=8)linshi=0;anshu = 0;beep=1; lcd1602_writecom(0x80 + 0x40+14); /第二次按下清除 On标记lcd1602_writedata(); lcd1602_writedata( );if(anshu=9)linshi=0;anshu=0;ds1302_write(0x80,0x00);lcd1602_writecom(0x38);lcd1602_writecom(0x0c);/不出现光标if (anshu=2)if(P32=0)delay(5);if(P32=0)while(!P32);fenjia(0x83,0x82,3,1);if(P33=0)delay(5);if(P33=0)while(!P33);fenjia(0x83,0x82,3,0);if (anshu=3)if(P32=0)while(!P32);shijia(0x85,0x84,0,1);if(P33=0)delay(5);if(P33=0)while(!P33);shijia(0x85,0x84,0,0);if (anshu=5)if(P32=0)delay(5);if(P32=0)while(!P32);tab0+;write_sfm(3,tab0);if(tab0=60)tab0=0;if(P33=0)delay(5);if(P33=0)while(!P33);tab0-;write_sfm(3,tab0);if(tab0=0)tab0=59;if (anshu=6)if(P32=0)while(!P32);tab1+;write_sfm(0,tab1);if(tab1=24)tab1=0;if(P33=0)while(!P32);tab1-;write_sfm(0,tab1);if(tab1=0)tab1=23;if (anshu=7) /设置好闹钟返回时钟界面并开启闹钟lcd1602_writecom(0x0c);/闹钟已经设置好lcd1602_writecom(0x80 + 0x40+16);lcd1602_writedata(O); /显示On,提示闹钟已开启lcd1602_writedata(n);u7=ds1302_read(0x83);fen=(u7&0x70)4)*10+(u7&0x0f);u8=ds1302_read(0x85);shi=(u8&0x70)4)*10+(u8&0x0f);if(tab0=fen & tab1=shi)alarmOn = 1; /闹钟时间到了if(alarmOn = 1)beep = 0;delay(10);beep=1;delay(10);beep = 0;delay(10);beep=1;while(linshi);void zhjia(uchar rddr,uchar wddr,uchar yddr,uchar zhjiajian)u6=ds1302_read(rddr);zh=u6&0x07;/进制转换if(zhjiajian=1)zh+;if(zh=8)zh=1;elsezh-;if(zh=0)zh=7;ds1302_write(wddr,(zh/10)4)*10+(u3&0x0f);/进制转换if(rijiajian=1)ri+;if(ri=31)ri=1;elseri-;if(ri+1)=0)ri=30;ds1302_write(wddr,(ri/10)4)*10+(u4&0x0f);/进制转换if(yuejiajian=1)yue+;if(yue=13)yue=0;elseyue-;if(yue+1)=0)yue=12;ds1302_write(wddr,(yue/10)4)*10+(u5&0x0f);/进制转换if(nianjiajian=1)nian+;elsenian-;ds1302_write(wddr,(nian/10)4)*10+(a6&0x0f);write_nyr(13,zh);lcd1602_writecom(0x80+13);lcd1602_writecom(0x0f);lcd1602_writecom(0x80+13);if(anshu=2)a1=ds1302_read(0x87);ri=(a1&0x70)4)*10+(a1&0x0f);write_nyr(8,ri);lcd1602_writecom(0x80+8);lcd1602_writecom(0x0f); lcd1602_writecom(0x80+8);if(anshu=3)a2=ds1302_read(0x89);yue=(a2&0x704)*10+(a2&0x0f);write_nyr(5,yue);lcd1602_writecom(0x80+5);lcd1602_writecom(0x0f);lcd1602_writecm(0x80+5);if(anshu=4)a3=ds1302_read(0x8D);nian=(a3&0x704)*10+(a3&0x0f)write_nyr(2,nian);lcd1602_writecom(0x80+2);lcd1602_writecom(0x0f);lcd1602_writecom(0x80+2);if(anshu=5)linshi=0;anshu=0;ds1302_write(0x80,0x00);lcd1602_writecom(0x38);lcd1602_writecom(0x0c);if (anshu=1)if(P32=0)while(!P32);zhjia(0x8B,0x8A,13,1);if(P33=0)delay(5);if(P33=0)while(!P33);zhjia(0x8B,0x8A,13,0);if (anshu=2)if(P32=0)while(!P32);rijia(0x87,0x86,8,1);if(P33=0)delay(5);if(P33=0)while(!P33);rijia(0x87,0x86,8,0);if (anshu=3)if(P32=0)while(!P32);yuejia(0x89,0x88,5,1);if(P33=0)delay(5);if(P33=0)while(!P33);yuejia(0x89,0x88,5,0);if (anshu=4)if(P32=0)while(!P32);nianjia(0x8D,0x8C,2,1);if(P33=0)delay(5);if(P33=0)while(!P33);nianjia(0x8D,0x8C,2,0);while(linshi);void init()uchar num;Init_DS18B20();lcd1602_init();/ds1302_init();rd=0;for(num=0;num15;num+)lcd1602_writedata(tablenum);delay(5);lcd1602_writecom(0x80+0x40); /换行for(num=0;num4)*10+(u&0x0f);write_sfm(6,miao);u1=ds1302_read(0x83);fen=(u1&0x70)4)*10+(u1&0x0f);write_sfm(3,fen);u2=ds1302_read(0x85);shi=(u2&0x70)4)*10+(u2&0x0f);write_sfm(0,shi);u3=ds1302_read(0x87);ri=(u3&0x70)4)*10+(u3&0x0f);write_nyr(8,ri);u4=ds1302_read(0x89);yue=(u4&0x70)4)*10+(u4&0x0f);write_nyr(5,yue);u5=ds1302_read(0x8B);zh=(u5&0x70)4)*10+(u5&0x0f);write_nyr(13,zh);u6=ds1302_read(0x8D);nian=(u6&0x70)4)*10+(u6&0x0f)write_nyr(2,nian);display_DS18B20(low,high);/DS1302程序void ds1302_delay(uchar z)uchar x,y;for(x=110;x0;x-)for(y=z;y0;y-);void ds1302_write (uchar com,uchar data1)uchar temp,dat,a,k;temp=com;dat=data1;ds1302_rst=0;ds1302_sclk=0;ds1302_rst=1;for(a=0;a1;_nop_();ds1302_sclk=1;_nop_();ds1302_sclk=0;for(k=0;k1;_nop_();ds1302_sclk=1;_nop_();ds1302_sclk=0;uchar ds1302_read(uchar com)uchar shu,shu1;B=com;ds1302_rst=0;ds1302_sclk=0;ds1302_rst=1;for(shu=0;shu0;shu1-)ACC=ACC1;ACC7=ds1302_io;ds1302_sclk=1;ds1302_sclk=0;return(ACC);/*void ds1302_init()ds1302_write(0x80,0);ds1302_write(0x82,0);ds1302_write(0x84,0);ds1302_write(0x86,0);ds1302_write(0x88,0);ds1302_write(0x8A,0);ds1302_write(0x8C,0); */LCD1602液晶显示程序void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/*1602写命令*/void lcd1602_writecom(uchar com)lcd1602_rs=0;lcd1602_rw=0;lcd1602_data=com;delay(5);lcd1602_en=1;delay(5);lcd1602_en=0;/*1602写数据*/void lcd1602_writedata(uchar date)lcd1602_rs=1;lcd1602_rw=0;lcd1602_data=date;delay(5);lcd1602_en=1;delay(5);lcd1602_en=0;/*1602初始化*/void lcd1602_init()lcd1602_rs=0;lcd1602_rw=0;lcd1602_en=0;lcd1602_writecom(0x38);lcd1602_writecom(0x0c);lcd1602_writecom(0x06);lcd1602_writecom(0x01);lcd1602_writecom(0x80);/*写时分秒*/void write_sfm(uchar add,uchar date)uchar shi,ge;shi=date/10;ge=date%10;lcd1602_writecom(0x80+0x40+add);lcd1602_writedata(0x30+shi);lcd1602_writedata(0x30+ge);/*写年月日*/void write_nyr(uchar add,uchar date)uchar shi,ge;shi=date/10;ge=date%10;lcd1602_writecom(0x80+add);lcd1602_writedata(0x30+shi);lcd1602_writedata(0x30+ge);/18B20程序delay1820(uchar i)while(i-);Init_DS18B20(void)unsigned char x=0;DQ = 1; /DQ复位delay1820(8); /稍做延时DQ = 0; /单片机将DQ拉低delay1820(80); /精确延时 大于 480usDQ = 1; /拉高总线delay1820(14);x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败delay1820(20);ReadOneChar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-)DQ = 0; / 给脉冲信号dat=1;DQ = 1; / 给脉冲信号if(DQ)dat|=0x80;delay1820(4);return(dat);WriteOneChar(unsigned char dat)unsigned char i=0;for (i=8; i0; i-)DQ = 0;DQ = dat&0x01;delay1820(5);DQ = 1;dat=1;/delay1820(4);/读取温度void ReadTemperature(void)Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号WriteOneChar(0x44); / 启动温度转delay1820(125);Init_DS18B20();WriteOneChar(0xCC);WriteOneChar(0xBE); /读取温度low=ReadOneChar(); /读取低八位high=ReadOneChar(); /读取高八位void display_DS18B20(uchar low,uchar high)tpl=0x0A;tph=0x28;ReadTemperature();lcd1602_writecom(0x80+0x40+9);low=(high4);gw=low%10;sw=low/10;b=sw|gw;high=high7;bai=low&0x0f;bai=bai*625;w4=bai/1000;w3=bai%1000/100;lcd1602_writedata(0x30+sw);lcd1602_writedata(0x30+gw);lcd1602_writedata(0x2e);lcd1602_writedata(0x30+w4);lcd1602_writedata(0x30+w3);lcd1602_writedata(0xdf);if(lowtph) D1=0;elseD1=1;
展开阅读全文