单片机万年历程序(带闹钟)

上传人:沈*** 文档编号:193244086 上传时间:2023-03-09 格式:PDF 页数:32 大小:814.89KB
收藏 版权申诉 举报 下载
单片机万年历程序(带闹钟)_第1页
第1页 / 共32页
单片机万年历程序(带闹钟)_第2页
第2页 / 共32页
单片机万年历程序(带闹钟)_第3页
第3页 / 共32页
资源描述:

《单片机万年历程序(带闹钟)》由会员分享,可在线阅读,更多相关《单片机万年历程序(带闹钟)(32页珍藏版)》请在装配图网上搜索。

1、word 文档 可自由复制编辑 第一章 设计方案 1.1.硬件设计 1.1.1 设计要求 实现年月日、时分秒、星期的显示功能,用两个按键来实现日期和时间的调整功能,调整要求星期能自动更新,且能实现位调。显示格式:四位年,两位月,两位日,星期字母前三位,两位时,两位分,两位秒。比如:YYYY-MM-DD WEEK HH:MM:SS 1.1.2 硬件框图 图 1-1-硬件框图 日期时间由硬件软件结合产生;按键之间相互配合完成当前日期时间的调整功能。过程与结果由控制芯片分别输出到显示器上。本设计附加了播放音乐的功能。音乐从蜂鸣器产生。1.1.3 硬件选择 1).显示模块 本设计具体选用与实际应用与消

2、耗资源相关。万年历用到的地方大多都在室内。现市场上与许多显示器,在日常生活中最常见的有数码管,led 点阵屏,lcd 液晶显示器等。八段数码管的优点:亮度高,显示大。驱动部份的软件简单;缺点:与液晶相比,耗电及体积大。数码管只能单纯的显示数字,不能生动的表达各个参数的信息,消耗电力也比 led 液晶显示器大。LCD 液晶显示器它是一种专门用来显示字母、数字、符号等的点阵型液晶模块,在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高,由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高

3、且不会闪烁。数字式接口,液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。体积小、重量轻,液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。功耗低,相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动 IC 上,因而耗电量比其它显示器要少得多。Lcd 液晶能一屏把本设计所要显示的信息表达完整。而且 lcd 耗电小,体积小很适合与室内使用。本设计的要求日期时间以数字表示、星期用 3 位英文字符表示共 21 个字符,lcd1602 能显示 32 个字符,足以完成显示功能。Lcd1602 有 16 个引脚,各个引脚功能见下

4、表:引脚号 引脚名 电平 输入/输出 作用 1 VSS 电源地 2 VDD Vcc 电源(+5v)3 VEE 对比调整电压 控制芯片 显示器 按键调整 word 文档 可自由复制编辑 4 RS 0/1 输入 0=输入指令,1=输入数据 5 R/W 0/1 输入 0=向 lcd 写入数据或指令 1=从 lcd 读取数据 6 E 1,1-0 输入 使能信号,1=读取信息 1-0(下降沿)执行指令 7 DB0 0/1 输入/输出 数据总线 line0 8 DB1 0/1 输入/输出 数据总线 line1 9 DB2 0/1 输入/输出 数据总线 line2 10 DB3 0/1 输入/输出 数据总线

5、 line3 11 DB4 0/1 输入/输出 数据总线 line4 12 DB5 0/1 输入/输出 数据总线 line5 13 DB6 0/1 输入/输出 数据总线 line6 14 DB7 0/1 输入/输出 数据总线 line7 15 A Vcc Lcd 背光正极 14 K Lcd 背光负极 表 1-1 lcd1602引脚及功能 2).按键与蜂鸣器 本设计选用轻触按钮,型号为 XDJT1102S。选用压电式蜂鸣器型号 PT-1540P RoHS。3).控制芯片 根据 lcd1602 液晶显示器与按键的引脚 I/O 数量以及扩展功能的要求,所选控制芯片至少需要三组 I/O口,本设计功能简

6、单,所以程序量较小,AT89C51 是一种带 4K 字节闪存只读存储器的低电压、高性能CMOS 8 位微处理器。AT89c51 是 51 系列基本的控制芯片,能满足本设计的要求,性价比也要低于 51系列其他的芯片。4).日期时间生成模块 为了减少成本,使用 51 的内部定时器中断再配合软件计数的方式来生成一秒的时间。word 文档 可自由复制编辑 1.2 软件设计 1.2.1 编程环境及语言:本设计的原理图实现是在 proteus 中实现的,本设计的程序在 keil Uvision4 环境中进行编程与调试的,keil Uvision4 与 proteus 联调能有效的对各个设计进行测试。编程语

