标题: 关于单片机中断那些事,数码管闪烁过快 [打印本页]

作者: lzt456    时间: 2021-7-26 12:41
标题: 关于单片机中断那些事,数码管闪烁过快
感觉进入中断时间没问题,但数码管闪烁过快,代码如下

#include <reg52.h>

sbit BEEP = P1^5; //跟中断无关

bit flagls = 0;
unsigned char Ledbuf;
unsigned char T0RH = 0;
unsigned char T0RL = 0;
unsigned char code LedChar[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};

void ConfigTimer0(unsigned int ms)         //配置T0
{
         unsigned long tmp;

        tmp = 11059200/12;
        tmp = (tmp*ms)/1000;
        tmp = 65536 - tmp;
        T0RH = (unsigned char)(tmp >> 8);
        T0RL = (unsigned char)tmp;

        TMOD &= 0xf0;
        TMOD |= 0x01;
        TH0=T0RH;        
        TL0=T0RL;
        EA = 1;
        ET0 = 1;
        TR0 = 1;
}

void LedScan()         //在中断中使用,每进中断扫描一次
{
         P0 = 0x00;
        P2 = (P2&0xe3);
        P0 = Ledbuf;
}

void main()
{
         unsigned int i = 0;
        unsigned int sec = 0;
                  
        ConfigTimer0(1);        //设置定时器1ms

        for(i = 0; i < 50000; i++)
        {
                 BEEP = ~BEEP;
        }

        while(1)
        {
                if(flagls == 1)
                {
                        flagls = 0;
                        sec++;                                  //每次进入sec加1
                        Ledbuf = LedChar[9 - sec%10];
                }
        }
}

void InterruptTimer0() interrupt 1
{
         static unsigned int tmr1s = 0;

         TH0=T0RH;                           //设置断点看进入时间          第一次0.00266602s,第二次 0.00367405, 相差0.001s左右,进入正常
        TL0=T0RL;

        tmr1s++;
        if(tmr1s >= 1000);           //1s时改变flagls
        {
                tmr1s = 0;
                flagls = 1;
        }

        LedScan();
}

$0WG4UH3Q@C4V5M{%`2Y6AT.png (137.56 KB, 下载次数: 46)

$0WG4UH3Q@C4V5M{%`2Y6AT.png

IMG_20210726_123409.jpg (6.21 MB, 下载次数: 40)

IMG_20210726_123409.jpg

作者: yzwzfyz    时间: 2021-7-26 13:30
你想达成的效果是什么?实际效又是什么呢?
作者: lzt456    时间: 2021-7-26 13:49
yzwzfyz 发表于 2021-7-26 13:30
你想达成的效果是什么?实际效又是什么呢?

想每秒数码管改变一个数,实际上改变太快,肉眼分辨不了,就是数码管每个led全亮
作者: lkc8210    时间: 2021-7-26 14:01
if(tmr1s >= 1000);           //1s时改变flagls
低级错误:多了个分号
作者: lzt456    时间: 2021-7-26 14:26
lkc8210 发表于 2021-7-26 14:01
if(tmr1s >= 1000);           //1s时改变flagls
低级错误:多了个分号

ok,我去试试
作者: lzt456    时间: 2021-7-26 14:28
lkc8210 发表于 2021-7-26 14:01
if(tmr1s >= 1000);           //1s时改变flagls
低级错误:多了个分号

ok,以解决,麻烦大家了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1