基于单片机的多功能电子钟课程设计说明书_第1页
基于单片机的多功能电子钟课程设计说明书_第2页
基于单片机的多功能电子钟课程设计说明书_第3页
基于单片机的多功能电子钟课程设计说明书_第4页
基于单片机的多功能电子钟课程设计说明书_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计说明书题目:基于单片机的多功能电子钟课程:单片机原理及应用B课程设计山东建筑大学信息与电气工程学院课程设计说明书目录摘要 II1设计目的 12设计要求 23设计内容 33.1电子时钟的工作原理 33.2系统硬件电路设计及元件 43.2.1AT89C51芯片 43.2.2DS1302芯片 83.2.3LCD1602液晶显示 123.3系统软件电路设计 153.3.1系统流程图及源代码设计 15总结与致谢 18参考文献 19附录一 20

摘要单片机,是集CPU,RAM,ROM,定时器,计数器和多种接口于一体的微控制器。自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注。它体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易,广泛应用于智能生产和工业自动化上。本系统为基于DS1302的多功能电子钟,以AT89C51单片机作为主控芯,采用实时时钟芯片DS1302,使用1602液晶作为显示输出。该系统走时精确,具有闹钟设置,时间模式切换,秒表以及可同时显示时间、日期等多种功能。本文将详细介绍AT89C51单片机和DS1302时钟芯片的基本原理,从软件和硬件电路的实现两大方面进行分析。关键词:AT89C51;单片机;液晶屏;时钟芯片;蜂鸣器1设计目的基于51单片机设计一个能够支持年、月、日、星期、时、分、秒的电子时钟。并且支持闹钟功能,及整点报时功能。在设计过程中,学习利用DXP软件进行硬件电路设计或者利用仿真软件进行仿真,进行单片机的软件编程。学习芯片的选择及方案选择,熟悉单片机的I/O口原理;掌握LCD显示的原理;掌握定时计数器的使用;要求设计出程序流程图和程序。

2设计要求1.设计能支持年、月、日、星期、时、分、秒的时钟,时钟有时间调整功能及闹钟功能;2.时钟具有装卸电池时掉电保护功能,保护时间大于5分钟;3.时钟功耗小于0.5MA/5V。4.能够提供生日提醒指示;能够每天提供3个时间点的闹钟报时功能;5.非易失定时闹铃6.整点报时

