版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、#include<reg51.h> unsigned char DispBuf6; /时间显示缓冲区 unsigned char Disdate6; /日期显示缓冲区 unsigned char DisSec6; /秒表缓冲区 struct /设定时间结构体 unsigned char Hour; unsigned char Min; unsigned char Sec; Time; struct /设定日期结构体 unsigned char Year; unsigned char Month; unsigned char Days; Date; struct /设定毫秒结构体 u
2、nsigned char Minite; unsigned char Second; unsigned char MilliSec; Millisecond; unsigned char point=0; unsigned char point1=0;unsigned char point2=0; unsigned char Daymount; unsigned char Daymount1; unsigned char T0_Int_Times=0; /中断次数计数变量 unsigned char Flash_flag=0; /闪烁标志,每半秒闪烁 unsigned char Flash_f
3、lag1=0; /闪烁标志,每半秒闪烁 unsigned char DisPlay_Back=0; /显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致 unsigned char DisPlay_Back1=0; /显示缓冲区更新备份,如果显示缓冲区更新则跟闪烁标志不一致 unsigned char i,j; unsigned char SetMillisecond; /启动秒表 code unsigned char LEDCode=0x01,0xd7,0x22,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80; /数码管显示代码 code unsigned cha
4、r ErrorLEDCode=0x01,0xe7,0x12,0x82,0xc4,0x88,0x08,0xc1,0x00,0x80;/绘制错误图纸的数码管显示代码 void DisPlayBuf(); void ChangeToDispCode(); void ChangeToDispCode1(); void changedate(); / 调日期 void displaydate(); / 显示日期 void makedays(); /确定每个月的日期 void runSec(); void delay(unsigned int i); /函数声名 sbit P1_0=P10; sbit P
5、1_1=P11; sbit P1_2=P12; /* / Init 初始化代码 / 设定50ms中断一次,注:在Fosc=6M情况下 /* void Init(void) Date.Year=10; Date.Month=12; Date.Days=25; Time.Hour=12; Time.Min=0; Time.Sec=0; TMOD=0x01; TH0=(65536-5000)/256; TL0=(65536-5000)%256; TR0=1; ET0=1; EA=1; /*延时子程序*/void delay(unsigned int i) char j; for(i; i >
6、0; i-) for(j = 200; j > 0; j-); /* / 主程序 /* main() Init(); /初始化 for(;) if(DisPlay_Back!=Flash_flag) /是否显示? DisPlay_Back=Flash_flag; /显示过后要半秒后再显示 ChangeToDispCode(); /转化时间为可显示代码 if(Flash_flag) /更新双点闪烁 DispBuf2=DispBuf2|0x10; /双点熄灭 DispBuf4=DispBuf4|0x20; else DispBuf2=DispBuf2&0xef; /点亮双点 Disp
7、Buf4=DispBuf4&0xdf; ; if(Flash_flag & point=1) /更新小时 DispBuf0=DispBuf0|0xff; /小时熄灭 DispBuf1=DispBuf1|0xff; else DispBuf0=DispBuf0&0xff; /小时点亮 DispBuf1=DispBuf1&0xff; ; if(Flash_flag & point=2) /更新分钟 DispBuf2=DispBuf2|0xff; /分钟熄灭 DispBuf3=DispBuf3|0xff; else DispBuf2=DispBuf2&
8、0xff; /分钟点亮 DispBuf3=DispBuf3&0xff; ; if(Flash_flag & point=3) /更新秒钟 DispBuf4=DispBuf4|0xff; /秒钟熄灭 DispBuf5=DispBuf5|0xff; else DispBuf4=DispBuf4&0xff; /秒钟点亮 DispBuf5=DispBuf5&0xff; ; DisPlayBuf();/显示 if(P1&0x07)!=0x7) /按键处理模块模块 delay(250); if(P1&0x07)!=0x7) if(P1_2=0) point=
9、(point+1)%5; else if (P1_1=0) switch(point) case 0: Millisecond.Minite=0; Millisecond.Second=0; Millisecond.MilliSec=0; SetMillisecond+; runSec(); break; case 1: Time.Hour=( Time.Hour+1)%24; break; case 2: Time.Min=( Time.Min+1)%60; break; case 3: Time.Sec=( Time.Sec+1)%60; break; ; else if (P1_0=0)
10、 switch(point) case 0: ChangeToDispCode1(); Disdate2=Disdate2&0xef; /点亮双点 Disdate4=Disdate4&0xdf; displaydate(); delay(2000); break; case 1: Time.Hour=( Time.Hour+24-1)%24; break; case 2: Time.Min=( Time.Min+60-1)%60; break; case 3: Time.Sec=( Time.Sec+60-1)%60; break; case 4: changedate();
11、break; ; ; ; ; makedays(); /* / 把时间显示缓冲区的内容发到74HC164 /* void DisPlayBuf(void) unsigned char i; for(i=0;i<6;i+) SBUF=DispBufi; while(TI=0); /等待发送完毕 TI=0; /把发送完标志清掉以备下次再用 ; /* / 把日期显示缓冲区的内容发到74HC164 /* void displaydate(void) unsigned char i; for(i=0;i<6;i+) SBUF=Disdatei; while(TI=0); /等待发送完毕 TI
12、=0; /把发送完标志清掉以备下次再用 ; /* / 把秒表技术显示缓冲区的内容发到74HC164 /* void displaySec(void) unsigned char i; for(i=0;i<6;i+) SBUF=DisSeci; while(TI=0); /等待发送完毕 TI=0; /把发送完标志清掉以备下次再用 ; /* / 把时间转换为可以显示的代码 /* void ChangeToDispCode(void) DispBuf0=LEDCodeTime.Hour/10; DispBuf1=LEDCodeTime.Hour%10; DispBuf2=LEDCodeTime
13、.Min/10; DispBuf3=LEDCodeTime.Min%10; DispBuf4=ErrorLEDCodeTime.Sec/10; DispBuf5=LEDCodeTime.Sec%10; /* / 把日期转化为现实的数 /* void ChangeToDispCode1(void) Disdate0=LEDCodeDate.Year/10; Disdate1=LEDCodeDate.Year%10; Disdate2=LEDCodeDate.Month/10; Disdate3=LEDCodeDate.Month%10; Disdate4=ErrorLEDCode Date.Da
14、ys/10; Disdate5=LEDCodeDate.Days%10; /* / 秒表功能 /* void ChangeToDispCode2(void) DisSec0=LEDCodeMillisecond.Minite/10; DisSec1=LEDCodeMillisecond.Minite%10; DisSec2=LEDCodeMillisecond.Second/10; DisSec3=LEDCodeMillisecond.Second%10; DisSec4=ErrorLEDCode Millisecond.MilliSec/10; DisSec5=LEDCodeMillisec
15、ond.MilliSec%10; /* / 定时器中断 /* void T0_Int(void) interrupt 1 using 1 TH0=(65536-5000)/256; /定时器装填 TL0=(65536-5000)%256; if(SetMillisecond!=0) Millisecond.MilliSec+; if(Millisecond.MilliSec>=100) Millisecond.MilliSec=0; Millisecond.Second+; if(Millisecond.Second>=60) Millisecond.Second=0; Milli
16、second.Minite+; if(Millisecond.Minite>=60) Millisecond.Minite=0; T0_Int_Times+; /中断次数加 if(T0_Int_Times>=50) /每半秒更新闪烁标志 Flash_flag =1; Flash_flag1 =1; else Flash_flag =0; Flash_flag1 =0; ; if(T0_Int_Times>=100) /如果中断10次为1秒的时间开始更新时、分、秒 T0_Int_Times=0; Time.Sec+; if(Time.Sec>=60) Time.Sec=0
17、; Time.Min+; if(Time.Min>=60) Time.Min=0; Time.Hour=(Time.Hour+1)%24; if(Time.Hour>=24) Time.Hour=0; Date.Days+; if( Date.Days >Daymount) Date.Days=1; Date.Month+; if(Date.Month>12) Date.Month=1; Date.Year+; ; ; ; ; /*/*调节日期*/*void changedate(void) while(1) if(DisPlay_Back1!=Flash_flag1)
18、 /是否显示? DisPlay_Back1=Flash_flag1; /显示过后要半秒后再显示 ChangeToDispCode1(); /转化时间为可显示代码 if(Flash_flag1) /更新双点闪烁 Disdate2=Disdate2|0x10; /双点熄灭 Disdate4=Disdate4|0x20; else Disdate2=Disdate2&0xef; /点亮双点 Disdate4=Disdate4&0xdf; ; if(Flash_flag1& point1=1) /更新年 Disdate0=Disdate0|0xff; /年熄灭 Disdate1
19、=Disdate1|0xff; else Disdate0=Disdate0&0xff; /年点亮 Disdate1=Disdate1&0xff; ; if(Flash_flag1 & point1=2) /更新月 Disdate2=Disdate2|0xff; /月熄灭 Disdate3=Disdate3|0xff; else Disdate2=Disdate2&0xff; /月点亮 Disdate3=Disdate3&0xff; ; if(Flash_flag1 & point1=3) /更新天 Disdate4=Disdate4|0xff;
20、 /天熄灭 Disdate5=Disdate5|0xff; else Disdate4=Disdate4&0xff; /天点亮 Disdate5=Disdate5&0xff; ; displaydate(); if(P1&0x07)!=0x7) /*按键处理模块* delay(250); if(P1&0x07)!=0x7) if(P1_2=0) point1=(point1+1)%5; else if (P1_1=0) switch(point1) case 1: Date.Year+; break; case 2: Date.Month+; if( Date.
21、Month=13) Date.Month=1; break; case 3: makedays(); Date.Days+; if(Date.Days>Daymount) Date.Days=1; break; ; else if (P1_0=0) switch(point1) case 1: Date.Year-; break; case 2: Date.Month-; if( Date.Month<=0) Date.Month=12; break; case 3: makedays(); Date.Days-; if(Date.Days<=0) Date.Days=Daymount; ; break; ; ; if(point1=4) point1=0; break; /*/*调日期加时时确定天数*/* void makedays() switch (Date.Month) case 4: case 6: case 9: case 11: Daymount=30; break; ca
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 学校工作总结及工作计划
- 食品快检理论试卷含答案
- 电视摄像员岗前绩效评估考核试卷含答案
- 空管卫星通信设备机务员安全防护测试考核试卷含答案
- 桥隧工成果转化模拟考核试卷含答案
- 电子设备手工装接工安全素养水平考核试卷含答案
- 毛皮及毛皮制品加工工记录能力考核试卷含答案
- 城市轨道交通行车值班员岗中总结考核试卷含答案
- 海洋环境监测员安全培训测试考核试卷含答案
- 味精制造工安全防护强化考核试卷含答案
- 2026贵州省安全员《C证》考试题库
- 2026年烟草江苏公司招聘考试试题及答案
- 国有企业供应链管理制度
- 交管12123学法减分题库500题(含标准答案+解析2026全国完整版)
- 医疗抗菌板安装施工方案及技术措施
- 2025年中国外阴清洗液市场调查研究报告
- 消防文员面试试题及答案
- 管线支架焊接施工方案(3篇)
- 沪教版六年级第07讲一次式(知识点题型分层强化)(原卷版)
- 机械装配安全培训内容课件
- 2025版企业全权委托授权书模板(市场推广)
评论
0/150
提交评论