万年历课程设计(共30页)_第1页
万年历课程设计(共30页)_第2页
万年历课程设计(共30页)_第3页
万年历课程设计(共30页)_第4页
万年历课程设计(共30页)_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、- PAGE 33 - 单片机课程设计说明书 万年历电子时钟(shzhng)设计院 、 部: 电气(dinq)与信息工程学院 学生(xu sheng)姓名: 指导教师: 职称 专 业: 电气工程及其自动化 班 级: 完成时间: 2014年6月 摘 要单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航(dohng)装置到飞机上的各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡等,这些都离不开单片机。单片机是集CPU、RAM、ROM、定时、计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能

2、产业和工业自动化上。而51系列单片机是各单片机中最为典型和最有代表性的一种。万年历在日常生活中最常见,应用(yngyng)也最广泛。本次(bn c)课程设计主要就是设计一款数字钟,以80C51单片机为核心,配备数码管,按键,蜂鸣器。数字钟采用24小时制方式显示时间,年、月、日、秒及毫秒。 文章的核心主要从硬件设计和软件编程两个大的方面。硬件电路设计主要包括中央处理单元电路、时钟电路、人机接口电路、信号处理电路、执行电路等几部分组成。软件用C语言来实现,主要包括主程序、时间设置子程序,按键切换程序,校时程序等软件模块。关键字 : 单片机;时间;小时;分钟;秒 目 录 第一章 绪论(xln) TO

3、C o 1-3 h z u HYPERLINK l _Toc298942946 PAGEREF _Toc298942946 h 3 HYPERLINK l _Toc298942947 1.1引言(ynyn)及设计思路 PAGEREF _Toc298942947 h 3 HYPERLINK l _Toc298942948 第二章 系统(xtng)设计 PAGEREF _Toc298942948 h 4 HYPERLINK l _Toc298942949 2.1 设计任务 PAGEREF _Toc298942949 h 4 HYPERLINK l _Toc298942950 2.2 系统硬件设计

4、PAGEREF _Toc298942950 h 4 HYPERLINK l _Toc298942951 2.2.1系统总体框架 PAGEREF _Toc298942951 h 4 HYPERLINK l _Toc298942952 2.2.2模块二 PAGEREF _Toc298942952 h 5 HYPERLINK l _Toc298942953 2.3系统软件设计 PAGEREF _Toc298942953 h 5 HYPERLINK l _Toc298942954 2.4设计说明书: PAGEREF _Toc298942954 h 6 HYPERLINK l _Toc298942955

5、 2.4.1模块划分: PAGEREF _Toc298942955 h 6 HYPERLINK l _Toc298942956 2.5使用说明书: PAGEREF _Toc298942956 h 6 HYPERLINK l _Toc298942957 2.6元件清单: PAGEREF _Toc298942957 h 6 HYPERLINK l _Toc298942958 第三章课程设计总结 PAGEREF _Toc298942958 h 7 HYPERLINK l _Toc298942959 3.1设计过程 PAGEREF _Toc298942959 h 7 HYPERLINK l _Toc2

6、98942960 3.2心得体会 PAGEREF _Toc298942960 h 7 HYPERLINK l _Toc298942961 附录 PAGEREF _Toc298942961 h 8第一章 绪论(xln)1.1引言(ynyn)及设计思路万年历是采用(ciyng)数字电路实现对年、月、日,时、分、秒数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按

7、时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。一开始接触到实验箱的时候大家都很陌生,因为是第一次使用,所以实验箱很多模块的功能及使用方法都要我们自己去掌握。在没有实质说明书的情况下,我们先后使用万用表测电压、电阻的方法得到了实验箱主芯片与单片机P口的引脚对应图,为接下来的软件编程和硬件接口连接打下了基础。万年历电子时钟的实现主要硬件模块是单片机,本实验箱使用的的AT80C51单片机,此外还有显示模块四位数码管,还有时间切换和调整模块按钮和闹铃模

