多功能电子时钟.docx
- 文档编号:23751452
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:18
- 大小:18.45KB
多功能电子时钟.docx
《多功能电子时钟.docx》由会员分享,可在线阅读,更多相关《多功能电子时钟.docx(18页珍藏版)》请在冰豆网上搜索。
多功能电子时钟
/********************************************************************
多功能电子时钟
单片机:
STC89C52系列或其兼容型号
外部晶振:
12MHZ
*********************************************************************/
#include"reg52.h"
#defineFOSC(12)//系统晶振,以MHZ为单位
#defineMSECOND(10)//定时器的定时时间,以毫秒为单位
#defineCLOCKCOUNT(3)//时钟个数
#defineFLASHHOUR
(1)//小时闪烁判断值
#defineFLASHMINUTE
(2)//分钟闪烁判断值
#defineFLASHSECOND(3)//秒闪烁判断值
#defineFLASHNONE(4)//不闪烁判断值
#defineFLASHFREQ(10)//小时、分、秒闪烁时的频率,值越大越慢
#defineBEEPFREQ(10)//蜂鸣器的发声频率,值越大越慢
#defineTIMEMODE12
(1)//12小时制
#defineTIMEMODE24
(2)//24小时制
#defineALARMON
(1)
#defineALARMOFF
(2)
#defineAM
(1)
#definePM
(2)
#definevTL0((65536-MSECOND*FOSC/12*1000)%256)//计算定时器初值
#definevTH0((65536-MSECOND*FOSC/12*1000)/256)
#defineSEGPORT(P0)//显示器段码口
#defineWEIPORT(P1)//显示器位码口
#defineBEEPON
(1)//打开蜂鸣器的电平
#defineBEEPOFF(0)//关闭蜂鸣器的电平
#defineLEDON
(1)//AM、PM指示灯的打开电平
#defineLEDOFF(0)//AM、PM指示灯的关闭电平
#defineKEY1
(1)//1号按键的键值
#defineKEY2
(2)//2号按键的键值
#defineKEY3(3)//3号按键的键值
#defineNOKEY(4)//无按键时的值
#defineKEYSPEED(5)//按键的响应速度,值越大响应越慢
#defineKEYWAITTIME(1000)//无按键时,自动退出前的等待时间,值越大时间越长
#defineALARMTIME(30000)//自动撤销闹铃前的等待时间,值越大时间越长
sbitKey1=P2^0;//1号按键,以下程序设定为“功能键”
sbitKey2=P2^1;//2号按键,以下程序设定为“增键”
sbitKey3=P2^2;//3号按键,以下程序设定为“减键”
sbitAmLed=P2^3;//AM指示灯
sbitPmLed=P2^4;//PM指示灯
sbitBeep=P2^7;//闹铃驱动口线
typedefstruct{//定义一个时钟结构体类型——TClock
unsignedcharHour;
unsignedcharMinute;
unsignedcharSecond;
unsignedintMSecond;//毫秒
unsignedcharAlarmOpen;
unsignedcharAlarmHour;
unsignedcharAlarmMinute;
unsignedcharAlarmFlag;
unsignedintAlarmTime;
}TClock;
unsignedcharcodeSegCode[]={//共阴极管dpgfedcba
0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,
0x00
};
TClockClock[CLOCKCOUNT],*pClock;//时钟数组和时钟指针
unsignedcharDispBuf[6];//显示缓冲区
unsignedcharKeyWaitFlag=0,AdjustTimeFlag=0;//用于函数间协调的两个标志
unsignedcharWhichClock=0;//存放当前所选时钟的下标
unsignedcharTimeMode=TIMEMODE24;//时间模式
unsignedcharAMorPM,AlarmOnOff;
unsignedintKeyWaitTime=0;//为无按键时的自动退出服务
voidxDelay(unsignedcharx)
{
unsignedchary;
for(;x>0;x--)
for(y=20;y>0;y--);
}
//将所选时钟的数据填充到显示缓冲区
//pClock——指向时钟的指针
voidFillDispBuf(TClock*pClock)
{
DispBuf[0]=SegCode[pClock->Hour/10];
DispBuf[1]=SegCode[pClock->Hour%10];
DispBuf[2]=SegCode[pClock->Minute/10];
DispBuf[3]=SegCode[pClock->Minute%10];
DispBuf[4]=SegCode[pClock->Second/10];
DispBuf[5]=SegCode[pClock->Second%10];
}
//将所选时钟的闹铃时间填充到显示缓冲区
//pClock——指向时钟的指针
voidFillAlarmToDispBuf(TClock*pClock)
{
DispBuf[0]=SegCode[10];
DispBuf[1]=SegCode[10];
DispBuf[2]=SegCode[pClock->AlarmHour/10];
DispBuf[3]=SegCode[pClock->AlarmHour%10];
DispBuf[4]=SegCode[pClock->Minute/10];
DispBuf[5]=SegCode[pClock->Minute%10];
}
//显示函数,用于显示时间,可闪烁显示
//FlashWhich——指定闪烁的部分,可取值FLASHHOUR、FLASHMINUTE、FLASHSECOND、FLASHNONE
voidDisplay(unsignedcharFlashWhich)
{
unsignedcharWeiCode,i;
staticunsignedcharFlashCount,nState=0;
if(FlashWhich!
=FLASHNONE)FlashCount=FLASHFREQ;
elsenState=0;
WeiCode=0xfe;
for(i=0;i<6;i++)
{
switch(FlashWhich){
caseFLASHHOUR:
if((i==0)||(i==1))
switch(nState){
case0:
//on
if(--FlashCount>0)SEGPORT=DispBuf[i];
else{FlashCount=FLASHFREQ;nState=1;}
break;
case1:
//off
if(--FlashCount>0)SEGPORT=SegCode[10];
else{FlashCount=FLASHFREQ;nState=0;}
break;
default:
nState=0;
}
elseSEGPORT=DispBuf[i];
break;
caseFLASHMINUTE:
if((i==2)||(i==3))
switch(nState){
case0:
//on
if(--FlashCount>0)SEGPORT=DispBuf[i];
else{FlashCount=FLASHFREQ;nState=1;}
break;
case1:
//off
if(--FlashCount>0)SEGPORT=SegCode[10];
else{FlashCount=FLASHFREQ;nState=0;}
break;
default:
nState=0;
}
elseSEGPORT=DispBuf[i];
break;
caseFLASHSECOND:
if((i==4)||(i==5))
switch(nState){
case0:
//on
if(--FlashCount>0)SEGPORT=DispBuf[i];
else{FlashCount=FLASHFREQ;nState=1;}
break;
case1:
//off
if(--FlashCount>0)SEGPORT=SegCode[10];
else{FlashCount=FLASHFREQ;nState=0;}
break;
default:
nState=0;
}
elseSEGPORT=DispBuf[i];
break;
default:
SEGPORT=DispBuf[i];
};
WEIPORT=WeiCode;
WeiCode<<=1;WeiCode|=0x01;
xDelay(10);
}
}
//显示指定时钟的时钟下标(编号)
//aClock——时钟下标
voidDisplayClock(signedcharaClock)
{
DispBuf[0]=0x39;//C
DispBuf[1]=0x38;//L
DispBuf[2]=0x3f;//O
DispBuf[3]=0x39;//C
DispBuf[4]=0x00;//熄灭
DispBuf[5]=SegCode[aClock];//时钟编号
Display(FLASHNONE);
}
//用于显示时钟的时间模式(12小时制或24小时制)
//xTimeMode——时间模式,可取值为TIMEMODE12、TIMEMODE24
voidDisplayTimeMode(unsignedcharxTimeMode)
{
if(xTimeMode==TIMEMODE12)
{
DispBuf[0]=SegCode[1];//1
DispBuf[1]=SegCode[2];//2
}
else
{
DispBuf[0]=SegCode[2];//2
DispBuf[1]=SegCode[4];//4
}
DispBuf[2]=0x74;//h
DispBuf[3]=0x5c;//o
DispBuf[4]=0x1c;//u
DispBuf[5]=0x70;//r
Display(FLASHNONE);
}
//用于显示所选时钟闹铃的开关状态
//OnOff——开关状态,可取值为ALARMON、ALARMOFF
voidDisplayAlarm(unsignedcharOnOff)
{
DispBuf[0]=0x77;//A
DispBuf[1]=0x38;//L
DispBuf[2]=0x77;//A
if(OnOff==ALARMON)
{
DispBuf[3]=0x00;//熄灭
DispBuf[4]=0x5c;//o
DispBuf[5]=0x54;//n
}
else
{
DispBuf[3]=0x5c;//o
DispBuf[4]=0x71;//F
DispBuf[5]=0x71;//F
}
Display(FLASHNONE);
}
//键盘函数,返回值为按键的键值
//返回值包括KEY1,KEY2,KEY3,NOKEY
unsignedcharKey(void)
{
staticunsignedcharxCount=0;
if(++xCount xCount=0; if(Key1==0)return(KEY1); elseif(Key2==0)return(KEY2); elseif(Key3==0)return(KEY3); elsereturn(NOKEY); } //系统初始化函数 voidInit(void) { TMOD=0x01; TL0=vTL0; TH0=vTH0; ET0=1; EA=1; TR0=1; pClock=Clock;//时钟指针初始指向第1个时钟 if(pClock->Hour>=12)AMorPM=PM; elseAMorPM=AM; AlarmOnOff=ALARMOFF; } voidmain(void) { unsignedcharaKey,nState=0,Temp=0; Init(); while (1){ aKey=Key(); switch(nState){ case0: //时钟正常运行 FillDispBuf(Clock+WhichClock); Display(FLASHNONE); AdjustTimeFlag=0; if(Clock[WhichClock].AlarmFlag)//驱动闹钟蜂鸣器 { if(++Temp>=BEEPFREQ){Beep^=1;Temp=0;} if(aKey! =NOKEY) { Clock[WhichClock].AlarmFlag=0; Temp=0; Beep=BEEPOFF; } } elseif(aKey==KEY1) {KeyWaitTime=0;Clock[WhichClock].MSecond=0;nState=1;} break; case1: //选择时钟 KeyWaitFlag=1;//等待按键时间内无按键,自动返回运行状态 if(KeyWaitTime>=KEYWAITTIME){KeyWaitTime=0;KeyWaitFlag=0;nState=0;} if(aKey==KEY1) {KeyWaitTime=0;nState=2;} elseif(aKey==KEY2) {if(WhichClock elseif(aKey==KEY3) {if(WhichClock>0)WhichClock--;KeyWaitTime=0;} DisplayClock(WhichClock); break; case2: //选择时间模式(12小时制或24小时制) KeyWaitFlag=1;//等待按键时间内无按键,自动返回运行状态 if(KeyWaitTime>=KEYWAITTIME){KeyWaitTime=0;KeyWaitFlag=0;nState=0;} if(aKey==KEY1){KeyWaitTime=0;AdjustTimeFlag=1;nState=3;} if((aKey==KEY2)||(aKey==KEY3)) { KeyWaitTime=0; if(TimeMode==TIMEMODE12) { TimeMode=TIMEMODE24; AmLed=LEDOFF; PmLed=LEDOFF; Clock[WhichClock].Hour+=12; } else { TimeMode=TIMEMODE12; if(Clock[WhichClock].Hour>=12) {PmLed=LEDON;AmLed=LEDOFF;Clock[WhichClock].Hour-=12;AMorPM=PM;} else {PmLed=LEDOFF;AmLed=LEDON;AMorPM=AM;} } } DisplayTimeMode(TimeMode); break; case3: //调整所选时钟的小时 KeyWaitFlag=1;//等待按键时间内无按键,自动返回运行状态 if(KeyWaitTime>=KEYWAITTIME){KeyWaitTime=0;KeyWaitFlag=0;nState=0;} FillDispBuf(Clock+WhichClock); Display(FLASHHOUR); if(aKey==KEY1) {KeyWaitTime=0;nState=4;} elseif(aKey==KEY2) { if(TimeMode==TIMEMODE12) { if(Clock[WhichClock].Hour<11){Clock[WhichClock].Hour++;KeyWaitTime=0;} } elseif(Clock[WhichClock].Hour<23){Clock[WhichClock].Hour++;KeyWaitTime=0;} } elseif(aKey==KEY3) {if(Clock[WhichClock].Hour>0)Clock[WhichClock].Hour--;KeyWaitTime=0;} break; case4: //调整所选时钟的分钟 KeyWaitFlag=1;//等待按键时间内无按键,自动返回运行状态 if(KeyWaitTime>=KEYWAITTIME){KeyWaitTime=0;KeyWaitFlag=0;nState=0;} FillDispBuf(Clock+WhichClock); Display(FLASHMINUTE); if(aKey==KEY1) {KeyWaitTime=0;nState=5;} elseif(aKey==KEY2) {if(Clock[WhichClock].Minute<59)Clock[WhichClock].Minute++;KeyWaitTime=0;} elseif(aKey==KEY3) {if(Clock[WhichClock].Minute>0)Clock[WhichClock].Minute--;KeyWaitTime=0;} break; case5: //调整所选时钟的秒 KeyWaitFlag=1;//等待按键时间内无按键,自动返回运行状态 if(KeyWaitTime>=KEYWAITTIME){KeyWaitTime=0;KeyWaitFlag=0;nState=0;} FillDispBuf(Clock+WhichClock); Display(FLASHSECOND); if(aKey==KEY1) {KeyWaitTime=0;AdjustTimeFlag=0;nState=6;} elseif(aKey==KEY2) {if(Clock[WhichClock].Second<59)Clock[WhichClock].Second++;KeyWaitTime=0;} elseif(aKey==KEY3) {if(Clock[WhichClock].Second>0)Clock[WhichClock].Second--;KeyWaitTime=0;} break; case6: //开关闹铃功能 KeyWaitFlag=1;//等待按键时间内无按键,自动返回运行状态 if(KeyWaitTime>=KEYWAITTIME){KeyWaitTime=0;KeyWaitFlag=0;nState=0;} if(aKey==KEY1){KeyWaitTime=0;nState=7;} if((aKey==KEY2)||(aKey==KEY3)) { KeyWaitTime=0; if(Clock[WhichClock].AlarmOpen) {Clock[WhichClock].AlarmOpen=0;AlarmOnOff=ALARMOFF;} else {Clock[WhichClock].AlarmOpen=1;AlarmOnOff=ALARMON;} } DisplayAlarm(AlarmOnOff); break; case7: //调整闹铃小时 KeyWaitFlag=1;//等待按键时间内无按键,自动返回运行状态 if(KeyWaitTime>=KEYWAITTIME){KeyWaitTime=0;KeyWaitFlag=0;nStat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 电子 时钟