找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2495|回复: 5
打印 上一主题 下一主题
收起左侧

关于单片机中断那些事,数码管闪烁过快

[复制链接]
跳转到指定楼层
楼主
感觉进入中断时间没问题,但数码管闪烁过快,代码如下

#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
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2021-7-26 13:30 | 只看该作者
你想达成的效果是什么?实际效又是什么呢?
回复

使用道具 举报

板凳
ID:955347 发表于 2021-7-26 13:49 | 只看该作者
yzwzfyz 发表于 2021-7-26 13:30
你想达成的效果是什么?实际效又是什么呢?

想每秒数码管改变一个数,实际上改变太快,肉眼分辨不了,就是数码管每个led全亮
回复

使用道具 举报

地板
ID:161164 发表于 2021-7-26 14:01 | 只看该作者
if(tmr1s >= 1000);           //1s时改变flagls
低级错误:多了个分号
回复

使用道具 举报

5#
ID:955347 发表于 2021-7-26 14:26 | 只看该作者
lkc8210 发表于 2021-7-26 14:01
if(tmr1s >= 1000);           //1s时改变flagls
低级错误:多了个分号

ok,我去试试
回复

使用道具 举报

6#
ID:955347 发表于 2021-7-26 14:28 | 只看该作者
lkc8210 发表于 2021-7-26 14:01
if(tmr1s >= 1000);           //1s时改变flagls
低级错误:多了个分号

ok,以解决,麻烦大家了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表