8、块蜂鸣器。起初我们想用实验箱上原有的HD7279芯片来驱动数码管显示和键盘控制,但由于对这款芯片的认识不足,虽然从网上找到了很多关于HD7279的资料,但仍不能正确的使用它,于是我们想到通过对TFT彩屏液晶显示器的控制来显示时间,但对于它的显示原理也不能掌握,最后我们想到了用单片机直接控制数码管来显示时间。单片机P0的八个口分别接到数码管的八个段选位。通过按下按钮1,可以实现从年月日时分秒毫秒的显示切换,按下按钮2,可实现年份、月份日期,时分的加减,以实现时间的校正。第二章 系统(xtng)设计2.1设计(shj)任务:设计一个万年历,主要以单片机和数码管为硬件基础,载入用C语言编写的程序,设

9、计出功能完善的万年历。该万年历通过按键可切换显示时间与日期、月份、日期、年份;能自动准确的计时;能通过判断年份和月份来显示相应的天数(tinsh)(即能判断闰年,大月和小月)。2.2 系统硬件设计和显示2.2.1系统(xtng)总体框架单片机数码管切换及调整按钮蜂鸣器(闹钟)2.2.2 模块(m kui)二万年历的原理图2.3系统软件(x tn run jin)设计3、1数字电子钟设计用到很多子程序,它们的流程图如下所示。 主程序是先开始,然后启动(qdng)定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。 开始启动定时器键切换和校时时间显示2.4设计(shj)说明书:2.4.1

10、模块(m kui)划分:1、显示(xinsh)模块利用单片机来控制数码管的显示。通过单片机P0口来控制数码管的八段,P1口来控制4位数码管。本程序采用方式0译码。在主程序中进行。2、切换模块主要靠按键来切换显示时间和日期,采用中断方式来进行。3、计时模块本程序采用定时计数器T0,定时10ms,即50ms进一次中断,100次后达到1秒,秒位加一,达到60秒后分位加一,一次类推周而复始的进行计数。该模块也是采用中断方式进行采用12M的晶振。4、校时模块该模块也是通过按键来对时间和日期进行校时。先通过一个按键来选择要校时的部分,再通过另外两个按键来对该部分进行加减,调整到正确的时间和日期。日期在校时

11、过程中还要对年份和月份进行判断是不是闰年,是大月还是小月。进过判断后来显示相应的日期。上述计时过程中也要进行判断。该模块也采用中断方式。2.5使用说明书:打开电源,1602液晶屏显示时间。按键S1用来控制切换,即按下S1就显示日期,再按一次就显示时间,依次循环。按键S2用来控制校时部分的选择,第一次按下,分位或时位会闪烁,表示以选择该位,同时计数器会停止计数;第二次按下,月位或日位会闪烁;第三次按下,年的高位或年的低位会闪烁;第四次按下时,会退出选择功能,计数器恢复计时,依次循环。按键S3和S4分别用来控制时间或日期的加、减,使用该功能时,按键S2必须先按下选择某一位进行加减,按键S2第四次按

12、下时,也同时退出该功能。2.6元件(yunjin)清单:AT89S51单片机1602显示屏一个、电阻电容(dinrng)若干,5个独立按键,12M晶振一个,记忆电池一块第三章 课程设计总结(zngji)3.1设计过程通过老师给我们讲解了课程设计的内容后,我们便投入了紧张的课设中,万事开头难,面对着完全陌生的实验箱,我们首先要做的就是收集资料,以便弄清实验箱各功能模块及使用方法,第一天就这么过去了,对实验箱的模块有了大致的了解。星期二,我们开始对主芯片的串口进行测试,找到了它与单片机引脚对应图。对于万年历,我们首先想到的是用单片机,89sc51芯片,液晶屏和按键来实现,查阅了很多关于芯片的资料后

