设计要求:
制作一个LED数码管显示的秒表,用2位数码管显示时间,最小计时单位为“百毫秒”,计时范围0.1~9.9s。第一次按下并松开按键,开启计时功能;第二次按下并松开按键,停止计时,数码管显示当前计数值;第三次按下,秒表清零,等待下一次按下按键再一次开启计时功能。
外部硬件电路连接
程序设计
#include<reg52.h>
sbit key = P3^7;
unsigned char code table0[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1}; //共阴段码表(含点)
unsigned char code table2[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴段码表(不含点)
//count1对小数点前变换次数进行计数判断,count2对小数点后变换次数进行计数判断,timer单次定时时间次数
unsigned char timer;
unsigned char count,num;
void delay(unsigned char xms)
{
unsigned char i, j;
while(xms)
{
i = 2;
j = 239;
do
{
while (--j);
}
while (--i);
xms--;
}
}
void t0_init()
{
TMOD = 0x01; //软件启动定时器T0,方式1 0000 0001
IE = 0x82; //EA=1,ET0=1,开总中断,开启定时器T0中断 1000 0001
TH0 = 0x3c; //设定初值
TL0 = 0xb0; //单次定时初值为50ms
}
void main()
{
t0_init(); //定时器初始化
count = 0;
num = 0;
timer = 0;
P0 = 0xbf; //设置P0初始状态,显示0
P2 = 0x3f; //设置P2初始状态,显示0
while(1)
{
if(key == 0)
{
delay(50);
if(key == 1)
{
count++; //对按键按下次数进行计数
switch(count)
{
case 1: //按下1次
{
TR0 = 1;
}
break;
case 2: //按下2次
{
TR0 = 0;
}
break;
case 3: //按下3次
{
count = 0; //按键按下次数清零
num = 0; //计数器的计数值清零
P0 = 0xbf; //数码管值清零
P2 = 0x3f;
}
break;
default:
{
P0 = 0xbf;
P2 = 0x3f;
}
break;
}
}
}
}
}
void t0_func() interrupt 1
{
TH0 = 0x3c; //重装初值
TL0 = 0xb0;
if(timer < 2) //50ms*2=0.1s
{
timer = timer +1;
}
else if(timer == 2) //时间达到0.1s
{
timer = 0; //将定时计数清零
num++;
P0 = table0[num / 10];
P2 = table2[num % 10];
}
if(num == 99) //计数器计数到99次后将计数值清零
num = 0;
}