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

下载本文档

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

文档简介

1、-课程设计报告课程名称: 专业综合课程设计 专业班级: - 学生姓名: - 指导教师: - 完成时间: - 报告成绩: 评阅意见: 评阅教师 日期 -制目 录一、绪论11.1 设计目的与意义11.2 方案选择与DIY电子万年历的研究情况11.2.1时钟芯片选择11.2.2键盘选择21.2.3显示模块选择31.2.4 DIY万年历的研究情况4二、主要硬件描述52.1 89C52模块52.2 显示模块LCM1286452.2.1液晶模块概述52.2.2液晶模块特点52.3 芯片DS1302简介6三、硬件设计与实现73.1单片机最小系统的设计73.2时钟电路的设计83.3人机交互模块设计8四、系统软

2、件设计与实现94.1主要算法流程图描述94.2 LCM16824子程序的实现134.3 DS1302子程序的实现144.5键盘子程序的实现154.6主程序的实现16五、测试结果分析与结果175.1测试结果分析175.2测试总结17结束语18致 谢19参考文献20附录一原理图21附录二 部分程序2230一、绪论1.1 设计目的与意义随着电子技术的高速发展,对电子方面人才的要求越来越高,不仅要求其具备相关的专业理论知识,还要求其具有较强的设计、制作等实践动手能力.此次学校举行的电子设计无疑是对从事电子相关专业的人的一次很好的锻炼和考验,是培养信息人才的一次良好的机会,为其提供了一个理论知识与实践相

3、结合的平台。通过本次课程设计,引导学生结合所学的电路理论和程序设计的知识,思考设计方案,以小组合作方式,分工完成各个部分,从而掌握相关的硬件结合软件显示电路的设计和调试技术,一方面提高了学生的实践动手和协作能力,另一方面培养了学生综合运用所学理论知识进行工程设计的能力。1.2 方案选择与DIY电子万年历的研究情况1.2.1时钟芯片选择方案一:不使用芯片,采用单片机的定时计数器这种方法原理是利用单片机芯片的定时器来产生固定的时间,模拟时钟的时, 分,秒。如:利用AT80C52芯片,定时器用工作方式1,每50ms产生一个中断,循环20次,即1s周期。每一个周期加1,那么1min为60个周期,1h就

4、是60*60=3600个周期,一天就是3600*24=86400个周期。此方法优点是可以省去一些外围的芯片,但这种方法只能适用于一些要求不是十分精确,不做长期保留的场合。方案二:并行接口时钟芯片 DS12887特点:采用单片机应用系统并行总线(三总线)扩展的接口电路,采用这种接口电路具有操作速度快,编程方便的优点。对于80C52单片机来说,低位地址线要通过锁存器输出,还要地址译码器,而且并行口芯片的体积相对较大。 如图1 图1 DS12887管脚图方案三: 串行接口时钟芯片DS1302芯片主特性:(1)实时时钟具有能计算2100年之前的秒分时日日期星期月年的能力,还有闰年调整的能力(2)8 位

5、暂存数据存储RAM(3)串行 I/O 口使得管脚数量最少(4)工作电压范围2.0 5.5V(5)工作电流 2.0V 时,小于300nA(6)读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式(7)8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配(8)简单 3 线接口(9)与 TTL 兼容VCC=5V(10)可选工业级温度范围-40 +85优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图2所示。图2 DS1302管脚图

6、1.2.2键盘选择方案一: 矩阵式键盘矩阵式键盘电路图如图3所示。 图3 矩阵式键盘行列式键盘的原理就是每一行线与每一列线的交叉地方不相通,而是接上一个按键,通过按键来接通。特点: 以省出不少的I/O 口资源,程序编写相对复杂点,适用于键数比较多的情况。方案二: 独立式键盘独立式键盘电路图如图4所示。 图4 独立式键盘独立式键盘是指各个按键相互独立地连接到各自的单片机的I/O 口,I/O口只需要做输入口就能读到所有的按键。特点: 电路简单,程序容易写,适用于按键数较少的情况。所以我们选择独立式键盘。1.2.3显示模块选择方案一: LED数码管显示数码管显示比较常用的是采用CD4511和74LS

7、138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。目前单片机数码管普通采用动态显示。编程简单,但只能显示数字,不能显示中文。方案二: LCD1602能够显示英文和数字。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号。方案三: LCD12864作为一种输出方式,液晶显示最大的特点就是能够实现友好的人机界面,它己经广泛应用于现代工业控制和智能化仪器仪表等领域,它己经成为单片机就用开发领域典型模块之一。能够方便的显示文字和数字。所以最终选择L

