基于51单片机——LED数码管秒表的制作

本文介绍了如何使用51单片机设计一个LED数码管秒表,该秒表能显示0.1~9.9s的时间,最小计时单位为百毫秒。通过按键操作实现计时的开始、暂停和清零功能,详细阐述了外部硬件电路连接及程序设计思路。
该文章已生成可运行项目,

设计要求:

制作一个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;
	
}



本文章已经生成可运行项目
评论 15
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单片机学习之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值