koom_panel 2023-09-23 20:10 采纳率: 50%
浏览 7
已结题

51单片机做计时器误差太大什么原因

我这个51单片机做出来的计时器,数码管走1秒,但是实际需要好几秒。

#include <REG52.H>

typedef unsigned char u8;
typedef unsigned int u16;
typedef unsigned long u32;

sbit LSA = P2 ^ 2;
sbit LSB = P2 ^ 3;
sbit LSC = P2 ^ 4;

u8 code LedChar[] = {
    0x3f,
    0x06,
    0x5b,
    0x4f,
    0x66,
    0x6d,
    0x7d,
    0x07,
    0x7f,
    0x6f,
    0x77,
    0x7c,
    0x39,
    0x5e,
    0x79,
    0x71,
};
u8 LedBuff[8] = {
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
    0x00,
};
u8 i=0,j= 0;
u16 cnt = 0;
u16 sec = 0;

void display()
{
    u8 i;
    for (i = 0; i < 8; i++) {
        switch (i) {
            case 0:
                LSC = 0;
                LSB = 0;
                LSA = 0;
                break; 
            case 1:
                LSC = 0;
                LSB = 0;
                LSA = 1;
                break;
            case 2:
                LSC = 0;
                LSB = 1;
                LSA = 0;
                break;
            case 3:
                LSC = 0;
                LSB = 1;
                LSA = 1;
                break;
            case 4:
                LSC = 1;
                LSB = 0;
                LSA = 0;
                break;
            case 5:
                LSC = 1;
                LSB = 0;
                LSA = 1;
                break;
            case 6:
                LSC = 1;
                LSB = 1;
                LSA = 0;
                break;
            case 7:
                LSC = 1;
                LSB = 1;
                LSA = 1;
                break;
        }
        P0 = LedBuff[i];
        for(j=0;j<83;j++);
        P0 = 0x00;
    }
}

void main()
{
    TMOD = 0x01;
    TH0  = 0xfc;
    TL0  = 0x67;
    TR0 = 1;

    while (1) {
        if(TF0==1){
            TF0 = 0;
            TH0 = 0xfc;
            TL0 = 0x67;
            cnt++;
            if (cnt == 1000) {
                cnt = 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];
                LedBuff[6] = LedChar[sec / 1000000 % 10];
                LedBuff[7] = LedChar[sec / 10000000 % 10];
            }
        }
        display();
    }
}


  • 写回答

2条回答 默认 最新

  • threenewbee 2023-09-23 20:11
    关注

    if (cnt == 1000)
    这里改小一些
    摸索下,某个值,会刚好,那就成了。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 10月1日
  • 已采纳回答 9月23日
  • 创建了问题 9月23日