3设计内容3.1电子时钟的工作原理本次设计时钟电路,使用了AT89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂的线路,使得电路简明易懂,用C语言程序来控制整个时钟的显示,使得编程变得更容易,这样通过五个模块:芯片、显示屏、看门狗、电源、时钟即可满足设计要求。此设计原理图框图如图3.1所示,此电路包括以下五个部分:单片机、时钟电路、看门狗、液晶屏、电源模块、时钟振荡电路。图3.1主电路设计框图本设计采用C语言程序设计,使单片机控制液晶显示年、月、日、时、分、秒,当秒计数满60时就向分进位,分计数器计满60后向时计数器进位,小时计数器按“23翻0”规律计数。时、分、秒的计数结果经过数据处理可直接送显示器显示。当计时发生误差的时候可以用校时电路进行校正。设计采用的是时、分、秒显示,单片机对数据进行处理同时在LCD上显示。3.2系统硬件电路设计及元件3.2.1AT89C51芯片AT89C51是美国ATMEL公司生产的8位FlashROM单片机。其最突出的优点是片内ROM为FlashROM,可擦写1000次以上,应用并不复杂的通用ROM写入器就能方便的擦写,读取也很方便,价格低廉,具有片程序ROM二级保密系统。因此可灵活应用于各种控制领域。AT89C51包含以下一些功能部件:(1)一个8位CPU;(2)一个片内振荡器和时钟电路;(3)4KBFlashROM;(4)128B内RAM;(5)可寻址64KB的外ROM和外RAM控制电路;(6)两个16位定时/计数器;(7)21个特殊功能寄存器;(8)4个8位并行I/O口;(9)一个可编程全双工串行口;(10)5个中断源,可设置成2个优先级。AT89C51单片机一般采用双列直插DIP封装,共40个引脚,图3.2为其引脚排列图。40个引脚大致可分为4类:电源、时钟、控制各I/O引脚。图3.2AT89C51引脚图(1)控制线控制线共有4根,其中3根是复用线。所谓复用线是指具有两种功能,正常使用时是一种功能,在某种条件下是另一种功能。1、ALE/PROG——地址锁存允许/片内EPROM编程脉冲。(1)ALE功能:用来锁存P0口送出的低八位地址。AT89C51在并行扩展外存储器时,P0口用于分时传送低8位地址和数据信号,且均为二进制数。当ALE信号有效时,P0口传送的是低8位地址信号;ALE信号无效时,P0口传送的是低8位地址信号。在ALE信号的下降沿,锁定P0口传送的内容,即低8位地址信号。需要指出的是,当CPU不执行访问外RAM指令,ALE以时钟振荡频率1/6的固定频率输出,因此ALE信号也可作为外部芯片CLK时钟或其他需要。但是,当CPU执行MOVX指令时,ALE将跳过一个ALE脉冲。PROG功能:片内EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。PSEN——外ROM读选通信号。89C51读外ROM时,每个机器周期内PSEN两次有效输出。PSEN可作为外ROM芯片输出允许OE的选通信号。在读内ROM或读外RAM时,PSEN无效。3、RST/VPD——复位/备用电源。(1)正常工作时,RST端为复位信号输入端,只要在该引脚上连续保持两个机器周期以上高电平,AT89C51芯片即实现复位操作,复位后一切从头开始,CPU从0000H开始执行指令。(2)VPD功能:在VCC掉电情况下,该引脚可接上备用电源,由VPD向片内RAM供电,以保持片内RAM中的数据不丢失。4、EA/VPP——内外ROM选择/片内EPROM编程电源。(1)EA功能:正常工作时,EA为内外ROM选择端。AT89C51单片机ROM寻址范围为64KB,其中4KB在片内,60KB在片外。当EA保持高电平时,先访问内ROM,但当PC值超过4KB时,将自动转向执行外ROM中的程序。当EA保持低电平时,则只访问外ROM,不管芯片内有否内ROM。(2)VPP功能:片内有EPROM的芯片,在EPROM编程期间,此引脚用于施加编程电源。(2)I/O引脚AT89C51有P0、P1、P2、P34个8位并行I/O端口,共32个引脚。P0口是一组8位漏级开路型双向I/O口,也即地址/数据总线复用口。作为输出口用时,每位能以吸收电流的方式驱动8个TTL逻辑门电路,对端口写1时,又可作高阻抗输入端用。在访问外部程序和数据存储器时,它是分时多路转换的地址(低8位)/数据总线,在访问期间激活了内部的上拉电阻。在Flash编程时,P0端口接收指令字节;而在验证程序时,则输出指令字节。验证时,要求外接上拉电阻。P1口是带内部上拉电阻的双向I/O口,向P1口写入1时P1口被内部上拉为高电平,可用作输入口。当作为输入脚时被外部信号拉低的P1口会因为内部上拉而输出一个电流。Flash编程和程序校验期间,P1接收低8位地址。P2口是带内部上拉电阻的双向I/O口,向P2口写入1时P2口被内部上拉为高电平可用作输入口,当作为输入脚时被外部拉低的P2口会因为内部上拉而输出电流。在访问外部程序存储器或16位地址的外部数据存储器(例如执行MOVX@DPTR指令)时,P2口送出高8位地址数据,当使用8位寻址方式(MOVX@RI)访问外部数据存储器时,P2口发送P2特殊功能寄存器的内容,在整个访问期间不改变。Flash编程和程序校验时,P2也接收高位地址和一些控制信号。P3口是带内部上拉电阻的双向I/O口,向P3口写入1时P3口被内部上拉为高电平可用作输入口,当作为输入脚时被外部拉低的P3口会因为内部上拉而输出电流。P3口除了作为一般的I/O口线外,更重要的是它的第二功能,如表3-1所示:表3-1P3端口的特殊功能端口引脚兼用功能P3.0——RXD串行输入口P3.1——TXD串行输出口P3.2——/INT0外部中断0P3.3——/INT1外部中断1P3.4——T0定时器0的外部输入P3.5——T1定时器1的外部输入P3.6——/WR外部数据存储器写选通P3.7——/RD外部数据存储器读选通3.2.2DS1302芯片DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟日历芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。有主电源和备份电源双引脚,而且备份电源可由大容量电容(>1F)来替代。需要强调的是,DS1302需要使用32.768KHz的晶振。DS1302包含以下一些功能部件:(1)实时时钟,可对秒、分、时、日、周、月以及带闰年补偿的年进行计数;(2)用于高速数据暂存的31×8位RAM;(3)最少引脚的串行I/O;(4)2.5~5.5V电压工作范围;(5)2.5V时耗电小于300nA;(6)用于时钟或RAM数据读/写的单字节或多字节(脉冲方式)数据传送方式;(7)简单的3线接口;(8)可选的慢速充电(至VCC1)的能力。(1)DS1302数据操作原理DS1302在任何数据传送时必须先初始化,把RST脚置为高电平,然后把8位地址和命令字装入移位寄存器,数据在SCLK的上升沿被输入。无论是读周期还是写周期,开始8位指定40个寄存器中哪个被访问到。在开始8个时钟周期,把命令字节装入移位寄存器之后,另外的时钟周期在读操作时输出数据,在写操作时写入数据。时钟脉冲的个数在单字节方式下为8加8,在多字节方式下为8加字节数,最大可达248字节数。DS1302的内部结构图如图3.3所示。图3.3DS1302内部结构图(2)DS1302的引脚图及功能DS1302的引脚图如图3.4所示。图3.4DS1302引脚图DS1302各引脚功能:Vcc1:主电源;Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2<Vcc1时,由Vcc1向DS1302供电。SCLK:串行时钟,输入,控制数据的输入与输出;I/O:三线接口时的双向数据线;CE:输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次CE提供结束单字节或多字节数据传输的方法。引脚功能如表3-2所示:表3-2DS1302引脚功能说明引脚号名称功能1VCC1备份电源输入2X132.768KHz晶振输入3X232.768KHz晶振输出4GND地5RST控制移位寄存器/复位6I/O数据输入/输出7SCLK串行时钟8VCC2主电源输入(3)DS1302的控制字DS1302的控制字如表3-3所示:表3-3控制字(即地址及命令字节)765432101RAMA4A3A2A1A0RD控制字的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入到DS1302中。位6:如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1(A4~A0):指示操作单元的地址;位0(最低有效位):如为0,表示要进行写操作,为1表示进行读操作。控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从最低位(0位)开始。同样,在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据,读出的数据也是从最低位到最高位。(4)DS1302时序CE输入驱动高启动所有的数据传输。CE输入有两个功能。首先,CE打开控制逻辑,允许访问的移位寄存器的地址/命令序列。其次,CE提供了一个终止单字节或多字节数据传输方法。一个时钟周期是由一个下降沿之后的上升沿序列。对于数据传输而言,数据必须在有效的时钟的上升沿输入,在时钟的下降沿输出。如果CE为低,所有的I/O引脚变为高阻抗状态,数据传输终止。对于数据输入:开始的8个SCLK周期,输入写命令字节,数据字节在后8个SCLK周期的上升沿输入。数据输入位0开始。对于数据输出:开始的8个SCLK周期,输入一个读命令字节,数据字节在后8个SCLK周期的下降沿输出。注意,第一个数据字节的第一个下降沿发生后,命令字的最后一位被写入,命令字节的最后一位被写入。当CE仍为高时。如果还有额外的SCLK周期,DS1302将重新发送数据字节,这使DS1302具有连续突发读取的能力。DS1302数据读写时序如图3.5所示:图3.5数据读写时序3.2.3LCD1602液晶显示LCD1602是一种用5x7点阵图形来显示字符的液晶显示器模块,它显示的容量为2行16个字共32个字符。它由若干个5×7或者5×11点阵字符位组成,每个点阵字符位都可以显示一个字符。模块采用数字式接口,能够方便地与单片机等控制类芯片进行通信。由于其具有体积小、重量轻、显示质量高、功耗低等诸多优点而被广泛用于智能化仪器仪表的显示器件。(1)LCD1602引脚及功能LCD1602的引脚如图3.6所示:①VSS:电源地。②VDD:接电源正极。③VL:液晶显示偏压信号。④RS:数据/命令选择端(H/L)。⑤:读/写选择端(H/L)。⑥E:使能端。当E端由高电平跳变成低电平时,液晶模块执行命令。⑦D1~D8:8位双向数据线。⑧BLA:背光源正极;⑨BLK:背光源负极。图3.6LCD1602引脚图LCD1602引脚功能表如下表3-4所示:表3-4LCD1602引脚功能表编号符号引脚说明编号符号引脚说明1VSS电源地9D2数据2VDD电源正极10D3数据3VL液晶显示偏压11D4数据4RS数据/命令选择12D5数据5R/W读/写选择13D6数据6E使能信号14D7数据7D0数据15BLA背光源正极8D1数据16BLK背光源负极液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志位是不是为低电平,是低电平则表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符。表3-5为LCD1602的内部显示地址。表3-5LCD1602的内部显示地址123·····141516第一行80H81H82H·····8DH8EH8FH第二行0C0H0C1H0C2H·····0CDH0CEH0CFH3.3系统软件电路设计3.3.1系统流程图及源代码设计(1)主程序流程图设计3.7主程序流程图(2)子程序流程图设计DS1302定时器中断子程序流程图图3.8DS1302中断流程图程序主要实现对DS1302写保护、充电,对年、月、日、时、分、秒等寄存器的读写操作。在读写操作子程序中都执行了关中断指令,因为在串行通信时对时序要求比较高,而且在此是用I/O口软件模拟串行时钟脉冲,所以在通信过程中最好保证传输的连续性,不要允许中断,如图3.8所示。LCD1602流程图程序主要实现对信息的显示,包括年、月、日、时、分、秒等信息,在这里要注意它的读写控制指令。其流程图如图3.9所示。图3.9LCD1602初始化流程图