13、仍对其显示原理搞不清楚,于是我们只好放弃使用该芯片,最后我们想到了直接用单片机控制液晶屏,采用动态扫描的方式来实现时间显示,用按键切换来实现。但这样的话,编程就相对来说复杂了很多。星期三,上午开始了编程,8个段选和4个位选就占了12个I/O口,定时和中断占2个口,四个按键也占了4个口,这样一来串行口就显得很紧张。但这不是最主要的,编程是块难啃的骨头,连续编了三天的程序,周五晚上进行仿真调试通过,7月18号的周一来实验室进行硬件调试,硬件调试也经历了数码管显示错位,乱码,按键不灵的问题,通过线路的重新连接,消抖的程序的修改,一一把这些问题解决了。经过经过一上午辛苦的调试,终于成功的把万年历设计出

14、来了!3.2 心得体会回顾起此次单片机课程设计,至今我仍感慨颇多,的确,从理论到实践,在整整两星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务(fw),从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不

15、够深刻,掌握得不够牢固,比如说单片机的动态(dngti)扫描原理,不懂分得(fn de)二极管的正负极,不知道数码管是共阴极还是共阳极,对单片机汇编语言掌握得不好通过这次课程设计之后,一定把以前所学过的知识重新温故。 本次课程设计,真可谓是感慨万千,从一开始的一无所知,到后来的轻车熟路,其中所经历的波折真是无以言表。坚持到最后是我最大的收获,在课设过程中我曾一度有想放弃的念头,但理智战胜了冲动,我还是坚持下来了,坚持就是胜利!同时也再一次让我体会了团队协作的重要性,我们分工协作,各显神通,一起讨论,一起攻关,请别的组同学帮忙,向老师请教遇到不懂的问题,互相提问,互帮互助。这次课程设计终于顺利完

16、成了,在设计中遇到了很多编程问题,最后在陈铧森同学的帮助下解决了难题,对给过我帮助的所有同学和指导老师再次表示忠心的感谢!也感谢学校为我们课程设计提供了这么好的设备,这么好的环境。附录(fl)#include #include /#include LCD1602.h/#include DS1302.h#define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P17; /实时(sh sh)时钟时钟线引脚 sbit DS1302_IO = P16; /实时(sh sh)时钟数据线引脚 sbit DS1302_RST

17、= P15; /实时时钟复位线引脚sbit wireless_1 = P30;sbit wireless_2 = P31;sbit wireless_3 = P32;sbit wireless_4 = P33;sbit ACC0 = ACC0;sbit ACC7 = ACC7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,时到日,月,年位闪的计数sbit Set = P20; /模式切换键sbit Up = P21; /加法按钮sbit Down = P22; /减法按钮sbit o

18、ut = P23; /立刻跳出调整模式按钮sbit DQ = P10; /温度传送数据IO口char done,count,temp,flag,up_flag,down_flag; /uchar temp_value; /温度值uchar TempBuffer5,week_value2; /void show_time(); /液晶显示程序/*1602液晶显示部分子程序*/Port Definitions*sbit LcdRs= P26;sbit LcdRw= P25;sbit LcdEn = P27;sfr DBPort = 0 x80;/P0=0 x80,P1=0 x90,P2=0 xA0

19、,P3=0 xB0.数据端口/内部等待函数*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_(); LcdEn=0;return DBPort;/向LCD写入命令(mng lng)或数据*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0 x01 / 清屏#define LCD_HOMING 0 x02 / 光标(un bio)返回原点void LCD_Write(bit style, unsigned c

20、har input)LcdEn=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意(zh y)顺序LcdEn=1;_nop_();/注意顺序LcdEn=0;_nop_();LCD_Wait();/设置显示模式*#define LCD_SHOW0 x04 /显示开#define LCD_HIDE0 x00 /显示关 #define LCD_CURSOR0 x02 /显示光标#define LCD_NO_CURSOR0 x00 /无光标 #define LCD_FLASH0 x01 /光标闪动#define LCD_NO_FLASH0 x0

21、0 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0 x08|DisplayMode);/设置输入模式*#define LCD_AC_UP0 x02#define LCD_AC_DOWN0 x00 / default#define LCD_MOVE0 x01 / 画面(humin)可平移#define LCD_NO_MOVE0 x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0 x04|

