最新消息:

51单片机 – 实现数码管静态显示秒表倒计时代码

51单片机 168浏览 0评论

本程序代码为《手把手教你学51单片机》5.4的课后练习题5,并且已经在KST-51 v1.3.2开发板验证通过。

#include <reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

//数码管真值表
unsigned char code LedChar[16] = {
    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E
};

unsigned int cnt = 0;       //记录进入Timer0中断次数
unsigned char sec = 15;     //记录经过的秒数,倒计时初值15,也可以写成十六进制的形式(0x0F)
bit flag1s = 0;             //定义一个bit形的变量,作为1秒的标志位

void main(){
    EA = 1;                 //使能总中断
    ENLED = 0;
    ADDR3 = 1;
    ADDR2 = 0;
    ADDR1 = 0;
    ADDR0 = 0;
    TMOD &= 0xF0;           //设置Timer0为工作模式1
    TMOD |= 0x01;
    TH0 = 0xDC;             //为Timer0赋初值,定时10ms
    TL0 = 0x00;
    ET0 = 1;                //使能Timer0中断
    TR0 = 1;                //启动Timer0

    while(1){
        P0 = LedChar[sec];  //当前秒数对应的真值表中的值送到P0口

        if(flag1s){
            flag1s = 0;
            if(sec > 0){
                sec--;      //当秒数大于0时,减1
            }
            else{
                sec = 15;   //当秒数等于0时,重新赋初值0x0F(十进制的15)
            }
        }
    }
}

void interruptTimer0() interrupt 1{
    TH0 = 0xDC;             //进入Timer0赋初值
    TL0 = 0x00;
    cnt++;                  //每进入1次中断,中断次数加1
    if(cnt >= 100){         //当进入了100次中断,即计时了10ms*100 = 1s时
        cnt = 0;            //记录进入中断次数清零
        flag1s = 1;         //定时1s标志位赋1
    }
}

您必须 登录 才能发表评论!