7、言 51C。1.2.2 程序框图 图 1-2 程序框图 1).time0 中断用于生成时间,具体由程序和硬件共同产生 1 秒的时间。2).两个外部中断能进行时间日期的切换,和对时间日期进行调整,播放音乐,能满足对按键设置的要求。3).主函数能及时在液晶屏上显示默认的时间和调整后的时间。主函数 Time0 中 断与软件计数产生1秒的时间,并实现日期时间更新 按键 1 按下Int0 中断响应 按键 2 按下Int1 中断响应 液晶显示 word 文档 可自由复制编辑 第二章 系统设计 2.1 硬件设计 2.1.1 振荡电路 本设计 51 芯片选用内部振荡器方式。由于本设计的时间由内部定时器中断与软

8、件计数相结合产生的,所以从计算方便以及系统的效率上考虑,本设计选用 12MHz 频率的晶振,电路原理图如下:图 2-1 AT89C51 的振荡电路 经厂家推荐稳定电路的电容 C1,C2=30pF+-10p(附录资料 AT89C51.PDF 第 4-32 页)。2.1.2 复位电路 本设计使用上电复位电路。单片机晶振为 12MHz,起振时间将近 1ms,单片机 1个机器周期的时间为1us。单片机每次上电复位所需的最短延时应该不小于 treset。这里,treset 等于上电延时与起振延时之和。从实际上讲,延迟一个 treset 往往还不够,不能够保障单片机有一个良好的工作开端。复位电路把单片机锁

9、定在复位状态上并且维持一个延时(记作 TRST),以便给予电源电压从上升到稳定的一个等待时间;在电源电压稳定之后,再插入一个延时,给予时钟振荡器从起振到稳定的一个等待时间;在单片机开始进入运行状态之前,还要至少推迟 2 个机器周期的延时间。单片机是高电平的时候复位,一般是用电阻和电容组成的,电容充电的时 RST 复位端为高电平,此时单片机开始复位.电容充电完成,此时单片机复位完成。由此电容值可取 22uf,电阻值取 10K。详细见附录文件(电容充电时间的计算方法.pdf)图 2-2 AT89C51 上电复位电路 2.1.3 按键 选用两个轻触按键与单片机 P32(int0)、P33(int1)

10、两个引脚相接组成的独立按键。word 文档 可自由复制编辑 2.1.4 lcd 显示电路 1).lcd 的选用 本设计选用型号为 LCD-016M002L 显示器。具体资料见附录文件 LCD-016M002L.pdf。2).lcd 与 51 引脚的连接 Lcd1602引脚 AT89C51引脚 LCD1602引脚 AT89C51引脚 RS P20 DB3 P03 R/W P21 DB4 P04 E P22 DB5 P05 DB0 P00 DB6 P06 DB1 P01 DB7 P07 DB2 P02 表 2-1 lcd1602 与 51 的连接 VEE为液晶显示器对比度调整端,接正电源时对比度最

11、弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个 10K的电位器调整对比度。图 2-3 1602液晶与单片机接口电路 2.1.5 音乐播放电路 此模块采用蜂鸣器实现,蜂鸣器驱动电流为 20mA,单片机的 P1 口输出电流为 26mA 能够直接驱动蜂鸣器。只要编写相应的程序即可实现发出不同频率的声音,蜂鸣器与单片机的接口电路,蜂鸣器接线与单片机 P17 引脚相连。图 2-5 蜂鸣器电路 word 文档 可自由复制编辑 2.1.6 P0 上拉电阻计算 由于 lcd 数据口是与 51 的 P0 口连接的,在 P0 口做一般 I/O 使用时要外接上拉电阻。根据 LCD-016M00

12、2L 显示器的伏安特性,要保证上拉电阻明显小于 lcd 的阻抗,以使高电平时输出有效 Lcd 工作电压:+5V Lcd 工作电流:20mA lcd 阻抗=5v/20mA=2.5k。上拉电阻值可以取 2.2k(详细见附录资料上拉电阻下拉电阻的总结.doc),由于需要八个相同的上拉电阻如图 2-6所示,也可用一个排阻。具体型号见附录表。图 2-6 上拉电阻 word 文档 可自由复制编辑 2.2 软件设计 2.2.1 程序流程图 图 2-6 主函数流程 图 2-7 time0 中断服务程序流程 图 2-8 int1 中断服务流程开始 初始化 将数据写入缓冲区 显示缓冲区内容 开始 赋计数初值 判断

