分时区、12小时制和24小时制多功能电子时钟_第1页
分时区、12小时制和24小时制多功能电子时钟_第2页
分时区、12小时制和24小时制多功能电子时钟_第3页
分时区、12小时制和24小时制多功能电子时钟_第4页
分时区、12小时制和24小时制多功能电子时钟_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

/*多功能电子时钟单片机:STC89C52系列或其兼容型号 外部晶振:12MHZ功能:1、支持多个时钟同时运行(CLOCKCOUNT) 2、每个时钟都具备12小时模式和24小时模式 3、12小时模式时,具备AM/PM的LED指示功能 4、每个时钟都具备闹铃功能 5、每个时钟的时间和闹铃时间都可设置 (自适应12小时模式和24小时模式)日期:2012.7.17(佳木斯大学65周年校庆)*/#include reg52.h#define FOSC(12)/系统晶振,以MHZ为单位#define MSECOND(10)/定时器的定时时间,以毫秒为单位#define CLOCKCOUNT(3)/时钟个数#define vTL0(65536-MSECOND*FOSC/12*1000)%256)/计算定时器初值#define vTH0(65536-MSECOND*FOSC/12*1000)/256)#define SEGPORT(P0)/显示器段码口#define WEIPORT(P1)/显示器位码口#define FLASHHOUR(1)/小时闪烁判断值#define FLASHMINUTE(2)/分钟闪烁判断值#define FLASHSECOND(3)/秒闪烁判断值#define FLASHALL(4)/所有位闪烁判断值#define FLASHNONE(5)/不闪烁判断值#define FLASHFREQ(10)/小时、分、秒闪烁时的频率,值越大越慢#define ALARMTIME(30000)/自动撤销闹铃前的等待时间,值越大时间越长#define ALARMON(1)/打开闹铃判断值#define ALARMOFF(2)/关闭闹铃判断值#define TIMEMODE12(1)/12小时模式#define TIMEMODE24(2)/24小时模式#define AM(1)/代表上午#define PM(2)/代表下午#define KEY1(1)/1号按键的键值#define KEY2(2)/2号按键的键值#define KEY3(3)/3号按键的键值#define NOKEY(4)/无按键时的返回键值#define BEEPON(1)/打开蜂鸣器的电平#define BEEPOFF(0)/关闭蜂鸣器的电平#define LEDON(1)/点亮LED时的电平#define LEDOFF(0)/熄灭LED时的电平#define BEEPFREQ(10)/蜂鸣器的发声频率,值越大越慢#define KEYSPEED(30)/按键的响应速度,值越大响应越慢#define KEYWAITTIME(1000)/无按键时,自动退出前的等待时间,值越大时间越长sbit Key1=P20;/1号按键,以下程序设定为“功能键”sbit Key2=P21;/2号按键,以下程序设定为“增键”sbit Key3=P22;/3号按键,以下程序设定为“减键”sbit Beep=P27;/闹铃驱动口线sbit AmLed=P23;/AM指示灯sbit PmLed=P24;/PM指示灯typedef struct/定义一个时钟结构体类型TClock unsigned char Hour;unsigned char Minute;unsigned char Second;unsigned int MSecond; /毫秒unsigned char TimeMode;/表示时钟模式,是12小时模式还是24小时模式unsigned char AmOrPm;/表示当前是上午还是下午unsigned char AlarmOpen;/是否打开闹铃的控制位unsigned char AlarmHour;unsigned char AlarmMinute;unsigned char AlarmFlag; /闹铃时间到标志unsigned int AlarmTime;/为自动退出闹铃状态服务unsigned char AlarmAmOrPm;/表示闹铃是设置在上午还是下午 TClock;unsigned char code SegCode=/共阴极管 dp g f e d c b a 0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f,0x00;TClock ClockCLOCKCOUNT,*pClock;/时钟数组和时钟指针unsigned char KeyWaitFlag=0,AdjustTimeFlag=0;/用于函数间协调的两个标志unsigned char WhichClock=0;/存放当前所选时钟的下标unsigned char DispBuf6;/显示缓冲区unsigned char KeyWaitTime=0;/为无按键时的自动退出服务/通用的软件延时函数/x要延时的时间,范围0255void xDelay(unsigned char x) unsigned char y; for(;x0;x-) for(y=30;y0;y-);/将所选时钟的数据填充到显示缓冲区/pClock指向时钟的指针void FillDispBuf(TClock *pClock) DispBuf0=SegCodepClock-Hour/10; DispBuf1=SegCodepClock-Hour%10; DispBuf2=SegCodepClock-Minute/10; DispBuf3=SegCodepClock-Minute%10; DispBuf4=SegCodepClock-Second/10; DispBuf5=SegCodepClock-Second%10;/将所选时钟的闹铃时间填充到显示缓冲区/pClock指向时钟的指针void FillAlarmToDispBuf(TClock *pClock) DispBuf0=SegCode10; DispBuf1=SegCode10; DispBuf2=SegCodepClock-AlarmHour/10; DispBuf3=SegCodepClock-AlarmHour%10; DispBuf4=SegCodepClock-AlarmMinute/10; DispBuf5=SegCodepClock-AlarmMinute%10;/显示函数,用于显示时间,可闪烁显示/FlashWhich指定闪烁的部分,可取值FLASHHOUR、/FLASHMINUTE、FLASHSECOND、FLASHALL、FLASHNONEvoid Display(unsigned char FlashWhich) unsigned char WeiCode,i; static unsigned char nState=0,FlashCount=FLASHFREQ; WeiCode=0xfe; for(i=0;i0) SEGPORT=DispBufi;else FlashCount=FLASHFREQ; nState=1; break; case 1: /offif(-FlashCount0) SEGPORT=DispBuf10;else FlashCount=FLASHFREQ; nState=0; break; default: nState=0; else SEGPORT=DispBufi;break;case FLASHMINUTE:if (i=2)|(i=3) switch(nState) case 0: /onif(-FlashCount0) SEGPORT=DispBufi;else FlashCount=FLASHFREQ; nState=1; break; case 1: /offif(-FlashCount0) SEGPORT=DispBuf10;else FlashCount=FLASHFREQ; nState=0; break; default: nState=0; else SEGPORT=DispBufi;break;case FLASHSECOND:if (i=4)|(i=5) switch(nState) case 0: /onif(-FlashCount0) SEGPORT=DispBufi;else FlashCount=FLASHFREQ; nState=1; break; case 1: /offif(-FlashCount0) SEGPORT=DispBuf10;else FlashCount=FLASHFREQ; nState=0; break; default: nState=0; else SEGPORT=DispBufi;break;case FLASHALL:switch(nState) case 0: /onif(-FlashCount0) SEGPORT=DispBufi;else FlashCount=FLASHFREQ; nState=1; break; case 1: /offif(-FlashCount0) SEGPORT=DispBuf10;else FlashCount=FLASHFREQ; nState=0; break; default: nState=0;break;default: SEGPORT=DispBufi;FlashCount=FLASHFREQ; WEIPORT=WeiCode; WeiCode=1; WeiCode|=1; xDelay(10); /显示指定时钟的时钟下标(编号)/aClock时钟下标void DisplayClock(unsigned char xClock) DispBuf0=0x39;/C DispBuf1=0x38;/L DispBuf2=0x3f;/O DispBuf3=0x39;/C DispBuf4=0x00;/熄灭 DispBuf5=SegCodexClock;/时钟编号 Display(FLASHNONE);/用于显示所选时钟闹铃的开关状态/OnOff开关状态,可取值为ALARMON、ALARMOFFvoid DisplayOnOffAlarm(unsigned char OnorOff) DispBuf0=0x77;/A DispBuf1=0x38;/L DispBuf2=0x77;/A if (OnorOff=ALARMON) DispBuf3=0x00;/熄灭 DispBuf4=0x5c;/o DispBuf5=0x54;/n else DispBuf3=0x5c;/o DispBuf4=0x71;/F DispBuf5=0x71;/F Display(FLASHNONE); /用于显示时钟的时间模式(12小时制或24小时制)/xTimeMode时间模式,可取值为TIMEMODE12、TIMEMODE24void DisplayTimeMode(unsigned char xTimeMode) if (xTimeMode=TIMEMODE12) DispBuf0=SegCode1; /1 DispBuf1=SegCode2; /2 else DispBuf0=SegCode2; /2 DispBuf1=SegCode4; /4 DispBuf2=0x74; /h DispBuf3=0x5c; /o DispBuf4=0x1c; /u DispBuf5=0x70; /r Display(FLASHNONE);/键盘函数,返回值为按键的键值/返回值包括KEY1,KEY2,KEY3,NOKEYunsigned char Key(void) static unsigned char xCount=0; if (+xCountAlarmOpen=ALARMOFF; pClock-TimeMode=TIMEMODE24; AmLed=LEDOFF; PmLed=LEDOFF;void main(void) unsigned char nState=0,aKey,Temp=0; Init(); while(1) aKey=Key(); switch(nState) case 0:/时钟正常运行FillDispBuf(Clock+WhichClock);Display(FLASHNONE);if(ClockWhichClock.AlarmFlag)/驱动闹钟蜂鸣器 if(+Temp=BEEPFREQ) Temp=0; Beep=1; if(aKey!=NOKEY) ClockWhichClock.AlarmFlag=0;Temp=0;Beep=BEEPOFF; if (aKey=KEY1) KeyWaitTime=0; nState=1; break; case 1: /选择时钟KeyWaitFlag=1;/等待按键时间内无按键,自动返回运行状态if (KeyWaitTime=KEYWAITTIME) nState=0; KeyWaitFlag=0; KeyWaitTime=0;if (aKey=KEY1) KeyWaitTime=0; ClockWhichClock.MSecond=0; nState=2; if (aKey=KEY2) KeyWaitTime=0; if(WhichClock0) WhichClock-;DisplayClock(WhichClock); break; case 2:/选择时间模式(12小时制或24小时制)KeyWaitFlag=1;/等待按键时间内无按键,自动返回运行状态if (KeyWaitTime=KEYWAITTIME) nState=0; KeyWaitFlag=0; KeyWaitTime=0;if (aKey=KEY1) KeyWaitTime=0; AdjustTimeFlag=1; nState=3;if (ClockWhichClock.TimeMode=TIMEMODE12) DisplayTimeMode(TIMEMODE12); if (ClockWhichClock.AmOrPm=PM)PmLed=LEDON; AmLed=LEDOFF; else PmLed=LEDOFF; AmLed=LEDON; if (aKey=KEY2)|(aKey=KEY3) KeyWaitTime=0;ClockWhichClock.TimeMode=TIMEMODE24;ClockWhichClock.Hour+=12; else DisplayTimeMode(TIMEMODE24); AmLed=LEDOFF; PmLed=LEDOFF; if (aKey=KEY2)|(aKey=KEY3) ClockWhichClock.TimeMode=TIMEMODE12;if (ClockWhichClock.Hour=12) KeyWaitTime=0; ClockWhichClock.Hour-=12; ClockWhichClock.AmOrPm=PM; else ClockWhichClock.AmOrPm=AM; break; case 3:/调整所选时钟的小时KeyWaitFlag=1;/等待按键时间内无按键,自动返回运行状态if (KeyWaitTime=KEYWAITTIME) nState=0; KeyWaitFlag=0; KeyWaitTime=0;if (aKey=KEY1) KeyWaitTime=0; nState=4;if (aKey=KEY2) KeyWaitTime=0; if (ClockWhichClock.TimeMode=TIMEMODE12) if (ClockWhichClock.Hour12) ClockWhichClock.Hour+;else if (ClockWhichClock.AmOrPm=PM) ClockWhichClock.AmOrPm=AM;ClockWhichClock.Hour=0; else ClockWhichClock.AmOrPm=PM;ClockWhichClock.Hour=0; else if (ClockWhichClock.Hour0) ClockWhichClock.Hour-; FillDispBuf(Clock+WhichClock);Display(FLASHHOUR); break; case 4:/调整所选时钟的分钟KeyWaitFlag=1;/等待按键时间内无按键,自动返回运行状态if (KeyWaitTime=KEYWAITTIME) nState=0; KeyWaitFlag=0; KeyWaitTime=0;if (aKey=KEY1) KeyWaitTime=0; nState=5;if (aKey=KEY2) KeyWaitTime=0; if(ClockWhichClock.Minute0) ClockWhichClock.Minute-; FillDispBuf(Clock+WhichClock);Display(FLASHMINUTE); break; case 5:/调整所选时钟的秒KeyWaitFlag=1;/等待按键时间内无按键,自动返回运行状态if (KeyWaitTime=KEYWAITTIME) nState=0; KeyWaitFlag=0; KeyWaitTime=0;if (aKey=KEY1) KeyWaitTime=0; AdjustTimeFlag=0; nState=6;if (aKey=KEY2) KeyWaitTime=0; if(ClockWhichClock.Second0) ClockWhichClock.Second-; FillDispBuf(Clock+WhichClock);Display(FLASHSECOND); break; case 6:/开关闹铃功能KeyWaitFlag=1;/等待按键时间内无按键,自动返回运行状态if (KeyWaitTime=KEYWAITTIME) nState=0; KeyWaitFlag=0; KeyWaitTime=0;if (aKey=KEY1) KeyWaitTime=0; if(ClockWhichClock.AlarmOpen) nState=7; else nState=0; if(ClockWhichClock.AlarmOpen) DisplayOnOffAlarm(ALARMON); if(aKey=KEY2)|(aKey=KEY3) KeyWaitTime=0; ClockWhichClock.AlarmOpen=ALARMOFF; else DisplayOnOffAlarm(ALARMOFF); if(aKey=KEY2)|(aKey=KEY3) KeyWaitTime=0; ClockWhichClock.AlarmOpen=ALARMON; break; case 7:/调整闹铃小时KeyWaitFlag=1;/等待按键时间内无按键,自动返回运行状态if (KeyWaitTime=KEYWAITTIME) nState=0; KeyWaitFlag=0; KeyWaitTime=0;if (aKey=KEY1) KeyWaitTime=0; nState=8;if (aKey=KEY2) KeyWaitTime=0; if (ClockWhichClock.TimeMode=TIMEMODE12) if (ClockWhichClock.AlarmHour12) ClockWhichClock.AlarmHour+;else if (ClockWhichClock.AlarmAmOrPm=PM) ClockWhichClock.AlarmAmOrPm=AM;ClockWhichClock.AlarmHour=0; else ClockWhichClock.AlarmAmOrPm=PM;ClockWhichClock.AlarmHour=0; else if(ClockWhichClock.AlarmHour0) ClockWhichClock.AlarmHour-; FillAlarmToDispBuf(Clock+WhichClock);Display(FLASHMINUTE);break; case 8:/调整闹铃分钟KeyWaitFlag=1;/等待按键时间内无按键,自动返回运行状态if (KeyWaitTime=KEYWAITTIME) nState=0; KeyWaitFlag=0; KeyWaitTime=0;if (aKey=KEY1) KeyWaitTime=0; nState=0;if (aKey=KEY2) KeyWaitTime=0; if(ClockWhichClock.AlarmMinute0) ClockWhichClock.AlarmMinute-; FillAlarmToDispBuf(Clock+WhichClock);Display(FLASHSECOND); break; default: nState=0; /T0定时器10ms中断服务函数void T0Int(void) inter

温馨提示

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

评论

0/150

提交评论