22、InputMode);/初始化LCD*void LCD_Initial()LcdEn=0;LCD_Write(LCD_COMMAND,0 x38); /8位数据(shj)端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0 x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启(kiq)显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动/液晶字符输入的位置*void GotoXY(uns

23、igned char x, unsigned char y)if(y=0)LCD_Write(LCD_COMMAND,0 x80|x);if(y=1)LCD_Write(LCD_COMMAND,0 x80|(x-0 x40);/将字符输出到液晶显示void Print(unsigned char *str)while(*str!=0)/while(*str!=0)LCD_Write(LCD_DATA,*str);str+;/*DS1302时钟(shzhng)部分子程序*/typedef struct SYSTEMTIMEunsigned char Second;unsigned char Mi

24、nute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString11;unsigned char TimeString9;SYSTEMTIME;/定义(dngy)的时间类型SYSTEMTIME CurrentTime; /#define AM(X)X#define PM(X)(X+12) / 转成24小时(xiosh)制#define DS1302_SECOND0 x80 /时钟芯片的寄存器位置,存放时间#def

25、ine DS1302_MINUTE0 x82#define DS1302_HOUR0 x84 #define DS1302_WEEK0 x8A#define DS1302_DAY0 x86#define DS1302_MONTH0 x88#define DS1302_YEAR0 x8C void DS1302InputByte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK

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

27、02_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址(dzh),命令 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

28、|0 x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS1302_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time-Second = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read130

29、2(DS1302_MINUTE);Time-Minute = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read1302(DS1302_HOUR);Time-Hour = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read1302(DS1302_WEEK);Time-Week = (Rea

30、dValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0 x70)4)*10 + (ReadValue&0 x0F);void DateToStr(SYSTEMTIME *Time) /将时间年,月,日,星期(xngq)数据转换成液晶显示字符串,放到数组里DateString i

