基于89C51的定时器设计程序

#include "at89x51.h"
unsigned char code ddisp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//段显0123456789,P0口
unsigned char code wdisp[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//位选,P2口
void disp( );
void ms();
char data flag;
unsigned int m=0; //总累加器。
unsigned char m1=0,m2=0,m3=0; //秒,分,时累加器。
void time0(void ) interrupt 1 using 1//定时器T0中断。
{TH0=0xb2;
TL0=0xe0;
flag++;
}

void main(void ) //主函数。
{
TMOD=0x01;
EA=1;
ET0=1;
TH0=0xb2;
TL0=0xe0; //20ms
flag=0;
while(1)
{do{
disp( );
}while(flag<=50); //等待1s时间
if(m==0)
{flag=0;
P1_1=1;
TR0=0;
m=m1=m2=m3=0;
} //时间到关定时器,关P1_1口
else
{flag=0;
--m; //时间不到,m减1
}
}
}

void disp( ) //显示键盘函数
{
unsigned char k,S,S1,S2,M,M1,M2,H,H1,H2;
P2=wdisp[0]; //选中位
S=m%60;
S1=S%10; //数制转换
for(k=0;k<50;k++)
{P0=ddisp[S1];} //显示段码
P0=0x00; //关显示
if((P2_7==0)&&(TR0==0))
{if((P2_7==0)&&(TR0==0))
{ms();
do{}while(P2_7==0); //键盘除颤判断s5的状态
m1++;
if(m1>=60) m1=0;}} //60归0
P2=wdisp[1];
S2=(S-S1)/10;
for(k=0;k<50;k++)
{P0=ddisp[S2];}
P0=0x00;
if ((P2_7==0)&&(TR0==0))
{if((P2_7==0)&&(TR0==0))
{ ms();
do{}while(P2_7==0); //键盘除颤判断s4的状态
m2++;
if(m2>=60) m2=0;}}
P2=wdisp[2];
M=((m-S)/60)%60;
M1=M%10;
for(k=0;k<50;k++)
{P0=ddisp[M1]+0x80; } //显示小数点
P0=0x00;
if((P2_7==0)&&(TR0==0))
{ ms();
do{}while(P2_7==0); //键盘除颤判断s3的状态
m3++;
if(m3>=13) m3=0; }
P2=wdisp[3];
M2=(M-M1)/10;
for(k=0;k<50;k++)
{P0=ddisp[M2];}
P0=0x00;
if ((P2_7==0)&&(TR0==0))
{ ms();
if(P2_7==0) //键盘除颤判断s2的状态
TR0=1;
P1_1=0;
}
P2=wdisp[4];
H=((m-S)/60-M)/60;
H1=H%10;
for(k=0;k<50;k++)
{P0=ddisp[H1]+0x80;} //显示小数点
P0=0x00;
P2=wdisp[5];
H2=(H-H1)/10;
for(k=0;k<50;k++)
{P0=ddisp[H2];}
P0=0x00;
if(TR0==0) m=m1+60*m2+3600*m3; //总计数转换

}

void ms() //除颤程序
{unsigned int n;
for(n=0;n<1000;n++)
{ }
}

//本程序已通过uision2调试通过,在实验板实验正常,程序由祁维国编写,其中s5为秒对时
//s4为分对时,s3为时对时,s2为启动按钮。



相关文档
最新文档