基于单片机的电子万年历设计_第1页
基于单片机的电子万年历设计_第2页
基于单片机的电子万年历设计_第3页
基于单片机的电子万年历设计_第4页
基于单片机的电子万年历设计_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

1、毕业设计报告(论文)摘要随着科技的快速发展,时间的流逝,至从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。美国DALLAS公司推出的具有涓细电流充电能的低功耗实时时钟电路DS1302。它可以对年、月、日、周日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。该电路采用AT89S52单片机作为核心,功耗小,能在3V的低压工作,电压可选用35V电压供电。综上所述此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,符合电子仪

2、器仪表的发展趋势,具有广阔的市场前景。本电路为实现电子万年历的功能,采用单片机AT89S52,辅助以必要的外围电路,用C语言编写程序,并进行模块化设计而成的电子万年历系统.它通过LCD能正确显示阴阳历星期和时分秒,具有功能稳定,精确度高和可调的特点。关键词: 单片机AT89S52;DS1302;LCD;AbstractAlong with the rapid development of technology, the passage of time, to view the sun, from the pendulum clocks are now electric clock, human

3、 continuously research, innovation record. The United States out Juan DALLAS has fine current charge of low power consumption can real time clock circuit DS1302. It can be to year, month, day, Sunday, when, minutes and seconds for the time, also has a leap year compensation and other functions, and

4、the DS1302 long service life and small error. For digital electronic calendar using intuitive digital display, can also shows that year, month, day, Sunday, when, minutes and seconds and temperature, information, but also has time calibration etc. Function. This circuit AT89S52 SCM as the core, powe

5、r consumption is small, can be in 3 V of low-pressure work, voltage can choose 3 5 V voltage power supply. To sum up the calendar has read the convenient, direct display, functional diversity, simple circuit, low cost, and many other advantages, conform to the trend of the development of electronic

6、instruments, and has a broad market prospect. This circuit to realize the function of electronic calendar, USES the monolithic integrated circuit AT89S52, aided by the necessary peripheral circuit, with the C language program, and the modular design and into electronic calendar system. It through th

7、e LCD can display correct YinYangLi week and determined when, with function stability, high precision and adjustable characteristics. Keywords: monolithic integrated circuit AT89S52; DS1302; LCD; 34目 录摘要IAbstractII第一章 绪论11.1 设计目的与意义11.2 方案选择与DIY电子万年历的研究情况11.2.1时钟芯片选择11.2.2键盘选择21.2.3显示模块选择31.2.4 DIY万

8、年历的研究情况3第二章 主要硬件描述42.1 89C52模块42.2 显示模块LCM1286442.2.1液晶模块概述42.2.2液晶模块特点42.3 芯片DS1302简介52.4 芯片DS18B20简介5第三章 硬件设计与实现63.1单片机最小系统的设计63.2时钟电路的设计73.3温度采集模块的设计73.4人机交互模块设计8第四章 系统软件设计与实现94.1主要算法流程图描述94.2 LCM16824子程序的实现134.3 DS1302子程序的实现144.4 DS18B20子程序的实现154.5键盘子程序的实现164.6主程序的实现17第五章 测试结果分析与结果185.1测试结果分析185

9、.2测试总结18结束语19致 谢20参考文献21附录一 作品实物图21附录二 原理图22附录三 部分程序23第一章 绪论1.1 设计目的与意义随着电子技术的高速发展,对电子方面人才的要求越来越高,不仅要求其具备相关的专业理论知识,还要求其具有较强的设计、制作等实践动手能力.此次学校举行的电子设计无疑是对从事电子相关专业的人的一次很好的锻炼和考验,是培养信息人才的一次良好的机会,为其提供了一个理论知识与实践相结合的平台。通过本次课程设计,引导学生结合所学的电路理论和程序设计的知识,思考设计方案,以小组合作方式,分工完成各个部分,从而掌握相关的硬件结合软件显示电路的设计和调试技术,一方面提高了学生