31、f(hide_year2) /这里的if,else语句都是判断(pndun)位闪烁,2就不显示,输出字符串为 2007/07/22 Time-DateString0 = 2; Time-DateString1 = 0; Time-DateString2 = Time-Year/10 + 0; Time-DateString3 = Time-Year%10 + 0; else Time-DateString0 = ; Time-DateString1 = ; Time-DateString2 = ; Time-DateString3 = ;Time-DateString4 = /;if(hide

32、_monthDateString5 = Time-Month/10 + 0; Time-DateString6 = Time-Month%10 + 0; else Time-DateString5 = ; Time-DateString6 = ; Time-DateString7 = /;if(hide_dayDateString8 = Time-Day/10 + 0; Time-DateString9 = Time-Day%10 + 0; else Time-DateString8 = ; Time-DateString9 = ; if(hide_weekWeek%10 + 0; /星期的数

33、据另外放到 week_value数组里,跟年,月,日的分开存放,因为(yn wi)等一下要在最后显示 else week_value0 = ; week_value1 = 0;Time-DateString10 = 0; /字符串末尾加 0 ,判断(pndun)结束字符void TimeToStr(SYSTEMTIME *Time) /将时,分,秒数据(shj)转换成液晶显示字符放到数组 TimeString; if(hide_hourTimeString0 = Time-Hour/10 + 0; Time-TimeString1 = Time-Hour%10 + 0; else Time-T

34、imeString0 = ; Time-TimeString1 = ;Time-TimeString2 = :; if(hide_minTimeString3 = Time-Minute/10 + 0; Time-TimeString4 = Time-Minute%10 + 0; else Time-TimeString3 = ; Time-TimeString4 = ; Time-TimeString5 = :; if(hide_secTimeString6 = Time-Second/10 + 0; Time-TimeString7 = Time-Second%10 + 0; else T

35、ime-TimeString6 = ; Time-TimeString7 = ; Time-DateString8 = 0;void Initial_DS1302(void) /时钟(shzhng)芯片初始化 unsigned char Second=Read1302(DS1302_SECOND);if(Second&0 x80) /判断时钟(shzhng)芯片是否关闭 Write1302(0 x8e,0 x00); /写入允许(ynx)Write1302(0 x8c,0 x07); /以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55Write1302(0 x

36、88,0 x07);Write1302(0 x86,0 x25);Write1302(0 x8a,0 x07); /xingqiWrite1302(0 x84,0 x23);Write1302(0 x82,0 x59);Write1302(0 x80,0 x55);Write1302(0 x8e,0 x80); /禁止写入/*ds18b20子程序*/*ds18b20延迟子函数(晶振12MHz )*/ void delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函数(hnsh)*/void Init_DS18B20(void) unsigned c

37、har x=0; DQ = 1; /DQ复位(f wi) delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确(jngqu)延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);/*ds18b20读一个字节*/ unsigned char ReadOneChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1;

38、 /数据右移一位 DQ = 1; / 给脉冲信号 if(DQ) dat|=0 x80; /按位或,取最高位 delay_18B20(4); return(dat);/*ds18b20写一个字节*/ void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0 x01; /取最低位 delay_18B20(5); DQ = 1; /上升(shngshng)沿将数据送入 dat=1; /*读取ds18b20当前(dngqin)温度*/void ReadTemp(void)unsigned c

39、har a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0 xCC); / 跳过读序号列号的操作(cozu)WriteOneChar(0 x44); / 启动温度转换delay_18B20(100); / this message is wery importantInit_DS18B20();WriteOneChar(0 xCC); /跳过读序号列号的操作WriteOneChar(0 xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneCh

40、ar(); /读取温度值低位b=ReadOneChar(); /读取温度值高位temp_value=b4;/取温度值的地位的高四位,右移四位后与温度的高四位相加得到温度值 void temp_to_str() /温度数据转换成液晶字符显示 TempBuffer0=temp_value/10+0; /十位 TempBuffer1=temp_value%10+0; /个位 TempBuffer2=0 xdf; /温度符号 TempBuffer3=C; TempBuffer4=0;void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;ic

41、ount;i+)for(j=0;j0;delay-) for(i=0;i0 x59) /超过(chogu)59秒,清零 temp=0; break; case 2: temp=Read1302(DS1302_MINUTE); /读取分数(fnsh) temp=temp+1; /分数(fnsh)加1 up_flag=1; if(temp0 x59) /超过59分,清零 temp=0; break; case 3: temp=Read1302(DS1302_HOUR); /读取小时数 temp=temp+1; /小时数加1 up_flag=1; if(temp0 x23) /超过23小时,清零 t

42、emp=0; break; case 4: temp=Read1302(DS1302_WEEK); /读取星期数 temp=temp+1; /星期数加1 up_flag=1; if(temp0 x7) temp=1; break; case 5: temp=Read1302(DS1302_DAY); /读取日数 temp=temp+1; /日数加1 up_flag=1; if(temp0 x31) temp=1; break; case 6: temp=Read1302(DS1302_MONTH); /读取月数 temp=temp+1; /月数加1 up_flag=1; if(temp0 x1

43、2) temp=1; break; case 7: temp=Read1302(DS1302_YEAR); /读取年数(nin sh) temp=temp+1; /年数(nin sh)加1 up_flag=1; if(temp0 x85) temp=0; break; default:break; while(Up=0); /while(wireless_2=1); /void Downkey()/降序按键(n jin) Down=1; if(Down=0)/if(Down=0|wireless_3=1) mdelay(8); switch(count) case 1: temp=Read13

44、02(DS1302_SECOND); /读取秒数 temp=temp-1; /秒数减1 down_flag=1; /数据调整后更新标志 if(temp=0 x7f) /小于0秒,返回59秒 temp=0 x59; break; case 2: temp=Read1302(DS1302_MINUTE); /读取分数 temp=temp-1; /分数减1 down_flag=1; if(temp=-1) temp=0 x59; /小于0秒,返回59秒 break; case 3: temp=Read1302(DS1302_HOUR); /读取小时数 temp=temp-1; /小时数减1 down

45、_flag=1; if(temp=-1) temp=0 x23; break; case 4: temp=Read1302(DS1302_WEEK); /读取星期(xngq)数 temp=temp-1; /星期(xngq)数减1 down_flag=1; if(temp=0) temp=0 x7; break; case 5: temp=Read1302(DS1302_DAY); /读取日数 temp=temp-1; /日数减1 down_flag=1; if(temp=0) temp=31; break; case 6: temp=Read1302(DS1302_MONTH); /读取月数

46、temp=temp-1; /月数减1 down_flag=1; if(temp=0) temp=12; break; case 7: temp=Read1302(DS1302_YEAR); /读取年数(nin sh) temp=temp-1; /年数减1 down_flag=1; if(temp=-1) temp=0 x85; break; default:break; while(Down=0); /while(wireless_3=1); void Setkey()/模式选择(xunz)按键Set=1;if(Set=0)/if(Set=0|wireless_4=1) mdelay(4);

47、count=count+1; /Setkey按一次,count就加1 done=1; /进入调整(tiozhng)模式 while(Set=0); /while(wireless_4=1); void keydone()/按键功能(gngnng)执行 uchar Second; if(flag=0) /关闭时钟,停止计时 Write1302(0 x8e,0 x00); /写入允许 temp=Read1302(0 x80); Write1302(0 x80,temp|0 x80); Write1302(0 x8e,0 x80); /禁止写入 flag=1; Setkey(); /扫描模式切换按键

48、 switch(count) case 1:do /count=1,调整秒 outkey(); /扫描跳出按钮 Upkey(); /扫描加按钮 Downkey(); /扫描减按钮 if(up_flag=1|down_flag=1) /数据更新,重新写入新的数据 Write1302(0 x8e,0 x00); /写入允许 Write1302(0 x80,temp|0 x80); /写入新的秒数 Write1302(0 x8e,0 x80); /禁止写入 up_flag=0; down_flag=0; hide_sec+; /位闪计数(j sh) if(hide_sec3) hide_sec=0;

49、 show_time(); /液晶显示数据(shj) while(count=2);break; case 2:do /count=2,调整(tiozhng)分 hide_sec=0; outkey(); Upkey(); Downkey(); if(temp0 x60) temp=0; if(up_flag=1|down_flag=1) Write1302(0 x8e,0 x00); /写入允许 Write1302(0 x82,temp); /写入新的分数 Write1302(0 x8e,0 x80); /禁止写入 up_flag=0; down_flag=0; hide_min+; if(

50、hide_min3) hide_min=0; show_time(); while(count=3);break; case 3:do /count=3,调整小时 hide_min=0; outkey(); Upkey(); Downkey(); if(up_flag=1|down_flag=1) Write1302(0 x8e,0 x00); /写入允许 Write1302(0 x84,temp); /写入新的小时数 Write1302(0 x8e,0 x80); /禁止写入 up_flag=0; down_flag=0; hide_hour+; if(hide_hour3) hide_ho

51、ur=0; show_time(); while(count=4);break; case 4:do /count=4,调整(tiozhng)星期 hide_hour=0; outkey(); Upkey(); Downkey(); if(up_flag=1|down_flag=1) Write1302(0 x8e,0 x00); /写入允许(ynx) Write1302(0 x8a,temp); /写入新的星期(xngq)数 Write1302(0 x8e,0 x80); /禁止写入 up_flag=0; down_flag=0; hide_week+; if(hide_week3) hid

52、e_week=0; show_time(); while(count=5);break; case 5:do /count=5,调整日 hide_week=0; outkey(); Upkey(); Downkey(); if(up_flag=1|down_flag=1) Write1302(0 x8e,0 x00); /写入允许 Write1302(0 x86,temp); /写入新的日数 Write1302(0 x8e,0 x80); /禁止写入 up_flag=0; down_flag=0; hide_day+; if(hide_day3) hide_day=0; show_time(); while(count=6);br

温馨提示

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

评论

0/150

提交评论