51单片机倒计时器电路

1.应用MCS-51单片机设计倒计时器电路
2.选用4位LED数码显示;倒计时时间9.99s~99.99s可调,倒计时结束后,点亮一个发光二极管。

原理图绘制和程序编码


#include <reg52.h>

#define uchar unsigned char
#define uint unsigned int

sbit D1 = P1^0; // 4位LED数码管控制引脚
sbit D2 = P1^1;
sbit D3 = P1^2;
sbit D4 = P1^3;
sbit LED = P1^4; // 发光二极管控制引脚
sbit KEY1 = P3^0; // 按钮1控制引脚
sbit KEY2 = P3^1; // 按钮2控制引脚

uint cnt = 0; // 计数器
uchar sec = 0; // 秒数
uchar ms = 0; // 毫秒数
bit flag = 0; // 倒计时标志位

void delayms(uint xms) // 延时函数,单位为毫秒
{
    uint i,j;
    for(i=xms;i>0;i--)
        for(j=110;j>0;j--);
}

void display(uchar num) // 数码管显示函数
{
    switch(num)
    {
        case 0: D1=0;D2=0;D3=0;D4=0;break;
        case 1: D1=1;D2=0;D3=0;D4=0;break;
        case 2: D1=0;D2=1;D3=0;D4=0;break;
        case 3: D1=1;D2=1;D3=0;D4=0;break;
        case 4: D1=0;D2=0;D3=1;D4=0;break;
        case 5: D1=1;D2=0;D3=1;D4=0;break;
        case 6: D1=0;D2=1;D3=1;D4=0;break;
        case 7: D1=1;D2=1;D3=1;D4=0;break;
        case 8: D1=0;D2=0;D3=0;D4=1;break;
        case 9: D1=1;D2=0;D3=0;D4=1;break;
    }
}

void main()
{
    while(1)
    {
        if(KEY1 == 0) // 按钮1按下
        {
            delayms(20); // 延时去抖动
            if(KEY1 == 0)
            {
                flag = 1; // 标志位设为1,开始倒计时
                sec = 10; // 初始时间设为10秒
                ms = 0;
            }
            while(!KEY1); // 等待按钮1释放
        }
        if(KEY2 == 0) // 按钮2按下
        {
            delayms(20); // 延时去抖动
            if(KEY2 == 0)
            {
                flag = 0; // 标志位设为0,停止倒计时
                sec = 0; // 时间清零
                ms = 0;
                LED = 0; // 发光二极管熄灭
            }
            while(!KEY2); // 等待按钮2释放
        }
        if(flag) // 倒计时进行中
        {
            display(sec/10); // 显示秒的十位数
            delayms(5); // 延时5毫秒
            display(sec%10); // 显示秒的个位数
            delayms(5);
            display(ms/10); // 显示毫秒的十位数
            delayms(5);
            display(ms%10); // 显示毫秒的个位数
            delayms(5);
            ms--; // 每隔5毫秒毫秒数减1
            if(ms == 255) // 毫秒数减到0时,秒数减1
            {
                ms = 99;
                sec--;
            }
            if(sec == 0 && ms == 0) // 倒计时结束
            {
                flag = 0; // 标志位设为0,停止倒计时
                LED = 1; // 发光二极管点亮
            }
        }
    }
}

这种厂家作业,网上搜一下就有现成的电路和代码

以下是51单片机倒计时器电路的原理图和程序编码。

#include <reg52.h>   //头文件

sbit D1 = P0^0;        //定义LED数码管引脚
sbit D2 = P0^1;
sbit D3 = P0^2;
sbit D4 = P0^3;

sbit beep = P2^3;      //定义蜂鸣器引脚

void delay(unsigned int i);  //函数声明

void main()     //主函数
{
    unsigned char a,b,c,d;  //定义计数器,a、b、c、d分别为万位、千位、百位、十位
    unsigned int time;      //定义倒计时时间
    unsigned char i,j,k,l;  //定义计数器

    while(1)
    {
        P1 = 0xfe;    //设置P1口输出低电平,用于扫描LED数码管的第一个位置
        for(i=0;i<100;i++)   //100ms延时
        {
            for(j=0;j<10;j++)   //10ms延时
            {
                for(k=0;k<10;k++)   //1ms延时
                {
                    for(l=0;l<10;l++)   //100us延时
                    {
                        if((time > 0) && (time <= 9999))  //判断时间是否在合法范围内
                        {
                            a = time / 1000;   //计算万位
                            b = time % 1000 / 100;   //计算千位
                            c = time % 100 / 10;   //计算百位
                            d = time % 10;   //计算十位

                            P0 = 0x00;   //清零LED数码管

                            if(a != 0)   //判断万位是否为0
                            {
                                D1 = 1;      //点亮对应的LED数码管
                                P0 = 0x3f;
                                delay(2);
                            }

                            D1 = 0;     //关闭LED数码管

                            if((b != 0) || (a != 0))   //判断千位和万位是否为0
                            {
                                D2 = 1;
                                P0 = 0x06;
                                delay(2);
                            }

                            D2 = 0;

                            if((c != 0) || (b != 0) || (a != 0))   //判断百位、千位和万位是否为0
                            {
                                D3 = 1;
                                P0 = 0x5b;
                                delay(2);
                            }

                            D3 = 0;

                            D4 = 1;
                            P0 = 0x4f;
                            delay(2);

                            D4 = 0;

                            delay(1);   //延时1ms

                            time--;    //倒计时时间减1
                        }
                    }
                }
            }
        }

        beep = 1;     //蜂鸣器响一声

        if(time == 0)   //倒计时结束,点亮一个发光二极管
        {
            P2 = 0x01;
        }
    }
}

void delay(unsigned int i)   //延时函数
{
    unsigned int j,k;

    for(j=0;j<i;j++)
    {
        for(k=0;k<121;k++);
    }
}

该程序的主要思路如下:

初始化计数器和倒计时时间,并设置LED数码管和蜂鸣器的引脚。

在 while 循环中执行以下操作:

a. 设置 P1 口输出低电平,用于扫描 LED 数码管的第一个位置。

b. 分别循环延时100ms、10ms、1ms和100us。

c. 判断倒计时时间是否在合法范围内,如果是,计算出万位、千位、百位和十位的值