10、的实践动手和协作能力,另一方面培养了学生综合运用所学理论知识进行工程设计的能力。1.2 方案选择与DIY电子万年历的研究情况1.2.1时钟芯片选择方案一:不使用芯片,采用单片机的定时计数器这种方法原理是利用单片机芯片的定时器来产生固定的时间,模拟时钟的时, 分,秒。如:利用AT80C52芯片,定时器用工作方式1,每50ms产生一个中断,循环20次,即1s周期。每一个周期加1,那么1min为60个周期,1h就是60*60=3600个周期,一天就是3600*24=86400个周期。此方法优点是可以省去一些外围的芯片,但这种方法只能适用于一些要求不是十分精确,不做长期保留的场合。方案二:并行接口时钟

11、芯片 DS12887特点:采用单片机应用系统并行总线(三总线)扩展的接口电路,采用这种接口电路具有操作速度快,编程方便的优点。但是对于80C52单片机来说,低位地址线要通过锁存器输出,还要地址译码器,而且并行口芯片的体积相对较大,DS12887管脚图如图1所示。 图1 DS12887管脚图方案三: 串行接口时钟芯片DS1302芯片主特性:(1)实时时钟具有能计算2100年之前的秒分时日日期星期月年的能力,还有闰年调整的能力(2)8 位暂存数据存储RAM(3)串行 I/O 口使得管脚数量最少(4)工作电压范围2.0 5.5V(5)工作电流 2.0V 时,小于300nA(5)读/写时钟或RAM 数

12、据时有两种传送方式单字节传送和多字节传送字符组方式(6)8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配(7)简单 3 线接口(8)与 TTL 兼容Vcc=5V(9)可选工业级温度范围-40 +85优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图2所示。图2 DS1302管脚图1.2.2键盘选择方案一: 矩阵式键盘矩阵式键盘电路图如图3所示。 图3 矩阵式键盘行列式键盘的原理就是每一行线与每一列线的交叉地方不相通,而是接上一个按键,通过按

13、键来接通。特点: 以省出不少的I/O 口资源,程序编写相对复杂点,适用于键数比较多的情况。方案二: 独立式键盘独立式键盘电路图如图4所示。 图4 独立式键盘独立式键盘是指各个按键相互独立地连接到各自的单片机的I/O 口,I/O口只需要做输入口就能读到所有的按键。特点: 电路简单,程序容易写,适用于按键数较少的情况。所以我们选择独立式键盘。1.2.3显示模块选择方案一: LED数码管显示数码管显示比较常用的是采用CD4511和74LS138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。目前单片机数码管普通采用动态显示。编程简单,但只能

14、显示数字,不能显示中文。方案二: LCD1602能够显示英文和数字。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号。方案三: LCD12864作为一种输出方式,液晶显示最大的特点就是能够实现友好的人机界面,它己经广泛应用于现代工业控制和智能化仪器仪表等领域,它己经成为单片机就用开发领域典型模块之一。能够方便的显示文字和数字。所以最终选择LCD12864。1.2.4 DIY万年历的研究情况目前电子爱好者,所设计的万年历大部分都采用LCD1602或数码管显示,只能显示阳历,不能显示阴历,而且没有阴历相对

15、应的的天干地支和生肖年,没有达到多功能的效果。我们采用LCD12864显示,通过算法实现,能正确显示阴历,具有良好的界面,为了追求时间的准确,我们采用芯片DS1302,通过单片机控制,读出时间显示在LCD上。我们除了用芯片DS18B20,通过程序控制,把温度也显示出来外还通过算法控制,把阴历的天干地支和生肖年也显示出来,达到多功能效果。第二章 主要硬件描述2.1 89C52模块Mcs-51单片机管脚图图如图5所示。 图5 单片机管脚图 (1)一个8位的微处理器(CPU)(2)片内数据存储器RAM(128B/256B)(3)片内程序存储器ROM/EPROM(4kB/8kB)(4)4个8位并行I/