13、是否计满一秒 时间更新 返回 是 否 是 否 判断是否在调整状态 调整当前指针号的值 播放音乐 开始 返回 word 文档 可自由复制编辑 图 2-9 int0 中断服务流程 开始 定时器停止工作,调整指针加 1。调状态标志置 1,秒清零。等待按键松开。判断调整指针是否增到上限值(即调整完毕)指针复位。调整状态标志清零,定时器开始工作。返回 是 否 word 文档 可自由复制编辑 2.2.2 流程的各个模块设计 全局变量 datetime 数组保存日期时间星期的容器。min2,hour2,day2,mon2,year4;调整时候使用的中间变量。buffer_date16,buffer_time

14、16显示缓冲区。1).定时器中断服务程序 定时器 1 计时一秒。计数初值的计算方法如下:设晶振频率为 f,则定时/计数器计数频率为 f/12,定时/计数器的计数总次数 T_all在方式 1 为 216=65536,定时间隔为 T,计数初值为 a,则有 a=-Tf/12 将计数初值 a 分别赋给加 1 计数器 TH0、TL0:TH0=(T_all-a)/256;TL0=(T_all-a)%256;本设计晶振频率为 12MHz,定时间隔为 50ms,所以 a=-0.05*12000000/12 a=50000 TH0=(65536-50000)/256 TL0=(65536-50000)%256

15、1s 就要计 20 次,中断服务程序如下:void time0()interrupt 1 using 3 TH0=(65536-50000)/256;TL0=(65536-50000)%256;if(+count=20)/计时一秒 count=0;DATATIME();/按实际规则日期时间更新 2).int0中断服务程序 按键 1 接在了 int0对应的引脚 P32。按键 2 接在了 int1对应的引脚 P33。Int0为电平触发方式,int1为边沿触发方式。由于按键 2 是一键多功能,具体功能由状态标志 FLAG表明。所以在 int0中断服务程序中要有对 FLAG标志的置位及清位的操作。在调

16、整期间为了时间准确定时器不能工作,为了对日期时间的各位值进行循环调整,设置了一个计数器,它的值表明要调整的是哪位。终端服务程序如下:void int0_K1()interrupt 0 T R0=0;/定时器停止 c num+;/计数器加 1 F LAG=1;/标志位置位 d atetime0=0;w hile(K1=0);/等待按键松开 i f(cnum12)/调整结束,各个状态还原 TR0=1;cnum=-1;FLAG=0;word 文档 可自由复制编辑 3).int1中断服务程序 Int1只要判断标志位执行任务就行了,中断服务程序如下:void int1_K2()interrupt 2 i

17、 f(FLAG=1)/调整状态下则位对应调整位的增值,正常状态则播放音乐 EDIT_datetime(cnum);/按计数器的值调整对应位 e lse ShowString(0 x00,0,);/播放音乐是屏幕上的字幕 ShowString(0 x00,1,happy);music();Delayms(500);4).主函数程序 主函数对各个中断及 lcd1602初始化后,就一直进行显示工作了,显示的时候判断标志 FLAG以区别是正常显示还是闪烁显示。主程序如下:void main()I E=0X87;/开中断 ea=1,et0=1,et1=1,ex0=1 T CON=0X04;/it1为边沿

18、触发,it0电平触发 I P=0X0a;/定时器 0,1为高优先级 T MOD=0X01;/设置定时器 0 方式 1 T H0=(65536-50000)/256;T L0=(65536-50000)%256;I nitialize_LCD();/初始化 LCD T R0=1;w hile(1)buffer_value();/设置显示缓存区的内容 if(FLAG)/调整时对应调整位置闪烁 if(+refresh=5)refresh=0;Flash(cnum);DIS_buffer();/将显示缓冲区的内容输出到 lcd上 5).星期在调整是是自动更新的,这要归功于蔡勒公式。算法如下(C51表示

19、):unsigned char week()word 文档 可自由复制编辑 u nsigned int y,m,c,s;y=datetime5%100;c=datetime5/100;i f(datetime4=1)m=13;y-;i f(datetime4=2)m=14;y-;s=y+y/4+c/4-2*c+26*(m+1)/10+datetime3-1;/蔡勒公式 s=s%7;r eturn s;函数返回值:0-星期日,1-星期一6-星期六 6).闰年是自动判断的,算法:(year%4=0)&(year%100!=0)|year%400=0 函数代码如下:unsigned char Yni