8、CD12864。1.2.4 DIY万年历的研究情况目前电子爱好者,所设计的万年历大部分都采用LCD1602或数码管显示,只能显示阳历,不能显示阴历,而且没有阴历相对应的的天干地支和生肖年,没有达到多功能的效果。我们采用LCD12864显示,通过算法实现,能正确显示阴历,具有良好的界面,为了追求时间的准确,我们采用芯片DS1302,通过单片机控制,读出时间显示在LCD上。我们除了用芯片DS18B20,通过程序控制,把温度也显示出来外还通过算法控制,把阴历的天干地支和生肖年也显示出来,达到多功能效果。二、主要硬件描述2.1 89C52模块MCS-51单片机管脚图图如图5所示。 图5 单片机管脚图

9、(1)一个8位的微处理器(CPU)(2)片内数据存储器RAM(128B/256B)(3)片内程序存储器ROM/EPROM(4kB/8kB)(4)4个8位并行I/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)工作电压为+5

10、V±10% ,可自带驱动 LCD 所需的负电压(2)全屏幕点阵,点阵数为128(列)×64(行),可显示8(/行)×4(行)个(16×16 点阵)汉字,也可完成图形,字符的显示(3)与 CPU 接口采用5 条位控制总线和8 位并行数据总线输入输出,适配M6800 系列时序(4)内部有显示数据锁存器(5)简单的操作指令 显示开关设置,显示起始行设置,地址指针设置和数据读/写等指令 图6 FG12864J显示模块2.3 芯片DS1302简介DS1302 是DALLAS 公司推出的涓流充电时钟芯片内含有一个实时时钟/日历和31 字节静态RAM 通过简单的串行接

11、口与单片机进行通信实时时钟/日历电路提供秒分时日日期月年的信息每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。DS1302 与单片机之间能简单地采用同步串行的方式进行通信仅需用到三个口线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电源供电管

12、脚三、硬件设计与实现该万年历以89S52作为控制核心, DS1302时钟芯片,显示采用LCM12864,调表采用矩阵式键盘,整体硬件电路的框图如图7所示。 3.1单片机最小系统的设计AT89S52单片机为40引脚双列直插芯片,有四个I/O口P0,P1,P2,P3, MCS-51单片机共有4个8位的I/O口(P0、P1、P2、P3),每一条I/O线都能独立地作输出或输入。图8 单片机最小系统原理图单片机的最小系统如图8所示,18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出

13、。第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端。3.2时钟电路的设计本系统采用有DS1302串行时钟芯片作为主时钟电路,该电路使用单独的32.768M的晶振和单独的电源供电,减小主控的负担。电路图如图9所示。图9 时钟电路3.3人机交互模块设计该系统输入模块采用独立式式键盘输入,显示模块采用LCM12864,很好的实现了人机交互,液晶与主控制器的接口如图10所示。图10 液晶显示电路 四、系统软件设计与实现4.1主要算法流程图描述以80C52为核心,处理外转电路传进来的信号,实现时钟数据的读取,保存,显示其及键盘操作。流程图如图12所示。图12

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

15、4 6 2 4,该程序中采用1个字节表示年份闰年数也只计算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,

16、 uchar fb,uchar hz) 用于显示汉字,每个汉字为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 ch

17、ar Week;unsigned char Day;unsigned 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)描述

18、: 获取时钟芯片的时钟数据到自定义的结构型数组函数: void DS1302InputByte(unsigned char d)描述: 往时钟写入一字节函数: unsigned char DS1302OutputByte(void)描述:从时间内读取一个字节 4.5键盘子程序的实现键盘示意图如图21所示。 图21 按键示意图主要函数模块:函 数 名: void key_count()功能描述:设置状态转换函数,根据变量count的不同值,对应不同的设置状态按下设置键,自动切换设置位函 数 名: void key_out()功能描述:跳出设置模式函 数 名: uchar key_up(int t

19、emp,int max,int min)功能描述: 按键加函数,在最大值与最小值之间变化函 数 名: uchar 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()