16、O拉口P0-P3,每个口既可以作输入也可以作输出(5)2个16位定时器/计数器(6)5个中断源的中断控制系统(7)1个全双工的串行I/O接口(8)片内时钟振荡器2.2 显示模块LCM128642.2.1液晶模块概述我们采用FG12864J显示模块,如图6所示,它是一种图形点阵液晶显示器。它主要采用动态驱动原理由行驱动控制器和列驱动器两部分组成了128(列)×64(行)的全点阵液晶显示。2.2.2液晶模块特点(1)工作电压为+5V±10% ,可自带驱动 LCD 所需的负电压(2)全屏幕点阵,点阵数为128(列)×64(行),可显示8(/行)×4(行)个(1

17、6×16 点阵)汉字,也可完成图形,字符的显示(3)与 CPU 接口采用5 条位控制总线和8 位并行数据总线输入输出,适配M6800 系列时序(4)内部有显示数据锁存器(5)简单的操作指令 显示开关设置,显示起始行设置,地址指针设置和数据读/写等指令 图6 FG12864J显示模块2.3 芯片DS1302简介DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM 通过简单的串行接口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。DS

18、1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线1 RES 复位2 I/O 数据线3 SCLK串行时钟时钟/RAM 的读/写数据以一个字节或多达31 个字节的字符组方式通信DS1302 工作时功耗很低保持数据和时钟信息时功率小于1mW。 DS1302的管脚描述如表1所示。表1 DS1302管脚X1 X232.758KHz晶振管脚GND地RST复位I/O数据输入/输出引脚SCLK串行时钟Vcc1 Vcc2电源供电管脚2.4 芯片DS18B20简介DS18B20温度传感器当仁不让。超小的体积,超低的硬件开消,抗干扰能力强,精度高,附加功能强。对电子爱好者来说,DS18B20

19、是我们开发温度相关的首选小产品。 DS18B20引脚功能如表2所示。表2 DS18B20引脚功能GND地DQ单数据总线VDD电源电压NC空引脚第三章 硬件设计与实现该万年历以89S52作为控制核心,外接DS18B20温度传感器,DS1302时钟芯片,显示采用LCM12864,调表采用矩阵式键盘,整体硬件电路的框图如图7所示。DS1302时钟芯片MCU8052DS18B20温度采样LCD显示调整电路 图7 硬件电路框图3.1单片机最小系统的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每

20、一条I/O线都能独立地作输出或输入。单片机的最小系统如图8所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出。第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。 图8 单片机最小系统 3.2时钟电路的设计本系统采用有DS1302串行时钟芯片作为主时钟电路,该电路使用单独的32.768M的晶振和单独的电源供电,减小主控的负担。电路图如图9所示。图9 时钟电路3.3温度采集模块的设计采用数字式温度传感器DS18B20,它是数

21、字式温度传感器,具有测量精度高,电路连接简单特点,此类传感器仅需要一条数据线进行数据传输,使用0.7与DS18B20的I/O口连接加一个上拉电阻,Vcc接电源,Vss接地。电路图如图10所示。 图10 温度采集电路3.4人机交互模块设计该系统输入模块采用独立式式键盘输入,显示模块采用LCM12864,很好的实现了人机交互,液晶与主控制器的接口如图11所示。 图11 液晶接口电路第四章 系统软件设计与实现4.1主要算法流程图描述以80C52为核心,处理外转电路传进来的信号,实现时钟数据的读取,保存,显示其及键盘操作。流程图如图12所示。 图12 主程序流程图阳历和时分秒都是通过DS1302读出来

22、的,经过主控的转换和处理最终显示在LCM12864上,该程序流程图如图13所示。 图13 计算阳历和时分秒流程图阴历是通过一种算法转换过来,首先得到阳历值,然后根据这种算法把阳历转换成阴历,最终显示在LCM12864模块上,该程序流程图如图14所示。 图14 计算阴历程序流程图时间调整是通过四个独立按键来调整时间值,时间调整流程图如图15所示。 图15 时间调整程序流程图星期的计算方法如下:星期=(日期年份+所过闰年数+月校正数)%7,如果是在闰年又不到3月份上述之和要减一天再除7,其1到12月的校正数据为 6 2 2 5 0 3 5 1 4 6 2 4,该程序中采用1个字节表示年份闰年数也只

