下面这个仿真效果图,大家可按上面的电路来制作
/**
//模仿秒表计时功能,独立按键可控制计时数字的“暂停/走动”。(程序没有考虑计时精确度控制)
/*P2.2~P2.4与138译码器输入口连接
/*P1.0连接独立按键
/*P0口输出数据
***/
#include<AT89X51.H>
code unsigned char tab[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //共阴数码管 0-9 '-' '熄灭‘表
unsigned int count,a,b,sec,min,hour;
bit c_flag; // 暂停/计时 标志
/*****T1初始化*****/
void timer_1(void)
{
TH1=0x0ec;
TL1=0x078;
TR1=1;
}
/*****数据计数******/
void time_count(viod)
{
if(hour==60){sec=0,min=0,hour=0;}
else if(sec!=59) sec++;
else if(min!=59) {sec=0,min++;}
else {min=0,hour++;}
}
/******数字调整*******/
void get_count(unsigned int x)
{
a=x/10;
b=x%10;
}
/*******按键检测********/
void key_tach(void)
{
int i,j;
j=P1&0x01;
if(j==0){
for(i=0;i<=200;i++);
j=P1&0x01;
if(j==0)
{if(c_flag==1) c_flag=0;
else c_flag=1;}
}
}
/*******显示程序********/
void display(viod)
{
int flag;
P0=0x00;
flag=count%8;
switch(flag){
case 0:P2=flag*4;
get_count(hour);
P0=tab[a];
break;
case 1:P2=flag*4;
P0=tab[b];
break;
case 2:P2=flag*4;
P0=tab[10];
break;
case 3:P2=flag*4;
get_count(min);
P0=tab[a];
break;
case 4:P2=flag*4;
P0=tab[b];
break;
case 5:P2=flag*4;
P0=tab[10];
break;
case 6:P2=flag*4;
get_count(sec);
P0=tab[a];
break;
case 7:P2=flag*4;
P0=tab[b];
break;
default:return;
}
}
/*******中断服务程序********/
void int1() interrupt 3
{
key_tach();
if(c_flag==0)
{
if(count==7) {count=0;time_count();}
else count++;}
else
{
if(count==7) {count=0;}
else count++;}
display();
timer_1();
}
/******主程序*****/
void main()
{
c_flag=0;
count=0;
sec=0;
min=0;
hour=0;
TMOD=0x10;
EA=1;
ET1=1;
timer_1();
while(1);
}

