51单片机 4位数码管可调的定时器C程序编写,请帮忙给个编程思路或相关程序

发布时间:2019-08-27 19:38:13

51单片机 4位数码管可调的定时器C程序编写,请帮忙给个编程思路或相关程序

推荐回答

#include<reg51.h>

#define uchar unsigned char

uchar code ledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0-9

unsigned char sec=0,min=0,hour=12,scanled;

unsigned char key,flashbit,dot,time,times=0;tflash; 

unsigned char disdat[4];

sbit keyqt=P3^0;

sbit keyxz=P3^1;

sbit keytz=P3^2;

void dischg()

{

disdat[0]=min%10;

disdat[1]=min/10;

disdat[2]=hour%10;

disdat[3]=hour/10;

}

void t0isr() interrupt 1//秒计时

{

TR0=0;

TH0=0x3c;

TL0=0xb0;

TR0=1;

time++;

if(time<10)dot=0;

else dot=1;

if(time==20)

{

time=0;

sec++;

if(sec>59)

{

sec=0;

min++;

if(min>59)

{

hour++;

if(hour>23)hour=0;

}

}

}

dischg();

}

void t1isr() interrupt 3//显示

{

TR1=0;

TH1=0xec;

TL1=0x78;

TR1=1;

times++;

if(times>=50){times=0;tflash=~tflash;}

switch(scanled)

{

case 0:

P2=0x01;

P0=~ledtab[disdat[3]];

if((tflash==0)&&(flashbit==1))P0=~ledtab[0x10];

break;

case 1:

P2=0x02;

if(dot)P0=~(ledtab[disdat[2]]|0x80);

else P0=~ledtab[disdat[2]];

if((tflash==0)&&(flashbit==1))P0=~ledtab[0x10];

break;

case 2:

P2=0x04;

P0=~ledtab[disdat[1]];

if((tflash==0)&&(flashbit==2))P0=~ledtab[0x10];

break;

case 3:

P2=0x08;

P0=~ledtab[disdat[0]];

if((tflash==0)&&(flashbit==2))P0=~ledtab[0x10];

break;

default:break;

}

scanled++;

scanled%=4;

}

main()

{

TMOD=0x11;

TH0=0x3c;

TL0=0xb0;

TH1=0xec;

TL1=0x78;

EA=1;

TR1=1;

ET0=1;

ET1=1;

sec=0;

min=0;

hour=0;

flashbit=0;

scanled=0;

time=0;

tflash=0;

dot=1;

dischg();

while(1)

{

//flash();//闪烁

if(keyqt==0)//p3.0启停

{

while(keyqt==0);

TR0=~TR0;

flashbit=0;

}

if(keyxz==0)//p3.1选择调时、分

{

while(keyxz==0);

TR0=0;

flashbit++;

if(flashbit>2){flashbit=0;TR0=1;}

}

if(keytz==0)//调数

{

while(keytz==0);

if(flashbit==1)

{

hour++;

if(hour>23)hour=0;

}

if(flashbit==2)

{

min++;

if(min>59)min=0;

}

dischg();

}

}

}

以上问题属网友观点,不代表本站立场,仅供参考!