基于51单片机的电子时钟设计源程序_第1页
基于51单片机的电子时钟设计源程序_第2页
基于51单片机的电子时钟设计源程序_第3页
基于51单片机的电子时钟设计源程序_第4页
基于51单片机的电子时钟设计源程序_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论