- #include<reg52.h>
- #include<absacc.h>
- #defineunitunsignedint
- #defineucharunsignedchar
- /*定义字型字位口*/
- #defineDIGPORTXBYTE[0x8000]
- #defineWORDPORTXBYTE[0x4000]
- /*定义P1口各管脚*/
- sbitK0=P1^0;
- sbitK1=P1^1;
- sbitK2=P1^2;
- sbitBEEP=P1^3;
- sbitL0=P1^4;
- sbitL1=P1^5;
- sbitL2=P1^6;
- sbitL3=P1^7;
- uchardataBUFFER[2]={0,0};/*显示缓冲区(依次为低位,高位)*/
- uchardataCLOCK[4]={0,0,0,0};/*存放时钟时间(依次为百分秒,秒,分和时位)*/
- uchardataSECOND[2]={0,0};/*存放秒表时间(依次为百分秒,秒)*/
- uchardataREVERSE[4]={0,0,0,0};/*存放倒计时时间(依次为百分秒,秒,分和时位)*/
- /*定义运行状态*/
- uchardataSTATE=0;
- /*STATE=0,秒表*/
- /*STATE=1,倒计时分调整*/
- /*STATE=2,倒计时小时调整*/
- /*STATE=3,倒计时运行*/
- /*STATE=4or7,时钟运行*/
- /*STATE=5,时钟分调整*/
- /*STATE=6,时钟时调整*/
- bitbdataSND=0;/*秒表START*/
- bitbdataRST=0;/*秒表RESET*/
- bitbdataSTP=0;/*倒计时STOP*/
- /*数码管显示编码"0"-"9","A","-"*/
- ucharcodeTABLE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x40};
- voiddisplay(void)
- {
- uchari;/*显示缓冲区首址*/
- uchardelay;/*显示延时*/
- uchardisp;/*显示内容*/
- uchardigit;/*定义数码管显示位*/
- digit=0x08;
- for(i=0;i<2;i++)/*秒表,显示百分秒和秒*/
- {
- if(BUFFER[i]>100)disp=BUFFER[i]%10+10;
- elsedisp=BUFFER[i]%10;
- DIGPORT=digit;
- WORDPORT=TABLE[disp];
- for(delay=0;delay<=200;delay++);
- digit=digit>>1;
- disp=BUFFER[i]/10;
- DIGPORT=digit;
- WORDPORT=TABLE[disp];
- for(delay=0;delay<=200;delay++);
- digit=digit>>1;
- }
- }
- voidtimer0(void)interrupt1using1
- {
- /*重置定时初值*/
- TH0=-5000/256;
- TL0=-5000%256;
- /*时钟处理*/
- CLOCK[0]=CLOCK[0]+1;
- if((CLOCK[0]==50)&&(STATE>=4))
- {
- L0=!L0;
- }
- if(CLOCK[0]==100)
- {
- if(STATE>=4)L0=!L0;
- CLOCK[0]=0;
- CLOCK[1]=CLOCK[1]+1;
- if(CLOCK[1]==60)
- {
- CLOCK[1]=0;
- CLOCK[2]=CLOCK[2]+1;
- if(CLOCK[2]==60)
- {
- CLOCK[2]=0;
- CLOCK[3]=CLOCK[3]+1;
- if(CLOCK[3]==24)
- {
- CLOCK[3]=0;
- }
- }
- }
- }
- }
- voidtimer2(void)interrupt5using3
- {
- TF2=0;
- TH2=-5000/256;
- TL2=-5000%256;
- /*秒表处理*/
- if(STATE==0)
- {
- SECOND[0]=SECOND[0]+1;
- if(SECOND[0]==50)
- {
- L1=!L1;
- }
- if(SECOND[0]==100)
- {
- L1=!L1;
- SECOND[0]=0;
- SECOND[1]=SECOND[1]+1;
- if(SECOND[1]==100)
- {
- SECOND[1]=0;
- }
- }
- }
- /*倒计时处理*/
- if(STATE==3)
- {
- REVERSE[0]=REVERSE[0]+1;
- if(REVERSE[0]==50)
- {
- L2=!L2;
- }
- if(REVERSE[0]==100)
- {
- L2=!L2;
- REVERSE[0]=0;
- REVERSE[1]=REVERSE[1]+1;
- if(REVERSE[1]==60)
- {
- REVERSE[1]=00;
- REVERSE[2]=REVERSE[2]-1;
- if((REVERSE[2]==0)&&(REVERSE[3]==0))
- {
- TR2=0;
- STP=1;
- BEEP=0;
- }
- elseif(REVERSE[2]==0xff)
- {
- REVERSE[2]=59;
- REVERSE[3]=REVERSE[3]-1;
- }
- }
- }
- }
- }
- voidintsvr1(void)interrupt2using2
- {
- if(STATE==5)
- {
- CLOCK[2]=CLOCK[2]+1;
- if(CLOCK[2]==60)CLOCK[2]=0;
- }
- if(STATE==6)
- {
- CLOCK[3]=CLOCK[3]+1;
- if(CLOCK[3]==24)CLOCK[3]=0;
- }
- }
- voidtimer1(void)interrupt3using3
- {
- if(STATE==0)
- {
- if(RST)
- {
- SECOND[0]=0;
- SECOND[1]=0;
- L1=1;
- RST=0;
- }
- else
- {
- if(SND)TR2=1;
- else
- {
- L1=1;
- TR2=0;
- RST=1;
- }
- SND=!SND;
- }
- }
- elseif(STATE==1)
- {
- REVERSE[2]=REVERSE[2]+1;
- if(REVERSE[2]==60)REVERSE[2]=0;
- }
- elseif(STATE==2)
- {
- REVERSE[3]=REVERSE[3]+1;
- if(REVERSE[3]==24)REVERSE[3]=0;
- }
- else
- {
- if(STP)
- {
- BEEP=1;
- L2=1;
- STP=0;
- }
- elseTR2=0;
- }
- }
- voidmain(void)
- {
- ucharstabak;/*上一次程序运行的状态*/
- P1=0x0f;
- EA=1;IT1=1;ET0=1;
- TMOD=0x61;/*T1方式2计数,T0方式1计时*/
- TH0=-5000/256;TL0=-5000%256;
- TH1=0xff;TL1=0xff;
- T2CON=0;TH2=-5000/256;TL2=-5000%256;
- K0=1;K1=1;K2=1;
- STATE=P1&0x07;
- stabak=STATE;
- for(;;)
- {
- switch(STATE)
- {
- case0:/*STATE=0,秒表*/
- {
- EX1=0;ET1=1;ET2=1;TR1=1;SND=1;
- L1=1;L0=0;L2=0;
- SECOND[0]=0;
- SECOND[1]=0;
- }break;
- case1:/*STATE=1,倒计时分调整*/
- {
- EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;
- L2=1;L0=0;L1=0;
- REVERSE[0]=0;
- REVERSE[1]=0;
- }break;
- case2:/*STATE=2,倒计时小时调整*/
- {
- EX1=0;ET1=1;ET2=1;TR1=1;TR2=0;
- L2=1;L0=0;L1=0;
- REVERSE[0]=0;
- REVERSE[1]=0;
- }break;
- case3:/*STATE=3,倒计时运行*/
- {
- EX1=0;ET1=1;ET2=1;TR1=1;
- if((REVERSE[2]==0)&&(REVERSE[3]==0))L2=1;
- elseTR2=1;
- L0=0;L1=0;
- }break;
- case5:/*STATE=5,时钟分调整*/
- {
- IE1=0;EX1=1;ET1=0;ET2=1;TR0=0;
- L0=1;L1=0;L2=0;
- }break;
- case6:/*STATE=6,时钟时调整*/
- {
- IE1=0;EX1=1;ET1=0;ET2=1;TR0=0;
- L0=1;L1=0;L2=0;
- }break;
- default:/*STATE=4or7,时钟运行*/
- {
- EX1=0;ET1=0;ET2=1;TR0=1;
- L1=0;L2=0;
- }
- }
- while(STATE==stabak)
- {
- switch(STATE)
- {
- case0:/*STATE=0,秒表*/
- {
- BUFFER[0]=SECOND[0];
- BUFFER[1]=SECOND[1];
- }break;
- case1:/*STATE=1,倒计时分调整*/
- {
- BUFFER[0]=REVERSE[2];
- BUFFER[1]=101;/*A-*/
- }break;
- case2:/*STATE=2,倒计时小时调整*/
- {
- BUFFER[0]=110;/*-A*/
- BUFFER[1]=REVERSE[3];
- }break;
- case3:/*STATE=3,倒计时运行*/
- {
- BUFFER[0]=REVERSE[2];
- BUFFER[1]=REVERSE[3];
- }break;
- case5:/*STATE=5,时钟分调整*/
- {
- BUFFER[0]=CLOCK[2];
- BUFFER[1]=101;/*A-*/
- }break;
- case6:/*STATE=6,时钟时调整*/
- {
- BUFFER[0]=110;/*-A*/
- BUFFER[1]=CLOCK[3];
- }break;
- default:/*STATE=4or7,时钟运行*/
- {
- BUFFER[0]=CLOCK[2];
- BUFFER[1]=CLOCK[3];
- }
- }
- display();
- K0=1;K1=1;K2=1;
- STATE=P1&0x07;
- }
- stabak=STATE;
- }
- }
单片机的数字时钟
最新推荐文章于 2023-01-03 11:14:43 发布