20、an(unsigned char year)i f(year%400=0|year%4=0)&(year%100!=0)return 1;e lse return 0;是闰年返回 1,否则返回 0 7).月的天数判断,由于 1,3,5,7,8,10,12每月有 31 天;4,6,9,11每月有 30 天;2 月闰年 29 天,平年28 天。所以只要判断月号是哪一类的,就返回那类的值,2 月用闰年判断算法判断。函数代码如下:unsigned char MON(unsigned char month)s witch(month)case 1:case 3:case 5:case 7:case 8:

21、case 10:case 12:return 31;case 4:case 6:case 9:case 11:return 30;default:if(Ynian(datetime5)/二月特殊,闰年判断 word 文档 可自由复制编辑 return 29;else return 28;返回各月的天数上限。8).日期时间更新 按照实际规则更新,60 秒一分,60 分一时,24 小时一日,30 日或 31 日或 28 日或 29 日一月,12 月一年。函数代码如下:void DATATIME()d atetime0+;i f(datetime059)/秒判断 datetime0=0;dateti

22、me1+;i f(datetime159)/分 datetime1=0;datetime2+;i f(datetime223)/时 datetime2=0;datetime3+;i f(datetime3MON(datetime4)/日 datetime3=1;datetime4+;i f(datetime412)/月 datetime4=1;datetime5+;/年 /时刻为进入调整状态作准备,将当前日期时间值赋给调整时的变量 d atetime6=week();min0=datetime1%10;m in1=datetime1/10;h our0=datetime2%10;h our1=

23、datetime2/10;d ay0=datetime3%10;d ay1=datetime3/10;m on0=datetime4%10;word 文档 可自由复制编辑 m on1=datetime4/10;year0=datetime5%10,year1=datetime5%100/10;y ear2=datetime5%1000/100,year3=datetime5/1000;9).调整日期时间函数,利用 cnum计数器指定当前的调整属性,函数源代码如下:void EDIT_datetime(char cnum)s witch(cnum)case 0:min0+;if(min09)/分

24、低位调整限制 min0=0;break;case 1:min1+;if(min15)/分高调整限制 min1=0;break;case 2:hour0+;if(hour09)/时低位调整限制 hour0=0;break;case 3:hour1+;if(hour12)/时高位调整限制 hour1=0;break;case 4:day0+;if(day09)/日低位调整限制 day0=0;break;case 5:day1+;if(day13)/日高位调整限制 day1=0;break;case 6:mon0+;if(mon09)/月低位调整限制 mon0=0;break;case 7:word

25、 文档 可自由复制编辑 mon1+;if(mon11)/月高位调整限制 mon1=0;break;case 8:year0+;/年调整 if(year09)year0=0;break;case 9:year1+;if(year19)year1=0;break;case 10:year2+;if(year29)year2=0;break;case 11:year3+;if(year39)year3=0;break;d atetime1=min0+min1*10;/调整后将 datetime实时更新 d atetime2=hour0+hour1*10;d atetime3=day0+day1*10

26、;d atetime4=mon0+mon1*10;d atetime5=year0+year1*10+year2*100+year3*1000;调整后能及时让 datetime更新。10).将 datetime的日期时间星期按照格式放到缓冲区上,格式为:YYYY-MM-DD week HH:MM:SS 函数源代码如下:void buffer_value()F ormat_Datetime(datetime0,buffer_time+6);/将年月日时分秒星期,F ormat_Datetime(datetime1,buffer_time+3);/放到对应缓冲区的位置上 F ormat_Datet

27、ime(datetime2,buffer_time+0);/以待显示 F ormat_Datetime(datetime3,buffer_date+8);F ormat_Datetime(datetime4,buffer_date+5);F ormat_Datetime(datetime5%100,buffer_date+2);F ormat_Datetime(datetime5/100,buffer_date+0);word 文档 可自由复制编辑 b uffer_date13=week1week();b uffer_date14=week2week();b uffer_date15=week

