找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2686|回复: 10
收起左侧

单片机数码管显示不稳

[复制链接]
ID:711481 发表于 2020-7-4 10:39 来自手机 | 显示全部楼层 |阅读模式
把数码管显示放在中断里面,然后再开一个定时器(定时一秒,用于蜂鸣器计时)按下一号按键,数码管亮,按下二号按键蜂鸣器响一秒(此时数码管还亮,)复位后都不反应,程序写完之后,打开数码管的时候,显示不稳,闪烁,这是怎么了
回复

使用道具 举报

ID:789121 发表于 2020-7-4 13:09 | 显示全部楼层
数码管闪烁可能是因为动态显示延时过长
回复

使用道具 举报

ID:711481 发表于 2020-7-4 16:04 来自手机 | 显示全部楼层
不要黑 发表于 2020-7-4 13:09
数码管闪烁可能是因为动态显示延时过长

我试了一下,只打开t0中断,数码管正常,再开一个定时器,设置好蜂鸣器,就不行了
回复

使用道具 举报

ID:91521 发表于 2020-7-5 07:52 | 显示全部楼层
定时器定时时间太长
回复

使用道具 举报

ID:445775 发表于 2020-7-5 13:40 | 显示全部楼层
加快刷新频率
回复

使用道具 举报

ID:219787 发表于 2020-7-5 15:31 | 显示全部楼层
楼主你好,基于你这个问题,有可能是以下原因:1、定时器定时时间过长导致数码管整体扫描时间过长;2、开启T0后在开启T1时,单片机定时器相关寄存器设置错误;3、程序本身存在不合理之处。这些问题都能导致数码管显示不稳定、闪烁等问题。希望能帮助到你。
回复

使用道具 举报

ID:711481 发表于 2020-7-5 20:02 来自手机 | 显示全部楼层
源代码 发表于 2020-7-5 15:31
楼主你好,基于你这个问题,有可能是以下原因:1、定时器定时时间过长导致数码管整体扫描时间过长;2、开启 ...

这是有关程序,您看一下
#include<reg51.h>
#define uchar unsigned char
uchar  smg[]={0xc0,0xf9,0xa4,0xb0};
sbit a1=P2^0;
sbit a2=P2^1;
sbit a3=P2^2;
sbit a4=P2^3;
sbit feng=P2^5;
sbit jian0=P3^2;
sbit jian1=P3^3;

void delay1()
{
uchar k;
for(k=20;k>0;k--)
{
                    TH1=(65536-50000)/256;
             TL1=(65536-50000)%256;
                 while(TF1==0);
                 TF1=0;
                 }
}
void delay()
{
       int i;
           for(i=600;i>0;i--);
}
void main()
{
TMOD=0X11;
         TH0=(65536-5)/256;
         TL0=(65536-5)%256;
         TH1=(65536-50000)/256;
         TL1=(65536-50000)%256;

         TR1=1;
         EA=1;
         ET0=1;
   while(1)
   {
     
                         if(jian1==0)
         {
           delay();
           if(jian1==0)
         {
           while(!jian1);
              TR0=1;
         }
          }

                         if(jian0==0)
         {
           delay();
           if(jian0==0)
         {
           while(!jian0);
            feng=0;
                delay1();
                feng=1;
         }
          }
        }
}
void t0(void) interrupt 1        
{
                     a1=0;
                P0=smg[2];
          delay();
          a1=1;
         
                     a2=0  ;
                P0=smg[0];
         delay();
          a2=1;
         
                     a3=0;
                P0=smg[0];
          delay();
          a3=1;
         
                     a4=0;
                P0=smg[3];
           delay();
          a4=1;
回复

使用道具 举报

ID:797993 发表于 2020-7-5 20:24 | 显示全部楼层
考虑一下刷新频率问题
回复

使用道具 举报

ID:402946 发表于 2020-7-5 21:12 | 显示全部楼层
数码管动态显示这种太费时的操作做好放在定时器外边儿,定时器里可以放一些标志变量,这样不会影响定时器的定时精度,如果显示数码管就需要刷新频率取适中,太快太慢都不合适,正常几十us刷新一次。
回复

使用道具 举报

ID:608600 发表于 2020-7-7 12:06 | 显示全部楼层
数码管动态显示这种不推荐直接放在定时器里边,定时器里边可以放一些标志位,然后数码管动态显示另外存放,当标志位为1数码管就动态显示等等
回复

使用道具 举报

ID:799051 发表于 2020-7-7 13:39 | 显示全部楼层
数码管显示刷新频率低了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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