23、计算1900 年以后的闰年数。该程序的流程图如图16所示。 图16 计算星期算法4.2 LCM16824子程序的实现LCM12864的读写时序如图17所示。 图17 LCM12864读写时序主要函数模块:函数:void lcd_init(void) 显示初始化程序函数:Void GUI_init() 该函数用于初始化显示界面,把一些固定不需要刷新的文字固定下来函数:void lw(uchar x, uchar y, uchar dd)用来写数据的子程序函数: void display(uchar xx, uchar yy, uchar n, uchar fb,uchar hz) 用于显示汉字,

24、每个汉字为16*16的点阵函数: void shownum(uchar xx,uchar yy,uchar n,uchar fb,uchar num)用于显示数字,每个数字为8*16的点阵4.3 DS1302子程序的实现DS1302的读写时序如图18所示。 图18 DS1302读写时序定义结构体数组SYSTEMTIME的时间类型,结构体数组如下:typedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;u

25、nsigned char Month;unsigned char Year;SYSTEMTIME主要函数模块:函数: void Initial_DS1302(void)描述:时钟芯片初始化函数: void Write1302(unsigned char ucAddr, unsigned char ucDa)描述:把某个数据写进某个地址函数: unsigned char Read1302(unsigned char ucAddr)描述:从芯片内某地址读取数据函数: void DS1302_GetTime(SYSTEMTIME *Time)描述: 获取时钟芯片的时钟数据到自定义的结构型数组函数:

26、void DS1302InputByte(unsigned char d)描述: 往时钟写入一字节函数: unsigned char DS1302OutputByte(void)描述:从时间内读取一个字节4.4 DS18B20子程序的实现DS18B20的读写时序如图19所示。 图19 DS18B20读写时序简易的程序流程图如图20所示: 图20 DS18B20读写程序流程图主要函数描述:函数: void Init_DS18B20(void)描述:单总线传输初始化函数.函数: void WriteOneChar(uchar dat) 描述:往芯片内部地址写入一个字节,有写数据和写指令之分.函数:

27、 void ReadTemp(void)描述:读取芯片的温度.函数: void delay_18B20(unsigned int i)描述:延时函数4.5键盘子程序的实现键盘示意图如图21所示。 图21 按键示意图主要函数模块:函 数 名: void key_count()功能描述:设置状态转换函数,根据变量count的不同值,对应不同的设置状态按下设置键,自动切换设置位函 数 名: void key_out()功能描述:跳出设置模式函 数 名: uchar key_up(int temp,int max,int min)功能描述: 按键加函数,在最大值与最小值之间变化函 数 名: uchar

28、 key_down(int temp,int max,int min)功能描述: 按键减函数,在最大值与最小值之间变化函 数 名:void set_year(); void set_month(); void set_day(); void set_hour();void set_minute(); 功能描述: 分别是用来设置 年 月 日 时 分 秒函 数 名: void key_al01()功能描述:设置定时报警功能4.6主程序的实现主要函数模块:函 数 名: Init_GUI()功能描述:进行界面初始化,例如固定的年、星期、农历函 数 名: void Show_NL()功能描述:根据算法,

29、得出阴历, 包括天干地支月日函 数 名: void Show_YL()功能描述:根据算法,从时钟芯片读出阳历数据,显示出来函 数 名: LCD_ShowWNL()功能描述: 根据算法,显示电子万年历,其中时钟的”秒”位为每次循环刷新一次,”分”为在普通模式时每分钟刷新一次,在设置模式时每次循环刷新一次,”时”为在普通模式时每小时刷新一次,在设置模式时每次循环刷新一次,公历农历的年、月、日、星期、温度,设置模式每次循环刷新一次函数名:void LCD_showalarm()功能描述: 显示定时报警的时间函 数 名: void mian()功能描述:.显示万年历,循环读取时间,并通过程序进行键盘检

