最新消息:

51单片机 – 秒表计时代码

51单片机 190浏览 0评论

手撸一边代码,加深记忆。就不写注释了。使用的是51单片机的定时器0,进中断来刷新数码管。

#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 char LedBuff[6] = {
    0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
unsigned int cnt = 0;
bit flag1s = 0;
unsigned char i = 0;

void main(){
    unsigned long sec = 0;
    
    EA = 1;
    ENLED = 0;
    ADDR3 = 1;
    TMOD &= 0xF0;
    TMOD |= 0x01;
    TH0 = 0xFC;
    TL0 = 0x67;
    ET0 = 1;
    TR0 = 1;

    while(1){
        if(flag1s){
            flag1s = 0;
            sec++;
            LedBuff[0] = LedChar[sec % 10];
            LedBuff[1] = LedChar[sec / 10 % 10];
            LedBuff[2] = LedChar[sec / 100 % 10];
            LedBuff[3] = LedChar[sec / 1000 % 10];
            LedBuff[4] = LedChar[sec / 10000 % 10];
            LedBuff[5] = LedChar[sec / 100000 % 10];
        }
    }
}

void interruptTimer0() interrupt 1{
    TH0 = 0xFC;
    TL0 = 0x67;
    cnt++;
    if(cnt >= 1000){
        cnt = 0;
        flag1s = 1;
    }
    P0 = 0xFF;
    switch(i){
        case 0: ADDR2 = 0; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[0]; break;
        case 1: ADDR2 = 0; ADDR1 = 0; ADDR0 = 1; i++; P0 = LedBuff[1]; break;
        case 2: ADDR2 = 0; ADDR1 = 1; ADDR0 = 0; i++; P0 = LedBuff[2]; break;
        case 3: ADDR2 = 0; ADDR1 = 1; ADDR0 = 1; i++; P0 = LedBuff[3]; break;
        case 4: ADDR2 = 1; ADDR1 = 0; ADDR0 = 0; i++; P0 = LedBuff[4]; break;
        case 5: ADDR2 = 1; ADDR1 = 0; ADDR0 = 1; i = 0; P0 = LedBuff[5]; break;
        default: break;
    }
}

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