要求:制作一个LED数码管显示的秒表,用2位数码管显示计时时间,最小计时单位为百毫秒,计时范围为0.0-9.9秒,按下第一次按键开始计时,第二次暂停,第三次秒表清零,如果计时到9.9s,重新开始从0计时。
proteus电路仿真如下:

这里我用的是共阳数码管,在proteus中为CA,代表共阳

代码如下:
#include<reg51.h>
typedef unsigned int uint; //定义无符号整形和字符型
typedef unsigned char uchar;
uchar led[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管 0 - 9
uchar led1[] = {0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //共阳数码管 0 - 9 加小数点
uchar second; //秒数
uchar key; //按键次数
uint t; //用来计数,每500,代表0.1s
sbit keyif = P3^7; //按键接口
void delay(){ //延时函数,用于消除抖动
uchar i,j;
for(i=0;i<255;i++){
for(j=0;j<100;j++);
}
}
void init(void) //初始化
{
TMOD = 0x02; //0000 0010 使用方式二
second = 0; //秒数初始化为0
EA = 1; //总中断,定时器0中断允许
ET0 = 1; //允许定时器0中断
key = 0; //按键次数初始化为0
t = 0; //计数初始化为0
}
void main(){
init();
P0 = led1[second/10];
P2 = led[second%10];
while(1){
if(keyif == 0){
delay();//消除抖动
if(keyif == 0){
key++;
switch(key){
case 1: //按一次,计时器开始
TH0 = 0x38;
TL0 = 0x38; //200us,也就是0.2ms
TR0 = 1;
break;
case 2: //按两次,暂停定时器
t = 0;
TR0 = 0;
break;
case 3: //按三次,停止计时,数据清零
key = 0;
second = 0;
P0 = led1[0];
P2 = led[0];
break;
}
while(keyif == 0); //若一直按下,使其停留
}
}
}
}
void timer() interrupt 1
{
TR0 = 0; //停止计时
t++;
if(t == 500){
second++;
P0 = led1[second/10];
P2 = led[second%10];
t = 0;
}
if(second == 99){ //当计数到9.9秒,重新开始计时
second = 0;
key = 1; //相当于重新开始计时
}
TR0 = 1; //继续启动计时器
}
本文介绍了如何使用51单片机和C语言制作一个LED数码管秒表,秒表以百毫秒为最小计时单位,显示范围0.0-9.9秒。通过按键控制开始、暂停和清零功能,当计时达到9.9秒时自动重置。在Proteus中进行了电路仿真,并展示了共阳数码管的使用。
2万+

被折叠的 条评论
为什么被折叠?