总结与致谢通过这次对《基于单片机的电子时钟设计》的设计与制作过程,加强了我们动手、思考和解决问题的能力。在设计过程中我们利用Altium软件进行原理图及PCB图的绘制,最后再利仿真软件进行检查,看程序是否能显示其功能。在设计过程中让我进一步深刻的学习各种软件的利用以及各种软件给我们带来的便利。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固。这次课程设计终于顺利完成了,在设计中遇到了很多专业知识问题,最后在老师的辛勤指导下,终于游逆而解。同时,在老师的身上我们学也到很多实用的知识,在次我们表示感谢!同时,对给过我帮助的所有同学和各位指导老师再次表示忠心的感谢!

参考文献[1]马潮.AVR单片机嵌入式系统原理与应用实践[M].北京:北京航空航天大学出版社,2007.[2]杨欣,王玉凤,刘湘黔.51单片机应用从零开始[M].北京:清华大学出版社,2008.[3]陈在平.现场总线及工业控制网络技术[M].北京:电子工业出版社,2008.[4]沈建华,杨艳琴.MSP430系列16位超低功耗单片机原理与实践[M].北北京航空航天大学出版社,2008.[5]张成伟.基于嵌入式Linix的GSM/GPRS无线通信模块的设计与实现[D].华中科技大学[6]赵亮GPRS无线网络在远程数据采集中的应用计算机工程与设计.2005.26(9).[7]马忠梅.单片机的C语言应用程序设计[M].北京:北京航空航天大学出版社,2003.[8]胡汉才.单片机原理及其接口技术[M].北京:清华大学出版社,2004.[9]雷霖.现场总线及工业控制网络技术[M].北京:电子工业出版社,2004.[10]许洪华.现场总线与工业以太网技术[M].北京:电子工业出版社,2007.

