题目:
用3位数码管显示计时时间,,计时范围0.01~9.99s。没有按任何按键时显示为0.00,当第1次按一下计时功能键时,秒表开始计时并显示;第2次按一下计时功能键时,停止计时,将计时的时间值送到数码管显示,第3次按一下计时功能键,秒表清0。再次按一下计时功能键,则重复上述计时过程。
protues仿真图: ![6ea125a498f24c51829081854a55be0a.jpeg](https://i-blog.csdnimg.cn/blog_migrate/52d053c371c3b75a20850153d7ad6ceb.jpeg)
keil c51代码:
#include<reg51.h>
unsigned char dis_1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char dis_10[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char dis_float[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char timer=0;
unsigned int second; //书上计数到99可以定义为unsigned char,但本题不能定义成unsigned char型,原因是要计数到999,char范围不够,溢出重新计时。
unsigned char key=0;
main()
{
TMOD=0x01;
ET0=1;
EA=1;
second=0;
P0=dis_10[second/100];
P1=dis_1[second%100/10];
P2=dis_float[second%10];
while(1)
{
if((P3&0x80)==0x00)
{
key++;
switch(key)
{
case 1:TH0=0xee;TL0=0x00;TR0=1;break;
case 2:TR0=0;break;
case 3:key=0;second=0;P0=dis_10[second/100];P1=dis_1[second%100/10];P2=dis_float[second%10];break;
}
while((P3&0x80)==0x00);
}
}
}
void int_T0() interrupt 1 using 0
{
TR0=0;
TH0=0xee;
TL0=0x00;
timer++;
if(timer==2)
{
timer=0;
second++;
P0=dis_10[second/100];
P1=dis_1[second%100/10];
P2=dis_float[second%10];
}
if(second==999)
{
TR0=0;
second=0;
key=2;
}
else
TR0=1;
}
希望大家能够在此基础上优化代码,不倡导Ctrl+c, Ctrl+v。
谢谢!!!