30、测第五章 测试结果分析与结果5.1测试结果分析(1)在测试中遇到LEDLCD16824不显示分析:首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏。再接着研究程序的时序图是否正确。最后发现程序时序方面出了点小错。修改后就把问题解决了(2)测试中遇到调时间调到2079年后跳到2000年分析:认真研究时钟芯片的Datasheet发现,对年的读取,读出后是BCD码转换成十制显示时算法不正确(3)按键调整时,不是按单位递增和递减分析:在键盘程序中,按键一次,向芯片写入一个新的数字,在写入数字后必须有一定延时才再写入另一个数字 (4)烧写程序进单片机里面时,有时会在显示屏上显示烂码.分

31、析:用电压表检查.最后检测出USB下载线的端口电压不够换条新线就可以把问题解决5.2测试总结经过多次的反复测试与分析,掌握了硬件的设计与分析的能力, 学会看英文版的Datasheet,同时在软件的编程方面得到更到的提高,对编程能力得到加强。对所学的知识得到很大的提高与巩固。 最终实现功能:(1)能显示阳历年、月、日、星期、小时、分、秒(2)显示模块采用LCD液晶显示,要求能用按键调整时间。(3)能显示阴历月、日,在显示阴历时间时能标明是否为闰年。(4)具有定时报警功能,能够进行整点和半点语音报时。(5)能够准确在LCD上显示室。(6)在显示农历时通过算法能够把天干地去也显示出来。结束语通过对基

32、于单片机的万年历的研究和设计,完成了一种能够显示阳历、阴历、星期、时间、实时温度、天干地支的多功能万年历,该万年历还可以定时报警和进行进行整点和半点报时。本系统设计从开始到完成包括文档的编写总共花了一个月左右的时间,设计的难点在于星期和天干地支的计算方法,还有单片机和各个芯片之间的通信协议,液晶的读写时序,按键的防抖。本系统基本完成了设计指标的所有要求,所有的程序分块编写,通过main函数来调用,增加了程序的易修改性和易读性,方便他人的使用和改进。但是由于时间的局限性以及本人能力的有限性,本系统还有许多需要改进和完善的地方。其中主要的问题就是功耗和电源供电的问题,该处采用5V供电,最好采用3V

33、供电。整个电路的功耗太大,没让单片机工作在空闲模式,这都是作品不实用,不能够大批量生产,这都有待改进,希望以后有机会对该系统做进一步的完善。致 谢四月维夏,山有嘉卉。初春的绿城早已艳阳朝天,花满枝头,欣欣向荣。在这个美好的季节里,我在电脑上敲出了最后一个字,心中涌现的不是想象已久的欢欣,却是难以言喻的失落。是的,随着论文的终结,意味着我生命中最纯美的学生时代即将结束,尽管百般不舍,这一天终究会在熙熙攘攘的喧嚣中决绝的来临。    四年寒窗,所收获的不仅仅是愈加丰厚的知识,更重要的是在阅读、实践中所培养的思维方式、表达能力和广阔视野。很庆幸这些年来我遇到了

34、许多恩师益友,无论在学习上、生活上还是工作上都给予了我无私的帮助和热心的照顾,让我在诸多方面都有所成长。感恩之情难以用语言量度,谨以最朴实的话语致以最崇高的敬意。在此要感谢的是我的导师李林老师。本论文能够顺利完成,离不开李林老师的悉心指导和严格要求,李林老师在论文的选题、研究理论、框架结构、数据整理,直至撰写、修改和定稿等各个环节均严格把关,并投入了大量的时间和精力。老师治学严谨,学识渊博,为我营造了一种良好的研究氛围。在跟随老师学习的过程中,我不仅掌握了全新而实用的学术思想和研究方法,也领会了许多待人接物与为人处世的道理。李林老师严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力,令