附录一#include<reg52.h>#include<INTRINS.H>/************************************************************/#defineucharunsignedchar#defineuintunsignedint#defineTIME(0X10000-50000)#defineFLAG0XEF//闹钟标志/************************************************************///引脚连接图sbitCLK=P1^2;sbitDAT=P1^3;sbitRST=P1^4;sbitRS=P1^5;sbitRW=P1^6;sbitE=P1^7;sbitP33=P3^3;sbitKEY1=P2^0;sbitKEY2=P2^1;sbitKEY3=P2^2;sbitKEY4=P2^3;/************************************************************///全局变量及常量定义uchari=20,j;ucharDataBuf[16]={};//日期ucharTimeBuf[16]={};//时间ucharalarm[2],time[3];ucharcodeDay[]={31,28,31,30,31,30,31,31,30,31,30,31};//12个月的最大日期(非闰年)//闰年月星期表constunsignedcharWeekTab[]={(3<<5)+31,///1月(6<<5)+29,///2月(0<<5)+31,///3月(3<<5)+30,///4月(5<<5)+31,//5月(1<<5)+30,//6月(3<<5)+31,//7月(6<<5)+31,//8月(1<<5)+30,//9月(4<<5)+31,//10月(0<<5)+30,//11月(2<<5)+31//12月};//音律表uintcodetable1[]={64260,64400,64524,64580,64684,64777,64820,64898,64968,65030,65058,65110,65157,65178,65217};//发声部分的延时时间ucharcodetable2[]={0x82,1,0x81,0xf4,0xd4,0xb4,0xa4,0x94,0xe2,1,0xe1,0xd4,0xb4,0xc4,0xb4,4,0};//闹钟中用的全局变量ucharth1,tl1;/************************************************************///延时1ms函数delay1ms(uchartime){uchari,j;for(i=0;i<time;i++){for(j=0;j<250;j++);}}/************************************************************///LCD控制函数Enable(){RS=0;RW=0;E=0;delay1ms(3);E=1;}/************************************************************///LCD1602写入字符函数LCD1602_WriteSChr(uchari){P0=i;RS=1;RW=0;E=0;delay1ms(2);E=1;}/************************************************************///LCD1602写入字符串函数//入口函数//uchardata*address:写入数据首地址//ucharm:写入字节数LCD1602_WriteStr(uchar*address,ucharm){uchari,j;for(i=0;i<m;i++,address++){j=*address;LCD1602_WriteSChr(j);}}/************************************************************///LCD显示voidLCDShow(void){P0=0XC;//显示器开、光标关Enable();//P0=0x80;//写入显示起始地址//Enable();//LCD1602_WriteStr(DataBuf,16);//写入日期显示缓存P0=0xc1;//写入显示起始地址Enable();LCD1602_WriteStr(TimeBuf,16);//写入时间显示缓存}/************************************************************///DS1302写入子程序voidDS1302_Write(uchartemp){uchari;CLK=0;//将DS1320时钟脉冲拉低_nop_();//延时一指令周期RST=1;//RST置高电平_nop_();//延时一指令周期for(i=0;i<8;i++)//循环8次{DAT=temp&0x01;//向DS1302写入一字节数据_nop_();//延时一指令周期CLK=1;//拉高时钟脉冲temp>>=1;//右移一位CLK=0;//拉低时钟脉冲}}/************************************************************///DS1302读取子程序ucharDS1302_Read(){uchari,j=0;for(i=0;i<8;i++)//循环8次{j>>=1;//右移一位_nop_();//延时一指令周期CLK=0;//拉低时钟脉冲_nop_();//延时一指令周期if(DAT)//判断接收该位数据是否为1j|=0x80;//该位置1_nop_();//延时一指令周期CLK=1;//拉高时钟脉冲}return(j);//返回数值}/************************************************************///部分显示数据初始化TimeStart(){TimeBuf[0]=TimeBuf[8]=TimeBuf[9]=TimeBuf[10]=0x20;//不显示字符TimeBuf[2]=TimeBuf[5]=':';//时间分隔显示DS1302_Write(0xc1);alarm[0]=DS1302_Read();RST=0;DS1302_Write(0xc3);alarm[1]=DS1302_Read();RST=0;DS1302_Write(0xc5);DataBuf[0]=DS1302_Read();RST=0;}/************************************************************///读取时间ReadTime(){uchari,m,n;for(m=0,i=0,n=0x85;i<7;i+=3,n-=2,m++)//连续读取时,分,秒{DS1302_Write(n);//写入读取寄存器指令time[m]=DS1302_Read();//读取数据RST=0;//将RST电平拉低,停止传输TimeBuf[i]=time[m]/16+0x30;//将两位数据的十位转为字符格式TimeBuf[i+1]=time[m]%16+0x30;//将两位数据的个位转为字符格式}}/************************************************************///功能选择超时定时器time0()interrupt1using1{i--;if(i==0){if(j!=0)j--;i=20;}TH0=TIME/256,TL0=TIME%256;}/************************************************************///产生闹铃音调intime1()interrupt3{TH1=th1,TL1=tl1;P32=!P32;}/************************************************************///闹钟显示voidAlarmShow(void){uchari,j,a,b,n;ET1=1;for(j=0;j<6;j++){i=0;while(1){a=table2[i];if(a==0)break;b=a&0xf;a>>=4;if(a==0){TR1=0;gotoD1;}a=((--a)<<1)/2;TH1=th1=table1[a]/256,TL1=tl1=table1[a]%256;TR1=1;D1:do{b--;for(n=0;n<3;n++){ReadTime();LCDShow();P2=0xff;if(KEY4==1){delay1ms(100);if(KEY4==1){TR1=0;ET1=0;P32=1;return;}}}}while(b!=0);i++;}TR1=0;}ET1=0;}/************************************************************///设置日期、时间voidSetTime(void){uchari=0xc2,year,month,day,n;TimeBuf[6]=TimeBuf[7]=0x30;DataBuf[14]=DataBuf[15]=0x20;LCDShow();while(1){P0=0xe;//显示器开、光标开Enable();P0=i;//定光标Enable();P2=0xff;if((KEY1==1)||(KEY2==1)||(KEY3==1)||(KEY4==1)){delay1ms(100);//延时0.1s去抖动if((KEY1==1)||(KEY2==1)||(KEY3==1)||(KEY4==1)){j=7;if(KEY1==1){i+=3;//更改设置项目if(i==0x8e)i=0xc2;elseif(i>0xc5)i=0xc2;}elseif(KEY2==1){year=(DataBuf[4]&0xf)*10+(DataBuf[5]&0xf);//将字符格式的年份转换为数值格式month=(DataBuf[7]&0xf)*10+(DataBuf[8]&0xf);//将字符格式的月份转换为数值格式day=(DataBuf[10]&0xf)*10+(DataBuf[11]&0xf);//将字符格式的日数转换为数值格式if(i==0x85)//设置年份{year++;if(year>99)year=0;if((year%4)!=0)if(month==2&&day==29)day=28;}elseif(i==0x88)//设置月份{month++;if(month>12)month=1;if(day>Day[month-1]){day=Day[month-1];if(month==2&&(year%4)==0)//计算是否闰年day=29;}}elseif(i==0x8b)//设置日期{day++;if(day>Day[month-1]){if(month==2&&(year%4)==0)//计算是否闰年{if(day>29)day=1;}if(month!=2)day=1;}}elseif(i==0xc2)//设置小时{n=(TimeBuf[0]&0xf)*10+(TimeBuf[1]&0xf);n++;if(n>23)n=0;TimeBuf[0]=n/10+0x30;TimeBuf[1]=n%10+0x30;}else//设置分钟{n=(TimeBuf[3]&0xf)*10+(TimeBuf[4]&0xf);n++;if(n>59)n=0;TimeBuf[3]=n/10+0x30;TimeBuf[4]=n%10+0x30;}DataBuf[4]=year/10+0x30;//将数值格式的日期转换为字符形式DataBuf[5]=year%10+0x30;DataBuf[7]=month/10+0x30;DataBuf[8]=month%10+0x30;DataBuf[10]=day/10+0x30;DataBuf[11]=day%10+0x30;LCDShow();}elseif(KEY3==1)//按保存退出键后,向DS1302写入设置后的日期时间{DS1302_Write(0x8c);DS1302_Write((DataBuf[4]&0xf)*16+(DataBuf[5]&0xf));RST=0;DS1302_Write(0x8a);DS1302_Write(SetWeek());RST=0;for(i=7,n=0x88;i<11;i+=3,n-=2){DS1302_Write(n);DS1302_Write((DataBuf[i]&0xf)*16+(DataBuf[i+1]&0xf));RST=0;}for(i=0;i<7;i+=3,n-=2){DS1302_Write(n);DS1302_Write((TimeBuf[i]&0xf)*16+(TimeBuf[i+1]&0xf));RST=0;}TR0=0;return;}else{TR0=0;return;}}}if(j==0){TR0=0;return;}}}/************************************************************///设置闹钟voidSetAlarm(void){uchari,n;for(i=1;i<16;i++){DataBuf[i]=0x20;}TimeBuf[0]=alarm[0]/16+0x30;TimeBuf[1]=(alarm[0]&0xf)+0x30;TimeBuf[3]=alarm[1]/16+0x30;TimeBuf[4]=(alarm[1]&0xf)+0x30;TimeBuf[6]=TimeBuf[7]=0x30;LCDShow();i=0xc2;while(1){P0=0xe;//显示器开、光标开Enable();P0=i;//定光标Enable();P2=0xff;if((KEY1==1)||(KEY2==1)||(KEY3==1)||(KEY4==1)){delay1ms(100);//延时0.1s去抖动if((KEY1==1)||(KEY2==1)||(KEY3==1)||(KEY4==1)){j=7;if(KEY1==1){i+=3;if(i>0xc5)i=0xc2;}elseif(KEY2==1){if(i==0xc2){n=(TimeBuf[0]&0xf)*10+(TimeBuf[1]&0xf);n++;if(n>23)n=0;TimeBuf[0]=n/10+0x30;TimeBuf[1]=n%10+0x30;}else{n=(TimeBuf[3]&0xf)*10+(TimeBuf[4]&0xf);n++;if(n>59)n=0;TimeBuf[3]=n/10+0x30;TimeBuf[4]=n%10+0x30;}LCDShow();}elseif(KEY3==1){DS1302_Write(0xc0);DS1302_Write((TimeBuf[0]&0xf)*16+(TimeBuf[1]&0xf));RST=0;DS1302_Write(0xc2);DS1302_Write((TimeBuf[3]&0xf)*16+(TimeBuf[4]&0xf));RST=0;DataBuf[0]=FLAG;DS1302_Write(0xc4);DS1302_Write(DataBuf[0]);RST=0;TR0=0;TimeStart();return;}else{TR0=0;TimeStart();return;}}}if(j==0){TR0=0;TimeStart();return;}}}/************************************************************///DS1302初始化程序voidDS1302_Init(void){uchari,n;DS1302_Write(0x8c);DS1302_Write((DataBuf[4]&0xf)*16+(DataBuf[5]&0xf));RST=0;DS1302_Write(0x8a);DS1302_Write(SetWeek());RST=0;for(i=7,n=0x88;i<11;i+=3,n-=2){DS1302_Write(n);DS1302_Write((DataBuf[i]&0xf)*16+(DataBuf[i+1]&0xf));RST=0;}for(i=0;i<7;i+=3,n-=2){DS1302_Write(n);DS1302_Write((TimeBuf[i]&0xf)*16+(TimeBuf[i+1]&0xf));RST=0;}}/************************************************************///主函数main(){IE=0x82;TMOD=0x11;DS1302_Write(0x8E);//禁止写保护DS1302_Write(0);RST=0;P0=1;//清屏并光标复位Enable();P0=0x38;//设置显示模式:8位2行5x7点阵Enable();P0=6;//文字不动,光标自动右移Enable();DS1302_Init();TimeStart();while(1){ReadTime();//读取时间LCDShow();//显示时间if(DataBuf[0]!=0x20)if(time[0]==alarm[0])if(time[1]==alarm[1])if(time[2]==0)AlarmShow();P2=0xff;if((KEY1==1)||(KEY2==1)||(KEY3==1)){delay1ms(100);//延时0.1s去抖动if((KEY1==1)||(KEY2==1)||(KEY3==1)){j=7;TH0=TIME/256,TL0=TIME%256;TR0=1;if(KEY1==1){SetTime();}elseif(KEY2==1){SetAlarm();}elseif(KEY3==1){TR0=0;if(DataBuf[0]==FLAG)DataBuf[0]=0x20;elseDataBuf[0]=FLAG;DS1302_Write(0xc4);DS1302_Write(DataBuf[0]);RST=0;}}}delay1ms(100);}}基于C8051F单片机直流电动机反馈控制系统的设计与研究基于单片机的嵌入式Web服务器的研究MOTOROLA单片机MC68HC(8)05PV8/A内嵌EEPROM的工艺和制程方法及对良率的影响研究基于模糊控制的电阻钎焊单片机温度控制系统的研制基于MCS-51系列单片机的通用控制模块的研究基于单片机实现的供暖系统最佳启停自校正(STR)调节器单片机控制的二级倒立摆系统的研究基于增强型51系列单片机的TCP/IP协议栈的实现基于单片机的蓄电池自动监测系统基于32位嵌入式单片机系统的图像采集与处理技术的研究基于单片机的作物营养诊断专家系统的研究基于单片机的交流伺服电机运动控制系统研究与开发基于单片机的泵管内壁硬度测试仪的研制基于单片机的自动找平控制系统研究基于C8051F040单片机的嵌入式系统开发基于单片机的液压动力系统状态监测仪开发模糊Smith智能控制方法的研究及其单片机实现一种基于单片机的轴快流CO〈,2〉激光器的手持控制面板的研制基于双单片机冲床数控系统的研究基于CYGNAL单片机的在线间歇式浊度仪的研制基于单片机的喷油泵试验台控制器的研制基于单片机的软起动器的研究和设计基于单片机控制的高速快走丝电火花线切割机床短循环走丝方式研究基于单片机的机电产品控制系统开发基于PIC单片机的智能手机充电器基于单片机的实时内核设计及其应用研究基于单片机的远程抄表系统的设计与研究基于单片机的烟气二氧化硫浓度检测仪的研制基于微型光谱仪的单片机系统单片机系统软件构件开发的技术研究基于单片机的液体点滴速度自动检测仪的研制基于单片机系统的多功能温度测量仪的研制基于PIC单片机的电能采集终端的设计和应用基于单片机的光纤光栅解调仪的研制气压式线性摩擦焊机单片机控制系统的研制基于单片机的数字磁通门传感器基于单片机的旋转变压器-数字转换器的研究基于单片机的光纤Bragg光栅解调系统的研究单片机控制的便携式多功能乳腺治疗仪的研制基于C8051F020单片机的多生理信号检测仪基于单片机的电机运动控制系统设计Pico专用单片机核的可测性设计研究基于MCS-51单片机的热量计基于双单片机的智能遥测微型气象站MCS-51单片机构建机器人的实践研究基于单片机的轮轨力检测基于单片机的GPS定位仪的研究与实现基于单片机的电液伺服控制系统用于单片机系统的MMC卡文件系统研制基于单片机的时控和计数系统性能优化的研究基于单片机和CPLD的粗光栅位移测量系统研究单片机控制的后备式方波UPS提升高职学生单片机应用能力的探究基于单片机控制的自动低频减载装置研究基于单片机控制的水下焊接电源的研究基于单片机的多通道数据采集系统基于uPSD3234单片机的氚表面污染测量仪的研制基于单片机的红外测油仪的研究96系列单片机仿真器研究与设计基于单片机的单晶金刚石刀具刃磨设备的数控改造基于单片机的温度智能控制系统的设计与实现基于MSP430单片机的电梯门机控制器的研制基于单片机的气体测漏仪的研究基于三菱M16C/6N系列单片机的CAN/USB协议转换器基于单片机和DSP的变压器油色谱在线监测技术研究基于单片机的膛壁温度报警系统设计基于AVR单片机的低压无功补偿控制器的设计基于单片机船舶电力推进电机监测系统基于单片机网络的振动信号的采集系统基于单片机的大容量数据存储技术的应用研究基于单片机的叠图机研究与教学方法实践基于单片机嵌入式Web服务器技术的研究及实现基于AT89S52单片机的通用数据采集系统基于单片机的多道脉冲幅度分析仪研究机器人旋转电弧传感角焊缝跟踪单片机控制系统基于单片机的控制系统在PLC虚拟教学实验中的应用研究基于单片机系统的网络通信研究与应用基于PIC16F877单片机的莫尔斯码自动译码系统设计与研究基于单片机的模糊控制器在工

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论