28、3week();Lcd1602显示的是字符,所以用函数转换。Format_Datetime(数组 1,数组 2)功能:将数组 1 的数值转换为字符放到数组 2。11).闪烁显示,在主函数显示配合延时清空,写入缓冲区的内容,达到闪烁效果。具体哪位闪烁还是有cnum决定。函数源代码如下:void Flash(char n)s witch(n)case 0:buffer_clr(0,4);/对应分低位置,清空 break;case 1:buffer_clr(0,3);break;case 2:buffer_clr(0,1);break;case 3:buffer_clr(0,0);break;cas

29、e 4:buffer_clr(1,9);break;case 5:buffer_clr(1,8);break;case 6:buffer_clr(1,6);break;case 7:buffer_clr(1,5);break;case 8:buffer_clr(1,3);break;case 9:buffer_clr(1,2);break;case 10:buffer_clr(1,1);word 文档 可自由复制编辑 break;case 11:buffer_clr(1,0);break;case 12:Write_LCD_Command(0 xc0|12);/第 2 行 12 列后显示 ov

30、er Write_LCD_Data(o);Write_LCD_Data(v);Write_LCD_Data(e);Write_LCD_Data(r);break;12).显示缓冲区。源代码如下:void DIS_buffer()S howString(0 x00,0,buffer_date);/输出缓冲区的内容 S howString(0 x00,1,buffer_time);ShowString是 lcd的驱动函数。其他的驱动函数见下。13).lcd1602的驱动程序 Lcd1602与单片机引脚的连接前面已将过了。下面是各个对 lcd1602的操作。具体细节可看 lcd1602的资料。/*-

31、函数名:Busy_Check 功能:读取 lcd忙标志 输入参数:无 输出参数:返回读取的数据 版本号:1.1.0 修改日期:2010-06-01-*/unsigned char Busy_Check()unsigned char LCD_Status;R S=0;/寄存器选择 R W=1;/读状态寄存器 E N=1;/开始读 D elayms(1);LCD_Status=P0;E N=0;r eturn LCD_Status;/*-函数名:Write_LCD_Command 功能:向 LCD写指令 word 文档 可自由复制编辑 输入参数:cmd-指令 输出参数:无 版本号:1.1.0 修改

32、日期:2010-06-01-*/void Write_LCD_Command(unsigned char cmd)w hile(Busy_Check()&0 x80)=0 x80);/忙等待 R S=0;/选择命令寄存器 R W=0;/写 E N=0;P 0=cmd;E N=1;D elayms(1);E N=0;/*-函数名:Write_LCD_Data 功能:向 lcd发送数据 输入参数:dat-数据 输出参数:无 版本号:1.1.0 修改日期:2010-06-01-*/void Write_LCD_Data(unsigned char dat)while(Busy_Check()&0 x

33、80)=0 x80);/忙等待 RS=1;R W=0;E N=0;P 0=dat;E N=1;D elayms(1);E N=0;/*-函数名:Initialize_LCD 功能:对 lcd初始化 输入参数:无 输出参数:无 版本号:1.1.0 修改日期:2010-06-01-*/void Initialize_LCD()word 文档 可自由复制编辑 W rite_LCD_Command(0 x38);/8位,2 行,5x7点阵 D elayms(1);W rite_LCD_Command(0 x01);/清屏 D elayms(1);W rite_LCD_Command(0 x06);/字

34、符进入模式,屏幕不动,字符后移 D elayms(1);W rite_LCD_Command(0 x0c);/显示开,关光标 D elayms(1);/*-函数名:ShowString 功能:显示字符串 输入参数:x-列 y-行 str字符串 输出参数:无 版本号:1.1.0 修改日期:2010-06-01-*/void ShowString(unsigned char x,unsigned char y,unsigned char*str)unsigned char i=0;/设置显示起始位置 i f(y=0)Write_LCD_Command(0 x80|x);i f(y=1)Write_

35、LCD_Command(0 xc0|x);/输出字符串 f or(i=0;i16;i+)Write_LCD_Data(stri);word 文档 可自由复制编辑 心得体会 单片机的学习已告一段落,我对自己的专业有了更深的体会。非常感谢钱老师的辛勤教导,以企业的要求对我们进行培训,开拓我们的思维,改变我们的思维方式,让我们自主发挥,让我们在以后工作中少走很多弯路,并在此过程中让我们自己找到了自身的种种缺点,让我们受益非浅。也许现阶段的学习还存在诸多不足,在以后的学习中,会勤于总结,认真学好自己的专业课程。附录 1.元器件表 序号 代号 名称 型号、规格 数量 备注 1 U1 单片机 AT89C5