35、人如沐春风,倍感温馨。最后,我要向在百忙之中抽时间对本文进行审阅、评议和参加本人论文答辩的各位师长表示感谢!参考文献1石丽杰.单片机控制系统硬件设计D.商品与质量理论研究,2011,(5).2陆中宏.基于Proteus软件的单片机控制系统设计与制作J.工业技术与职业教育,2011(1).3 祝诗平. Proteus和Keil软件在单片机教学中的应用J .西南农业大学学报(社会科学版),2011(2).4王来志,王小平.基于单片机的万年历设计与Proteus仿真J .知识经济,2011,(5).5王庆利.单片机设计案例实践教程M.北京邮电大学出版社,2008.6 陈红,李玮.基于单片机和1286

36、4LCD模块的万年历设计与仿真D.中小企业管理与科技,2011,(34).7贾极.单片机与PC机的串口通信J. 中小企业管理与科技,2011,(16).8陈建平.液晶显示器驱动方法及驱动电路探析J.数字技术与应用,2011,(11).9Tom Berry. Based on the SG3525 liquid crystal display plane back light driving circuit designJ.Liquid crystal display,2009,(1). 10JENNIFER Y,BISWANATH M,DIPAK G. Based on SCM USB exc

37、use circuit and the application in data communication D. WUHAN university of science and technology bachelor's degree thesis, 2011. 附录一 作品实物图附录二 原理图附录三 部分程序主程序#include<reg51.h>#include<DS1302.c> /更改管脚#include<DS18B20.c>#include<zimo.c>#include<lcd12864.c>#include<

38、;key.c>#include<beep.c>#include<lunar.c>#define uchar unsigned char#define uint unsigned intSYSTEMTIME sys;uchar c_sun,year_sun,month_sun,day_sun;uchar year_moon,month_moon,day_moon,week; uchar alarm=0,al_hour=0,al_min=0;Init_GUI()lcd_init();Init_DS18B20();Initial_DS1302();delay(10);j

