毕业设计(论文)电子万历设计.doc
摘 要随着科技的不断发展以及集成电路的发展单片机的应用正不断的深入。单片机芯片体积小、功能强、成本低,可广泛地嵌入到如工业控制单元、机器人、智能仪器仪表、汽车电子系统、家用电器、办公自动化设备、金融电子系统、玩具、个人信息终端及通信产品中。万年历是一种应用非常广泛的日常计时工具,给我带来了诸多方便,而液晶显示的日历时钟以其读取方便、显示直观、功能多样、适用性广泛等优点深受大家喜爱。本设计就是以单片机为核心,用时钟芯片进行计时,液晶显示模块做为显示,设计一个电子万年历,具备能显示年、月、日、时、分、秒、及星期信息功能,调整时间和日期功能以及电子闹钟功能。关键字:单片机;万年历;时钟芯片;液晶显示 Abstract With the continuous development of science and technology and the development of integrated circuits of the single chip microcomputer application is constant depth. Single chip microcomputer chip small volume, the function is strong, low cost, can be widely em- bedded in such as industrial control unit, robot, intelligent instruments, automobile electro- nic system, home appliances, office automation equipment, financial electronic system, to- ys, personal information terminals and communication products.Calendar is a very extensive daily timing tool, brought me many convenient, and liquid crystal display calendar clock with its convenient, direct display read, functional diversity, applicability widely advantages very popular. This design is with the single chip processor as the core, with the clock chips for time, liquid crystal display module as a display, design a electronic calendar, have can show date and time, minutes and seconds, and week information function, adjust the time and date function and electronic alarm clock function.Key words : single-chip microcomputer ; target clock generator ; liquid-crystal display 目录摘 要IAbstractII1 绪论1 1.1 引言1 1.2 设计所实现目标及总体方案1 1.2.1 实现目标1 1.2.2 总体方案12 系统硬件设计3 2.1 电源模块3 2.2 单片机最小系统模块3 2.2.1 STC89C52单片机功能介绍3 2.2.2 STC89C52引脚介绍4 2.2.3 复位电路5 2.2.4 晶振电路5 2.3 显示模块设计6 2.3.1 1602LCD引脚介绍6 2.3.2 1602LCD操作时序介绍7 2.3.3 1602LCD与单片机的连接电路7 2.4 时钟计算模块设计8 2.4.1 DS1302引脚介绍8 2.4.2 DS1302相关寄存器介绍9 2.4.3 DS1302与单片机接口电路9 2.5 闹钟模块11 2.6 按键设置模块113 系统软件设计12 3.1 主程序流程图12 3.2 读写DS1302程序13 3.3 LCD1602显示程序14 3.4 闹钟程序15 3.5 时钟调整程序15毕业设计总结19参考文献20附录I:系统硬件电路21附录:源程序代码23附录: 实物图42致谢431 绪论1.1 引言现在社会不断的在发展,人们生活节奏的不断加快,人们对时间的要求也越来越高,人们走到哪里都需要能很方便的读取时间。随着科技的发展,电子产品得到飞速的发展,现在电子万年历已经成了人们生活中必不可少的工具,电子万年历现在已经应用到个个地方,给人们的生活带来了极大的方便。1.2 设计所实现目标及总体方案1.2.1 实现目标本设计采用单片机为控制芯片,液晶显示做为显示,要求能显示年、月、日、星期、时、分、秒、闹钟时间、闹钟开关等信息,日历显示为阳历,时间为24小时制显示,用户可以自己调整年、月、日、星期、时、分、秒等信息,可以自己设定闹钟时间和闹钟开关情况。1.2.2 总体方案本设计采用STC89C52单片机为核心的单片机控制芯片,利用单片机强大的控制能力及其控制的准确性,灵活的编程设计和丰富的IO端口,通过与DS1302时钟芯片进行不断通信从而获得实时时间,并将获得的信息通过1602LCD显示出来,还可以通过相应的不同按键调整相应的值。 本设计系统可以分为硬件部分和软件部分两大部分,其中硬件部分可以分为六个模块:电源输入模块,单片机控制模块,显示模块,时钟计算模块,闹钟模块,按键设置模块。软件部分包括主程序、初始化程序、LCD显示程序、读/写DS1302数据程序、设置程序,闹钟程序,延时程序等组成。系统总体方案设计原理框图1-1所示。STC89C52单片机时间计算模块(DS1302)电源输入复位电路显示模块(1602LCD)时钟电路闹钟模块按键电路 图1-1 系统总体方案设计原理框图 2 系统硬件设计系统硬件部分主要包括电源模块,单片机最小系统模块,显示模块,时钟计算模块,闹钟模块,按键设置模块等6个模块,下面我们对每个模块逐一介绍。2.1 电源模块本设计中要应用到5V电源,但是家用电源电压是220V,所以5V电源就需要自己设计制作。下图为自己制作的一个简易电源电路图,该电源的元件:变压器一个,二极管四个,7085一个,极性1000uf电容一个,极性220uf电容一个,自锁开关一个。电路如2-1所示。 图2-1 电源电路2.2 单片机最小系统模块本模块主要有STC89C52及其复位电路和时钟电路等外围电路组成。2.2.1 STC89C52单片机功能介绍STC89C52单片机主要功能:表2-1 SYC89C52功能兼容MCS51指令系统8K可反复擦写Flash ROM32个双向I/O口256x8bit内部RAM3个16位可编程定时/计数器中断时钟频率0-24MHz2个串行中断2个外部中断源低功耗空闲和掉电模式2.2.2 STC89C52引脚介绍引脚结构如图2-2所示: 图2-2 STC89C52引脚图引脚功能说明: 主电源引脚(2根)VCC(P40):电源输入,接5V电源GND(P20):接地线外接晶振引脚(2根)XTAL1(P19):片内振荡电路的输入端XTAL2(P20):片内振荡电路的输出端控制引脚(4根)RST/VPP(P9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。ALE/PROG(P30):地址锁存允许信号PSEN(P29):外部存储器读选通信号EA/VPP(P31):程序存储器的内外部选通,接低电平从外部程序存储器读指令,如果接高电平则从内部程序存储器读指令。可编程输入/输出引脚(32根)STC89C52单片机有4组8位的可编程I/O口,分别位P0、P1、P2、P3口,每个口有8位(8根引脚),共32根。PO口(P39P32):8位双向I/O口线,名称为P0.0P0.7P1口(P1P8):8位准双向I/O口线,名称为P1.0P1.7 P2口(P21P28):8位准双向I/O口线,名称为P2.0P2.7 P3口(P10P17):8位准双向I/O口线,名称为P3.0P3.72.2.3 复位电路单片机复位是使CPU和系统中的其他功能部件都处在一个确定的初始状态, 并从这个状态开始工作。无论是在单片机刚开始接上电源时, 还是断电后或者发生故障后都要复位。89系列单片机的复位信号是从RST引脚输人到芯片的施密特触发器中的。当系统处于正常工作状态时, 且振荡器稳定后, 如果RST引脚有一个高电平并维持2个机器周期(24个振荡周期), 则CPU就可响应并且将系统复位。当STC89C52进行复位时,PC初始化为0000H,使STC89C52单片机从程序存储器的0000H单元开始执行程序。复位电路通常采用上电自动复位和手动按钮复位两种方式,本设计系统采用的是手动按钮复位。系统复位电路如图2-3所示。图2-3 复位电路2.2.4 晶振电路晶振是用一种能把电能和机械能相互转化的晶体在共振的状态下工作,以提供稳定,精确的单频振荡。晶振的作用是为系统提供基本的时钟信号,AT89C52内部有一个用于构成片内振荡器的高增益反相放大器, 振荡器产生的信号送到CPU, 作为CPU的时钟信号,驱动CPU产生执行指令功能的机器周期。引脚XTAL1和XTAL2是此放大器的输人端和输出端。这个放大器与作为反馈元件的片外石英晶体或陶瓷谐振器一起可构成一个自激振荡器, 振荡电路的连接如下图所示,外接石英晶体或陶瓷谐振器以及电容C1和C2构成并联谐振电路, 接在放大器的反馈回路中。振荡信号频率与晶振频率及电容C1、C2的容量有关,但主要由晶振频率决定,外接石英晶体时, C1和C2一般取5pF-30pF, 本设计中C1、C2选择标称值30pF,晶振为11.0592MHZ。系统振荡电路如下图2-4所示:图2-4 晶振电路2.3 显示模块设计 液晶显示器具有体积小、功耗低、直观、清晰、显示操作简单,采用LCD显示克服了LED数码管显示单一的缺点,使设计的电子万年历更具有可观赏性,本设计用的是1602LCD显示,1602型LCD工作电压为+5v,可以显示2行16个字符,有8位数据总线D0-D7和RS,R/W,EN三个控制端口,可直接与单片机接口相接,电源直接与电源电路相接,使用单片机的P0口和P2口与1602进行通信。2.3.1 1602LCD引脚介绍1602LCD有16个引脚,引脚图如下图2-5: 图2-5 LCD1602引脚图1602LCD的各引脚接口说明如下表2-2: 表2-2 1602引脚接口介绍编号符号引脚说明编号符号引脚说明1GND电源地9D2数据2VCC电源正极10D3数据3VO对比度调节11D4数据4RS数据/命令选择(H/L)12D5数据5R/W读/写(H/L)13D6数据6E使能信号14D7数据7D0数据15BG VCC背光源正极8D1数据16BG GND背光源负极2.3.2 1602LCD操作时序介绍因为本设计中只需要将数据写到1602LCD中不需要读数据这里只介绍两个写时序。写指令:输入:RS=L,RW=L,E=高脉冲,DB0DB7=指令码;输出:无 写数据:输入:RS=H,RW=L,E=高脉冲,DB0DB7=数据; 输出:无 (关于E=高脉冲:开始时初始化E为0,然后置E为1,再将E置为0)2.3.3 1602LCD与单片机的连接电路 本设计中用的是单片机的P0口和P2口与1602LCD进行通信具体电路图如图2-6所示。图2-6 1602LCD与单片机接口电路工作过程:向1602写入指令时,单片机先将1602LCD的RS(P2.0)、RW(P2.1)、E(P2.2)等引脚置为低电平,再将指令码从DB0DB7(P0)传给1602LCD,再将E置为高电平后再置为低电平,1602LCD检测到CE的高脉冲后就将DB0DB7数据口上的指令码读取,这样就完成了一次指令的写入。向1602写入数据时,先将1602LCD的RS(P2.0)引脚置为高电平,RW(P2.1)、E(P2.2)等置为低电平,再将数据从DB0DB7(P0)传给1602LCD,再将E置为高电平后再置为低电平,1602LCD检测到CE的高脉冲后就将DB0DB7数据口上的数据读取,这样就完成了一次数据的写入。2.4 时钟计算模块设计DS1302是一种低功耗实时时钟芯片,附加31字节静态RAM,采用SPI(高速同步串行口)三线接口与CPU 进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM 数据。它可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能。工作电压宽达2.55.5V。采用双电源进行供电,即使电源掉电后通过3V的纽扣电池仍能维持DS1302精确走时。2.4.1 DS1302引脚介绍DS1302引脚图如2-7图所示。 图2-7 DS1302引脚图各引脚的功能为:1、5V电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。2、X1 X2是外接晶振脚 (32.768KHZ的晶振)4、电源地(GND)5、CE/RST:复位脚,输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,CE提供终止单字节或多字节数据的传送手段。6、I/O:数据输入/输出口。7、 SCLK:串行时钟输入,控制数据的输入输出。8、Vcc1:备用电池端。2.4.2 DS1302相关寄存器介绍 DS1302有关日历、时间的寄存器有12个,其中7个存放时间数据的寄存器(读时81H8F,写时80H8EH)如表2-3,数据以BCD码形式存放在寄存器中。 表2-3 DS1302相关寄存器年星期月日时分秒读写8DH8CH8BH8AH89H88H87H86H85H84H83H82H81H80H2.4.3 DS1302与单片机接口电路本设计中用的是单片机的P2口的P2.3、P2.4、P2.5与DS1302进行通信具体电路图如图2-8:图2-8 DS1302与单片机接口电路工作过程:DS1302的2、3号引脚接的是32768HZ的晶振,可以为DS1302的提供精确走时。DS1302的数据读写是通过I/O串行口进行的,进行一次读写操作时可以读写两个字节,读写的第一个字节是控制字节,就是一个命令,告诉DS1302是进行读操作还是进行写操作,以及要操作的地址。第二个字节就是要进行读或写的数据了。我们先看单字节写:在进行操作之前单片机先得将CE(P2.5)、SCLK(P2.4)置低电平,再将CE置高电平,然后单片机将控制字的位0放到I/O上,将SCLK置高电平,DS1302检测到SCLK的上升沿后就会读取I/O上的数据,然后单片机将SCLK(P2.3)置为低电平,再将控制字的位1放到I/O上,再将SCLK置为高电平,如此反复操作8次,就将一个字节的控制字的8个位全部传给了DS1302。紧接着就是传一个字节的数据给DS1302,操作和前面一样,当传完数据后,单片机将CE置为低电平,操作结束。单字节读操作的一开始写控制字的过程和上面的单字节写操作是一样,但是单字节读操作在写控制字的最后一个位,SCLK还处于高电平时,DS1302就将数据放到I/O上,单片机将SCLK置为低电平后数据锁存,单机机就可以读取I/O上的数据。如此反复操作8次,将一个字节的数据读入单片机。读与写操作的不同的地方就在于,进行写操作时是在SCLK低电平时单片机将数据放到IO上,当SCLK上升沿时,DS1302读取。而进行读操作时是在SCLK高电平时DS1302放数据到IO上,将SCLK置为低电平后(即下降沿),单片机就可从IO上读取数据。2.5 闹钟模块本设计中闹钟模块由蜂鸣器来发出声音来实现,蜂鸣器与单片机的接口电路如2-9图:图2-9 蜂鸣器与单片机的接口电路工作原理:因为单片机个IO口默认输出为高电平,系统加电后PNP不导通,所以蜂鸣器不发出声音,当程序满足闹钟条件时单片机将P2.7口置为电平,此时PNP导通,蜂鸣器发出响声,从而实现闹钟功能。2.6 按键设置模块 按键设置模块采用四个按键与P1.4、P1.5、P1.6、P1.7相接,另一端接地,接口电路如图2-10所示。 图2-10 按键电路 其中K1键为进入设置位选择键,K2键为增加键,K3键为减小键,K4键为退出设置键当有键按下后,对应的单片机的引脚就变成低电平,单片机根据对应程序执行相应的命令。3 系统软件设计软件是系统的灵魂,在软件的支配下硬件电路才能正常工作,整个系统才能实现既定的功能。软件的设计又是建立在硬件的基础上的,通过编写程序,使得CPU能够按照人们设想给出脉冲从而在硬件电路上实现其功能。由于STC89C52不具有SPI三线接口,所以必须通过程序来模拟SPI通信,对DS1302进行读、写操作。本设计采用C语言编程。C语言简洁紧凑、灵活方便,运算符丰富,语言限制宽松,程序设计自由度大,且程序生成的代码质量高,程序执行效率高,所以本设计的软件选择用C51编写。本软件设计中,依据系统的功能要求,将整体软件系统分割成若干个独立的程序模块,包括:主程序,显示欢迎界面程序,LCD显示程序,LCD、DS1302初始话程序,读/写DS1302程序,设置程序,闹钟程序等等。3.1 主程序流程图 系统的主程序流程图如上图,开机后程序进行初始化设置,初始化设置包括设置单机的定时中断、定时器工作方式,以及DS1302和1602LCD的初始化设置。系统初始化以后,LCD显示开机欢迎词,然后单片机机从DS1302读取实时时间并传送给1602LCD显示。当SET键(K1)按下后程序进入设置程序,当到了闹钟时间并且开了闹钟则进入闹钟程序。开始系统初始化显示欢迎界面从DS1302读取时间液晶显示相关信息数据写入DS1302 SET是否 按下设置程序 Y N 判断是否满足闹钟条件闹钟程序N Y 图3-1 主程序流程图 3.2 读写DS1302程序 本设计中STC89C52单片机通过P2.3(接串行时钟SCL)和P2.4(接串行IO)P2.5(接CE)来模拟SPI三线接口,实现与DS1302进行数据交换。具体工作过程如下: 将数据写入DS1302:在进行操作之前单片机先得将CE、SCLK置低电平,再将CE置高电平,然后单片机将控制字的位0放到I/O上,将SCLK置高电平,DS1302检测到SCLK的上升沿后就会读取I/O上的数据,然后单片机将SCLK置为低电平,再将控制字的位1放到I/O上,再将SCLK置为高电平,如此反复操作8次,就将一个字节的控制字的8个位全部传给了DS1302。紧接着就是传一个字节的数据给DS1302,操作和前面一样,当传完数据后,单片机将CE置为低电平,操作结束,这样就完成一次控制字+数据的写入。 从DS1302读数据:单字节读操作的一开始写控制字的过程和上面的单字节写操作是一样,但是单字节读操作在写控制字的最后一个位,SCLK还处于高电平时,DS1302就将数据放到I/O上,单片机将SCLK置为低电平后数据锁存,单机机就可以读取I/O上的数据。如此反复操作8次,将一个字节的数据读入单片机。读与写操作的不同的地方就在于,进行写操作时是在SCLK低电平时单片机将数据放到IO上,当SCLK上升沿时,DS1302读取。而进行读操作时是在SCLK高电平时DS1302放数据到IO上,将SCLK置为低电平后(即下降沿),单片机就可从IO上读取数据。这样就完成一次控制字写入和数据的读取。3.3 LCD1602显示程序 本设计中单片机通过P0口(接DB0DB7)、P2.0(接RS)、P2.1(接RW)、P2.2(接E)来与1602LCD进行通信。流程图如下向1602写入指令向1602写入数据1602LCD显示 图3-2 LCD显示流程图向1602写入指令时,单片机先将1602LCD的RS(P2.0)、RW(P2.1)、E(P2.2)等引脚置为低电平,再将指令码从DB0DB7(P0)传给1602LCD,再将E置为高电平后再置为低电平,1602LCD检测到CE的高脉冲后就将DB0DB7数据口上的指令码读取,这样就完成了一次指令的写入。 向1602写入数据时,先将1602LCD的RS(P2.0)引脚置为高电平,RW(P2.1)、E(P2.2)等置为低电平,再将数据从DB0DB7(P0)传给1602LCD,再将E置为高电平后再置为低电平,1602LCD检测到CE的高脉冲后就将DB0DB7数据口上的数据读取,这样就完成了一次数据的写入。3.4 闹钟程序 本程序比较简单,先判断实时时间的小时和分钟是否与设定的闹钟的小时分钟相等且实时时间的秒钟为0,再判断闹钟是否处于开状态,若为关状态则不执行命令,若为开状态则调用闹钟程序单片机将P2.7置为低电平,PNP导通蜂鸣器发出响声,并在1602LCD上显示“TIME UP!”。当按下退出键K4(即P1.7为低电平)时,退出闹钟程序,单片机将P1.7置为高电平,PNP不导通,蜂鸣器不发出声音。详细程序如下: if(hours=houra)&&(minutes=minutea)&&(seconds=0) if(alarmmode!=0)Write_com(0x01);delay1ms(5);Write_Address(0x03);Write_Date('T');Write_Date('I');Write_Date('M');Write_Date('E');Write_Address(0x08);Write_Date('U');Write_Date('P');Write_Date('!');delay1ms(400); baojing(); Write_com(0x01);delay1ms(5);displaymainpart();display_Time( ); Hours为实时小时时间,minutes为实时分钟时间,houra为闹钟小时时间,minutea为闹钟分钟时间,alarmmode为闹钟开关状态变量,为0时闹钟关闭,为1时闹钟开启。3.5 时时钟调整程序 程序流程图如下图3-2所示。秒清0设置键(k1)有效进入年设置减键有效加键有效年减1年加1等待按键按下减键有效加键有效等待按键按下设置键(k1)有效进入秒设置开始等待按键按下设置键(k1)有效进入时设置减键有效加键有效时减1时加1等待按键按下设置键(k1)有效进入分设置减键有效加键有效分减1分加1等待按键按下设置键(k1)有效进入月设置减键有效加键有效月减1月加1等待按键按下设置键(k1)有效进入日设置减键有效加键有效日减1日加1等待按键按下设置键有效进入闹钟时设置减键有效加键有效时减1时加1等待按键按下设置键有效进入闹钟分年设置减键有效加键有效分减1分加1等待按键按下设置键有效进入闹钟开关设置减键有效加键有效闹钟开关状态取反等待按键按下设置键(k1)有效进入星期设置减键有效加键有效星期减1星期加1退出设置退出键(k4)有效图3-2 时钟调整程序流程图 设置程序工作过程:设置位选择键K1、增加键K2、减小键K3、退出键K4分别与单片机P1.4、P1.5、P1.6、P1.7相接,另一端接地。本程序主要由一个switch语句实现,每次当设置键(K1)按下时即P1.4口为低电平时变量mode加1,mode=1时调用小时调整函数可以对小时进行调整,mode=2时调用分钟调整函数可以对分钟进行调整,mode=3时调用秒调整函数可以对秒进行调整,mode=4时调用年调整函数可以对年进行调整,mode=5时调用月调整函数可以对月进行调整,mode=6时调用日调整函数可以对日进行调整,mode=7时调用闹钟小时调整函数可以对闹钟小时进行调整,mode=8时调用闹钟分钟调整函数可以对闹钟分钟进行调整,mode=9时调用闹钟开关调整函数可以对闹钟开关进行设置,mode=10时调用星期调整函数可以对星期进行调整,当mode=11时将mode重新置为1。当有K4键按下是程序退出设置。毕业设计总结在做毕业设计之前我做了比较多的准备,看了很多的资料和网络教程,深入学习了单片机,1602LCD液晶显示器,DS1302时钟芯片元件的应用。学会了用Altium Designer画原理图,画PCB板,用C51编写单片机程序。通过这次制作毕业设计,我发现在现实设计中还需要注意很多的细节,包括程序设计和硬件设计都要我们小心仔细。在硬件设计时,焊实物之前要先对各个元件的位置布局有个充分了解,不然焊的时候会造成很多地方要飞线,影响美观,焊的时候不要过长以免损坏元件。在写程序时,要不断的调试程序,根据实物情况检查程序的问题所在有事半功倍的效果。从最基本的方案制定,到硬件电路的选择,再到电路版的焊接,最后进行软件的调试。在此期间遇到过很多的困难,但经过自己的不屑努力,以及老师和同学的帮助,终于击破各个难点,达到的所需的效果也因为这次设计,我也在这次实训中学会了很多东西,总结出自已的一套解决问题的方法,这让我觉得自已有了很大的收获,为今后的学习和工作打下了坚定的基础。 参考文献1 张毅刚,彭喜元,彭宇编著. 单片机原理及应用M. 北京:高等教育出版社 2 史久贵编著. 基于Altium Designer的原理图与PCB设计M. 北京:机械工业出版社3 郭天祥.51单片机C语言教程M. 北京:电子工业出版社 2009 4 谭浩强.C程序设计(第二版)M. 北京:清华大学出版社 1999 5 五校半导体科学研究跃进战斗团编著. 光敏电阻的制造及其应用M. 北京:民邮电出版社 19596王庆泽,赵翠敏.关于产蛋鸡补光和补钙J. 河北唐山:四川畜牧兽医, Sichuan Animal and Veterinary Sciences, 编辑部邮箱 2004年 12期 .7 H M Peitel,P L Deitel.C How to program,second Edition.蒋才鹏等译. C程序设计教程。北京:机械工业出版社,20008 Stephen G Kochan 著.Programming in ANSI C. Hagden Kooks Indianapolis:Indiana U.S.A,199498-bit Microcontroller With 8K Bytes Flash AT89C52. ATMEL,1999附录I:系统硬件电路附录:源程序代码#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar code displaywelcome="Happy Every Day"/欢迎界面uchar code digit="0123456789" /数字代码uchar mode,amode,alarmmode=1,minutes,hours,minutea,seconds,houra=12; week;sbit SCLK=P23;/DS1302时钟输入sbit IO=P24;/DS1302数据输入sbit RST=P25;/DS1302复位端口sbit SET=P14;/DS1302设置模式选择位sbit ADD=P15;/增加sbit RED=P16;/减小sbit CANL=P17;void delay1ms(uint i)/1毫秒延时 uint j; for( ;i>0;i-) for(j=0;j<333;j+) ; void delaynus(uchar n) /延时若干微秒 uchar i; for(i=0;i<n;i+);/*蜂鸣器模块*/ sbit beep=P27;/位定义,定义P.6位fmpvoid baojing(void) while(1) beep=0; if(CANL=0) beep=1; break; /*DS1302模块*/ void Write1302(uchar date)/向1302写数据 uchar i;SCLK=0;delaynus(2);for(i=0;i<8;i+)IO=date&0x01;SCLK=1;delaynus(2);SCLK=0;delaynus(2);date>>=1; void WriteSet1302(uchar cmd,uchar date) /根据相应的命令输入相应的数据 RST=0;SCLK=0;RST=1;Write1302(cmd);delaynus(5);Write1302(date);SCLK=1;RST=0; uchar Read1302(void)/读取1302数据 uchar i,date;delaynus(2);for(i=0;i<8;i+)date>>=1;if(IO=1)date|=0x80;SCLK=1;delaynus(2);SCLK=0;delaynus(2);return date; uchar ReadSet1302(uchar cmd)/根据命令读取1302相应的值uchar date;RST=0;SCLK=0;RST=1;Write1302(cmd);delaynus(2);date=Read1302();SCLK=1;RST=0;return date;void IntDS1302(void) /DS1302初始化 uchar flag; flag= ReadSet1302(0x81);if(flag&0x80) /判断时钟芯片是否关闭 WriteSet1302(0x8E,0x00); /根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,(0/10)<<4|(0%10); /根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,(0/10)<<4|(0%10); /根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,(0/10)<<4|(0%10); /根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,(0/10)<<4|(0%10); /根据写日寄存器命令字,写入日的初始值WriteSet1302(0x88,(0/10)<<4|(0%10); /根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,(10/10)<<4|(10%10