36、1 1 2 K1,K2 按钮 XDJT1102S 2 3 C1,C2 电容 0805 30pF 2 贴片 4 C3 电解电容 CSR13 22uF 1 5 X1 晶振 PTVC 75114 12MHz 1 6 Lcd 液晶显示器 LCD-016M002L 1 7 R1 电阻 RJ47 10k 0.5W 1 8 R2 电位器 WX2 27-15k 1W 1 9 RP1 排阻 A09-103J 2.2k 8 1w 1 贴片 10 S1 蜂鸣器 PT-1540P RoHS 1 压电式 11 Vcc 电源+5V 1 附录 2.程序源代码 word 文档 可自由复制编辑 1602.c 文件/*-项目名称

37、:万年历 制作:韩强 王先忠 王子房 杨振伟 版本号:1.1.2 修改日期:2010-06-04-*/#include#include#include sbit K1=P32;sbit K2=P33;unsigned char count,refresh;char cnum=-1;/日期时间的 指针 unsigned char FLAG=0;/调整标志 flag=1则是调整状态 unsigned char happy16=Happy birthday;void main()IE=0X87;/开中断 TCON=0X04;/it1为边沿触发,it0电平触发 IP=0X0a;/定时器 0,1为高优先

38、级 TMOD=0X01;/设置定时器 0 方式 1 TH0=(65536-50000)/256;TL0=(65536-50000)%256;Initialize_LCD();/初始化 LCD TR0=1;while(1)buffer_value();/设置显示缓存区的内容 if(FLAG)/调整时对应调整位置闪烁 if(+refresh=5)refresh=0;Flash(cnum);DIS_buffer();/将显示缓冲区的内容输出到 lcd上 void time0()interrupt 1 using 3 word 文档 可自由复制编辑 TH0=(65536-50000)/256;TL0=

39、(65536-50000)%256;if(+count=20)/计时一秒 count=0;DATATIME();/日期时间生成 void int0_K1()interrupt 0 TR0=0;cnum+;FLAG=1;/标志位置位 datetime0=0;while(K1=0);if(cnum12)/调整结束,各个状态还原 TR0=1;cnum=-1;FLAG=0;void int1_K2()interrupt 2 if(FLAG=1)/调整状态下则位对应调整位的增值,正常状态则播放音乐 EDIT_datetime(cnum);else ShowString(0 x00,0,);ShowStr

40、ing(0 x00,1,happy);music();Delayms(500);Clock.H 文件#ifndef _CLOCK_#define _CLOCK_ unsigned int datetime7=0,59,0,1,6,2010,2;/秒,分,时,日,月,年,星期 unsigned char code week17=SMTWTFS;/组成星期前三个字母 word 文档 可自由复制编辑 unsigned char code week27=uouehra;unsigned char code week37=nneduit;unsignedchar min2,hour2,day2,mon2