39、iemian();/显示初始化界面,例如固定的年、星期、农历放在12864.c里void Show_NL() DS1302_GetTime(&sys);year_sun=Read1302(DS1302_YEAR);month_sun=Read1302(DS1302_MONTH);day_sun=Read1302(DS1302_DAY);Conversion(0,year_sun,month_sun,day_sun);/*day_moon=(day_moon&0x70)>>4)*10 + (day_moon&0x0F);month_moon=(month_mo

40、on&0x70)>>4)*10 + (month_moon&0x0F);year_moon=(year_moon&0xF0)>>4)*10 + (year_moon&0x0F);*/if(month_moon=1)display(8,4,12,0,ch1616);/显示“正”else display(8,4,month_moon-1,0,ch1616);/显示当前农历的月if(day_moon<11)display(12,4,13,0,ch1616);/显示“初”if(day_moon<20&&day_moon

41、>10)display(12,4,9,0,ch1616);/显示“十”if(day_moon<30&&day_moon>19)display(12,4,14,0,ch1616);/显示“廿”if(day_moon>29)display(12,4,2,0,ch1616);/显示“三”display(14,4,(day_moon-1)%10,0,ch1616);/显示农历个位display(14,2,year_moon%12,0,shengxiao);/显示生肖display(9,2,year_moon%10,0,tiangan);/显示天干display(

42、11,2,year_moon%12,0,dizhi);/显示地支Conver_week(0,year_sun,month_sun,day_sun);/星期if(week=0) display(5,4,17,0,ch1616);/显示星期日else display(5,4,week-1,0,ch1616); /显示星期16 void Show_YL() /显示阳历 DS1302_GetTime(&sys);shownum(6,6,sys.Second/10,0,num);/显示秒shownum(7,6,sys.Second%10,0,num); shownum(3,6,sys.Minut

43、e/10,0,num);/显示分shownum(4,6,sys.Minute%10,0,num);shownum(0,6,sys.Hour/10,0,num);/显示时shownum(1,6,sys.Hour%10,0,num);shownum(4,2,sys.Day/10,0,num);/显示日shownum(5,2,sys.Day%10,0,num);shownum(0,2,sys.Month/10,0,num);/显示月shownum(1,2,sys.Month%10,0,num);shownum(3,0,sys.Year/10,0,num);/显示年shownum(4,0,sys.Ye

44、ar%10,0,num);if( (!(sys.Year%4) && (sys.Year%100) | !(sys.Year%400) )display(8,0,24,0,ch1616);/显示平闰年elsedisplay(8,0,23,0,ch1616);/平闰年计算if(sys.Minute=30&&sys.Second=0)Beep_Half();/报时if(sys.Minute=0&&sys.Second=0)Beep_Hour(); void LCD_ShowWNL()DS1302_GetTime(&sys);shownum(6

45、,6,sys.Second/10,0,num);shownum(7,6,sys.Second%10,0,num);/秒 每次循环钟刷新一次if(!sys.Second)/分 在普通模式时每分钟刷新一次,在设置模式时每次循环刷新一次shownum(3,6,sys.Minute/10,0,num);shownum(4,6,sys.Minute%10,0,num);if(!sys.Second&&!sys.Minute)/时 在普通模式时每小时刷新一次,在设置模式时每次循环刷新一次shownum(0,6,sys.Hour/10,0,num);shownum(1,6,sys.Hour%

46、10,0,num);if(!sys.Second&&!sys.Minute&&!sys.Hour)/公历农历的年、月、日、星期、温度,设置模式每次循环刷新一次Show_YL();/显示农历Show_NL();/显示新历diswendu();/显示温度if(sys.Minute=30&&sys.Second=0)Beep_Half();/报时if(sys.Minute=0&&sys.Second=0)Beep_Hour();void LCD_showalarm()display(8,6,21-alarm,0,ch1616);show

47、num(11,6,al_hour/10,0,num);/显示闹铃时shownum(12,6,al_hour%10,0,num);/显示闹铃时shownum(14,6,al_min/10,0,num);/显示闹铃分shownum(15,6,al_min%10,0,num);/显示闹铃分void main()Init_GUI();diswendu();Show_YL();Show_NL();LCD_showalarm();while(1)LCD_ShowWNL();if(sys.Second%9=0)diswendu();key_count();if(count)key_set();/判断set键

48、按下,进入设置界面 if(alarm && (al_hour=sys.Hour) && (al_min=sys.Minute)&& !sys.Second)/定时报警功能Beep_Half();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num);Beep_Hour();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num);Beep_Half();DS1302_GetTime(&sys);shownum(7,6,sy

49、s.Second%10,0,num);Beep_Hour();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num);Beep_Half();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num);Beep_Hour();DS1302_GetTime(&sys);shownum(7,6,sys.Second%10,0,num); DS1302程序#define uint unsigned int#define uchar unsigned char#include &

50、lt;intrins.h>sbit DS1302_CLK = P12; /实时时钟时钟线引脚 sbit DS1302_IO = P11; /实时时钟数据线引脚 sbit DS1302_RST = P10; /实时时钟复位线引脚sbit ACC0 = ACC0;sbit ACC7 = ACC7;typedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsig

51、ned char Year;SYSTEMTIME;/定义的时间类型SYSTEMTIME sys;#define AM(X)X#define PM(X)(X+12) / 转成24小时制#define DS1302_SECOND0x80/时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE0x82#define DS1302_HOUR0x84#define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C void DS1302InputByte(unsign

52、ed char d) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i>0; i-)DS1302_IO = ACC0;/相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; unsigned char DS1302OutputByte(void)/实时时钟读取一字节(内部函数) unsigned char i;for(i=8; i>0; i-)ACC = ACC >>1;/相当于汇编中的 RRC ACC7 = DS1302_IO;DS1

53、302_CLK = 1;DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr);/ 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(un

54、signed char ucAddr)/读取DS1302某地址的数据unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01);/ 地址,命令 ucData = DS1302OutputByte();/ 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char ReadVal

温馨提示

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

评论

0/150

提交评论