20、功能描述:进行界面初始化,例如固定的年、星期、农历函 数 名: void Show_NL()功能描述:根据算法,得出阴历, 包括天干地支月日函 数 名: void Show_YL()功能描述:根据算法,从时钟芯片读出阳历数据,显示出来函 数 名: LCD_ShowWNL()功能描述: 根据算法,显示电子万年历,其中时钟的”秒”位为每次循环刷新一次,”分”为在普通模式时每分钟刷新一次,在设置模式时每次循环刷新一次,”时”为在普通模式时每小时刷新一次,在设置模式时每次循环刷新一次,公历农历的年、月、日、星期、温度,设置模式每次循环刷新一次函数名:void LCD_showalarm()功能描述:

21、显示定时报警的时间函 数 名: void mian()功能描述:.显示万年历,循环读取时间,并通过程序进行键盘检测五、测试结果分析与结果5.1测试结果分析(1)在测试中遇到LEDLCD16824不显示分析:首先使用试测仪对电路进行测试,观察是否存在漏焊,虚焊,或者元件损坏。再接着研究程序的时序图是否正确。最后发现程序时序方面出了点小错。修改后就把问题解决了(2)测试中遇到调时间调到2079年后跳到2000年分析:认真研究时钟芯片的Datasheet发现,对年的读取,读出后是BCD码转换成十制显示时算法不正确(3)按键调整时,不是按单位递增和递减分析:在键盘程序中,按键一次,向芯片写入一个新的数

22、字,在写入数字后必须有一定延时才再写入另一个数字 (4)烧写程序进单片机里面时,有时会在显示屏上显示乱码.分析:用电压表检查.最后检测出USB下载线的端口电压不够换条新线就可以把问题解决5.2测试总结经过多次的反复测试与分析,掌握了硬件的设计与分析的能力, 学会看英文版的Datasheet,同时在软件的编程方面得到更到的提高,对编程能力得到加强。对所学的知识得到很大的提高与巩固。 最终实现功能:(1)能显示阳历年、月、日、星期、小时、分、秒(2)显示模块采用LCD液晶显示,要求能用按键调整时间。(3)能显示阴历月、日,在显示阴历时间时能标明是否为闰年。(4)具有定时报警功能,能够进行整点和半点

23、语音报时。(5)能够准确在LCD上显示。(6)在显示农历时通过算法能够把天干地去也显示出来。结束语通过对基于单片机的万年历的研究和设计,完成了一种能够显示阳历、阴历、星期、时间、实时温度、天干地支的多功能万年历,该万年历还可以定时报警和进行进行整点和半点报时。本系统设计从开始到完成包括文档的编写总共花了一个月左右的时间,设计的难点在于星期和天干地支的计算方法,还有单片机和各个芯片之间的通信协议,液晶的读写时序,按键的防抖。本系统基本完成了设计指标的所有要求,所有的程序分块编写,通过main函数来调用,增加了程序的易修改性和易读性,方便他人的使用和改进。但是由于时间的局限性以及本人能力的有限性,

24、本系统还有许多需要改进和完善的地方。其中主要的问题就是功耗和电源供电的问题,该处采用5V供电,最好采用3V供电。整个电路的功耗太大,没让单片机工作在空闲模式,这都是作品不实用,不能够大批量生产,这都有待改进,希望以后有机会对该系统做进一步的完善。致 谢   这次课程设计所收获的不仅仅是愈加丰厚的知识,更重要的是在阅读、实践中所培养的思维方式、表达能力和广阔视野。在此要感谢的是老师。老师治学严谨,学识渊博,为我营造了一种良好的研究氛围。在跟随老师学习的过程中,我不仅掌握了全新而实用的学术思想和研究方法,也领会了许多待人接物与为人处世的道理。参考文献1石丽杰.单片机控制系统硬件

25、设计D.商品与质量理论研究,2011,(5).2陆中宏.基于Proteus软件的单片机控制系统设计与制作J.工业技术与职业教育,2011(1).3 祝诗平. Proteus和Keil软件在单片机教学中的应用J .西南农业大学学报(社会科学版),2011(2).4王来志,王小平.基于单片机的万年历设计与Proteus仿真J .知识经济,2011,(5).5王庆利.单片机设计案例实践教程M.北京邮电大学出版社,2008.6 陈红,李玮.基于单片机和12864LCD模块的万年历设计与仿真D.中小企业管理与科技,2011,(34).7贾极.单片机与PC机的串口通信J. 中小企业管理与科技,2011,(

26、16).8陈建平.液晶显示器驱动方法及驱动电路探析J.数字技术与应用,2011,(11).2011. 附录一原理图附录二 部分程序主程序#include<reg51.h>#include<DS1302.c> /更改管脚#include<zimo.c>#include<lcd12864.c>#include<key.c>#include<beep.c>#include<lunar.c>#define uchar unsigned char#define uint unsigned intSYSTEMTIME sy