41、,year4;unsigned char buffer_date16=2010-06-01 2;unsigned char buffer_time16=00:00:00 ;/*-函数名:Ynian 功能:判断年份是否为闰年 输入参数:year一个有效的年份 输出参数:是闰年输出 1,否则输出 0 版本号:1.1.0 制作人:韩强 修改日期:2010-06-01-*/unsigned char Ynian(unsigned char year)if(year%400=0|year%4=0)&(year%100!=0)return 1;else return 0;/*-函数名:MON 功能:判断某

42、一月分的天数上限 输入参数:month一个有效的月份 输出参数:返回该月份的上限值 版本号:1.1.0 制作人:韩强 修改日期:2010-06-01-*/unsigned char MON(unsigned char month)switch(month)case 1:case 3:case 5:case 7:case 8:case 10:case 12:return 31;case 4:case 6:case 9:word 文档 可自由复制编辑 case 11:return 30;default:if(Ynian(datetime5)/二月特殊 return 29;else return 2

43、8;/*-函数名:week 功能:实现星期的更新 输入参数:无 输出参数:星期值,0-星期日,1-星期一6-星期六 版本号:1.1.0 修改日期:2010-06-01-*/unsigned char week()unsigned int y,m,c,s;y=datetime5%100;c=datetime5/100;if(datetime4=1)m=13;y-;if(datetime4=2)m=14;y-;s=y+y/4+c/4-2*c+26*(m+1)/10+datetime3-1;/蔡勒公式 s=s%7;return s;/*-函数名:DATATIME 功能:实现时间日期的更新 输入参数:

44、无 输出参数:无 版本号:1.1.1 修改日期:2010-06-02-*/void DATATIME()datetime0+;word 文档 可自由复制编辑 if(datetime059)/秒 datetime0=0;datetime1+;if(datetime159)/分 datetime1=0;datetime2+;if(datetime223)/时 datetime2=0;datetime3+;if(datetime3MON(datetime4)/日 datetime3=1;datetime4+;if(datetime412)/月 datetime4=1;datetime5+;/年 da

45、tetime6=week();/时刻为进入调整状态作准备 min0=datetime1%10;min1=datetime1/10;hour0=datetime2%10;hour1=datetime2/10;day0=datetime3%10;day1=datetime3/10;mon0=datetime4%10;mon1=datetime4/10;year0=datetime5%10,year1=datetime5%100/10;year2=datetime5%1000/100,year3=datetime5/1000;/*-函数名:Format_Datetime 功能:日期时间转换为数字字符

46、 输入参数:d-数据 a-指向存放转换结果的数组 输出参数:无 版本号:1.1.0 word 文档 可自由复制编辑 修改日期:2010-06-01-*/void Format_Datetime(unsigned int d,unsigned char*a)a0=d/10+0;a1=d%10+0;/*-函数名:EDIT_datetime 功能:实现对日期时间的调整(包括闹钟调整)输入参数:cnum是表指示前调整的值 -1,不调整,013分别是分 年的各位,14-保存调整结果 输出参数:无 版本号:1.1.2 修改日期:2010-06-05-*/void EDIT_datetime(char cn

47、um)switch(cnum)case 0:min0+;if(min09)/分低位调整限制 min0=0;break;case 1:min1+;if(min15)/分高调整限制 min1=0;break;case 2:hour0+;if(hour09)/时低位调整限制 hour0=0;break;case 3:hour1+;if(hour12)/时高位调整限制 hour1=0;break;word 文档 可自由复制编辑 case 4:day0+;if(day09)/日低位调整限制 day0=0;break;case 5:day1+;if(day13)/日高位调整限制 day1=0;break;

48、case 6:mon0+;if(mon09)/月低位调整限制 mon0=0;break;case 7:mon1+;if(mon11)/月高位调整限制 mon1=0;break;case 8:year0+;/年调整 if(year09)year0=0;break;case 9:year1+;if(year19)year1=0;break;case 10:year2+;if(year29)year2=0;break;case 11:year3+;if(year39)year3=0;break;word 文档 可自由复制编辑 datetime1=min0+min1*10;/调整后将 datetime

49、实时更新 datetime2=hour0+hour1*10;datetime3=day0+day1*10;datetime4=mon0+mon1*10;datetime5=year0+year1*10+year2*100+year3*1000;/*-函数名:buffer_vlaue 功能:对缓冲区的内选择 输入参数:无 输出参数:无 版本号:1.1.1 制作人:韩强 修改日期:2010-06-02-*/void buffer_value()Format_Datetime(datetime0,buffer_time+6);/将年月日时分秒星期,Format_Datetime(datetime1,

50、buffer_time+3);/放到对应缓冲区的位置上 Format_Datetime(datetime2,buffer_time+0);/以待显示 Format_Datetime(datetime3,buffer_date+8);Format_Datetime(datetime4,buffer_date+5);Format_Datetime(datetime5%100,buffer_date+2);Format_Datetime(datetime5/100,buffer_date+0);buffer_date13=week1week();buffer_date14=week2week();b

51、uffer_date15=week3week();/*-函数名:buffer_clr 功能:针对缓冲区位置进行清空 输入参数:无 输出参数:无 版本号:1.1.0 修改日期:2010-06-01-*/void buffer_clr(unsigned char datetime,unsigned char i)if(datetime=0)buffer_timei=;/对应位清空 if(datetime=1)buffer_datei=;word 文档 可自由复制编辑/*-函数名:Flash 功能:针对调节的位置进行闪烁显示 输入参数:无 输出参数:无 版本号:1.1.1 修改日期:2010-06-

52、02-*/void Flash(char n)switch(n)case 0:buffer_clr(0,4);/对应分低位置,清空 break;case 1:buffer_clr(0,3);break;case 2:buffer_clr(0,1);break;case 3:buffer_clr(0,0);break;case 4:buffer_clr(1,9);break;case 5:buffer_clr(1,8);break;case 6:buffer_clr(1,6);break;case 7:buffer_clr(1,5);break;case 8:buffer_clr(1,3);br

53、eak;case 9:buffer_clr(1,2);break;case 10:buffer_clr(1,1);word 文档 可自由复制编辑 break;case 11:buffer_clr(1,0);break;case 12:Write_LCD_Command(0 xc0|12);/第 2 行 12 列后显示 over Write_LCD_Data(o);Write_LCD_Data(v);Write_LCD_Data(e);Write_LCD_Data(r);break;/*-函数名:DIS_buffer 功能:实现对缓冲区的内容显示 输入参数:无 输出参数:无 版本号:1.1.0

54、修改日期:2010-06-01-*/void DIS_buffer()ShowString(0 x00,0,buffer_date);/输出缓冲区的内容 ShowString(0 x00,1,buffer_time);#endif Music.h 文件#ifndef _MUSIC_#define _MUSIC_/*-子程序名:MUSIC 功能:播放音乐 版本:1.1.0 修改日期:2010-06-01-*/#include#include sbit BEEP=P17;unsigned char code SONG_TONE=212,212,190,212,159,169,212,212,190

55、,212,142,159,212,212,106,126,129,169,190,119,119,126,159,142,159,0;word 文档 可自由复制编辑 unsigned char code SONG_LONG=9,3,12,12,12,24,9,3,12,12,12,24,9,3,12,12,12,12,12,9,3,12,12,12,24,0;void music()unsigned int i=0,j,k;while(SONG_LONGi!=0|SONG_TONEi!=0)for(j=0;jSONG_LONGi*20;j+)/拍子长度 BEEP=BEEP;for(k=0;kS

56、ONG_TONEi/3;k+);/音符频率 Delayms(10);i+;#endif LCD1602.H 文件/*writer:show.w*/#ifndef _LCD1602_#define _LCD1602_#include#include#include sbit RS=P20;/寄存器选择,高电平时选择数据寄存器 sbit RW=P21;/读写信号线,高电平时进行读操作 sbit EN=P22;/使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。void Delayms(unsigned int ms)unsigned char i;while(ms-)for(i=0;i1

57、20;i+);/*-函数名:Busy_Check 功能:读取 lcd忙标志 输入参数:无 输出参数:返回读取的数据 版本号:1.1.0 修改日期:2010-06-01-*/word 文档 可自由复制编辑 unsigned char Busy_Check()unsigned char LCD_Status;RS=0;/寄存器选择 RW=1;/读状态寄存器 EN=1;/开始读 Delayms(1);LCD_Status=P0;EN=0;return LCD_Status;/*-函数名:Write_LCD_Command 功能:向 LCD写指令 输入参数:cmd-指令 输出参数:无 版本号:1.1.

58、0 修改日期:2010-06-01-*/void Write_LCD_Command(unsigned char cmd)while(Busy_Check()&0 x80)=0 x80);/忙等待 RS=0;/选择命令寄存器 RW=0;/写 EN=0;P0=cmd;EN=1;Delayms(1);EN=0;/*-函数名:Write_LCD_Data 功能:向 lcd发送数据 输入参数:dat-数据 输出参数:无 版本号:1.1.0 修改日期:2010-06-01-*/void Write_LCD_Data(unsigned char dat)while(Busy_Check()&0 x80)=

59、0 x80);/忙等待 RS=1;RW=0;word 文档 可自由复制编辑 EN=0;P0=dat;EN=1;Delayms(1);EN=0;/*-函数名:Initialize_LCD 功能:对 lcd初始化 输入参数:无 输出参数:无 版本号:1.1.0 修改日期:2010-06-01-*/void Initialize_LCD()Write_LCD_Command(0 x38);/8位,2 行,5x7点阵 Delayms(1);Write_LCD_Command(0 x01);/清屏 Delayms(1);Write_LCD_Command(0 x06);/字符进入模式,屏幕不动,字符后移

60、 Delayms(1);Write_LCD_Command(0 x0c);/显示开,关光标 Delayms(1);/*-函数名:ShowString 功能:显示字符串 输入参数:x-列 y-行 str字符串 输出参数:无 版本号:1.1.0 修改日期:2010-06-01-*/void ShowString(unsigned char x,unsigned char y,unsigned char*str)unsigned char i=0;if(y=0)/设置显示起始位置 Write_LCD_Command(0 x80|x);if(y=1)Write_LCD_Command(0 xc0|x);for(i=0;i16;i+)/输出字符串 Write_LCD_Data(stri);#endif

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!