27、s;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();Initial_DS1302();delay(10);jiemian();/显示初始化界面,例如固定的年、星期、农历放在12864.c里void Show_NL() DS1302_GetTime(&sys);year_sun=Read1302(DS1302_YEAR);month_sun=Read1302(DS130

28、2_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_moon&0x70)>>4)*10 + (month_moon&0x0F);year_moon=(year_moon&0xF0)>>4)*10 + (year_moon&0x0F);*/if(month_moon=1)

29、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>10)display(12,4,9,0,ch1616);/显示“十”if(day_moon<30&&day_moon>19)display(12,4,14,0,ch1616);/显示“廿”if(day_moon>29)displ

30、ay(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(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

31、,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.Minute/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/

32、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.Year%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

33、);/平闰年计算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,6,sys.Second/10,0,num);shownum(7,6,sys.Second%10,0,num);/秒 每次循环钟刷新一次if(!sys.Second)/分 在普通模式时每分钟刷新一次,在设置模式时每次循环刷新一次shownum(3,6,sys.Minu

34、te/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%10,0,num);if(!sys.Second&&!sys.Minute&&!sys.Hour)/公历农历的年、月、日、星期、温度,设置模式每次循环刷新一次Show_YL();/显示农历Show_NL();/显示新历if(sys.Min

35、ute=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);shownum(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

36、()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键按下,进入设置界面 if(alarm && (al_hour=sys.Hour) && (al_min=sys.Minute)&& !sys.Second)/定时报警功能Beep_Half();DS1302_GetTime(&sys);shown

37、um(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,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,sys.Second%10

38、,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 <intrins.h>sbit DS1302_CLK = P12; /实时时钟时钟线引脚 sbit DS1302_IO = P11; /实时时钟数据线引脚 sbit DS1302_RST = P10; /实时时钟复位线引脚sbit ACC0 = ACC0;sbit ACC7 = ACC7;t

39、ypedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;SYSTEMTIME;/定义的时间类型SYSTEMTIME sys;#define AM(X)X#define PM(X)(X+12) / 转成24小时制#define DS1302_SECOND0x80/时钟芯片的寄存器位置,存放时间#define DS1302_MINU

40、TE0x82#define DS1302_HOUR0x84#define DS1302_WEEK0x8A#define DS1302_DAY0x86#define DS1302_MONTH0x88#define DS1302_YEAR0x8C void DS1302InputByte(unsigned 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 >&

41、gt; 1; unsigned char DS1302OutputByte(void)/实时时钟读取一字节(内部函数) unsigned char i;for(i=8; i>0; i-)ACC = ACC >>1;/相当于汇编中的 RRC ACC7 = DS1302_IO;DS1302_CLK = 1;DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据DS1302_RST = 0; DS1302

42、_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr);/ 地址,命令 DS1302InputByte(ucDa); / 写1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr)/读取DS1302某地址的数据unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01);/ 地址,命令 ucData = D

43、S1302OutputByte();/ 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_M

44、INUTE);Time->Minute = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadVa

45、lue = Read1302(DS1302_WEEK);Time->Week = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = (ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = (ReadValue&0xf0)>>4)*10 + (Rea

46、dValue&0x0F);void Initial_DS1302(void) /时钟芯片初始化unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80)/判断时钟芯片是否关闭Write1302(0x8e,0x00);/写入允许_nop_(); _nop_(); _nop_();Write1302(0x8c,0x09);/写入年_nop_(); _nop_(); _nop_(); Write1302(0x88,0x05);/写入月Write1302(0x86,0x05);/写入日Write1302(0x8a,0x02)

47、;/星期Write1302(0x84,0x23);/时Write1302(0x82,0x59);/写入分Write1302(0x80,0x30);/写入秒Write1302(0x90,0xae);/开启充电_nop_(); _nop_(); _nop_(); Write1302(0x8e,0x80);/禁止写入LCD12864程序#include <REG51.H>#define uchar unsigned char#define uint unsigned intsbit CS1=P14;sbit CS2=P15;sbit RS=P05;sbit RW=P06;sbit EN=P07;sbit RST=P16;#define DataPort P3void delay(unsigned long v) while(v!=0)v-;void lcd_busy(void)RS=0;RW=1;Dat

温馨提示

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

评论

0/150

提交评论