找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2263|回复: 2
收起左侧

单片机动态数码管显示数字不正常

[复制链接]
ID:847776 发表于 2020-12-2 22:19 | 显示全部楼层 |阅读模式
如下这段程序是用T0定时器来让动态数码管间隔0.5s显示1到8;程序编译没有错误,但就是无法运行,数码管一直不亮灯。
请教下这是哪里的问题?谢谢!
单片机源程序如下:
#include <reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uint tt,a;
sbit LSA=P1^0;
sbit LSB=P1^1;
sbit LSC=P1^2;
uchar code DM[8]={0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F};  //共阴数码管

void main()
{

  while(1)   
  {
           TMOD=0x01; //设置定时器0的工作方式
           TH0=(65536-50000)/256;
           TL0=(65536-50000)%256;   
           EA=1;  //开启总中断,
           ET0=1; //开启T0的中断
           TR0=1; //开启定时器T0;
           tt=0;
           P0=0x00;
           a=0;
           tt=0;
           if(tt==10)
           {

               switch(a)
                {
                    case 0:LSA=0;LSB=0;LSC=0;break;
                    case 1:LSA=0;LSB=0;LSC=1;break;
                    case 2:LSA=0;LSB=1;LSC=0;break;
                    case 3:LSA=0;LSB=1;LSC=1;break;
                    case 4:LSA=1;LSB=0;LSC=0;break;
                    case 5:LSA=1;LSB=0;LSC=1;break;
                    case 6:LSA=1;LSB=1;LSC=0;break;
                    case 7:LSA=1;LSB=1;LSC=1;break;
                }

               P0=DM[a];
               a++;
               if(a>7) a=0;
               tt=0;
           }

  }
}

void T0l() interrupt 1  
{
     TH0=(65536-50000)/256;
     TL0=(65536-50000)%256;  //定时器设置50ms
     tt++;   
}


回复

使用道具 举报

ID:235200 发表于 2020-12-2 23:55 | 显示全部楼层
从问的方式看只有1位数码,但又说成动态不好理解,看了一眼程序,确实是8位数码管且通过3-8译码器来选择某位点亮,程序错在定时计数器的方式不应放在循环内,既然是动态显示,定时时间不应该是0.5s,应该在20ms内循环显示一次,程序修改如下:
#include <reg51.h>
typedef unsigned char uchar;
typedef unsigned int uint;
uint tt,a;
sbit LSA=P1^0;    //控制译码器
sbit LSB=P1^1;
sbit LSC=P1^2;
uchar code DM[8]={0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x27,0x7F};  //共阴数码管
bit flag;
void main()
{       uchar tt;
           TMOD=0x01; //设置定时器0的工作方式
           TH0=(65536-2000)/256;
           TL0=(65536-2000)%256;   
           EA=1;  //开启总中断,
           ET0=1; //开启T0的中断
           TR0=1; //开启定时器T0;
           tt=0;

  while(1)   
  {
       //主程序检查时间标志
      if (flag)
       {
           flag=0;
           P0=0;      //消影
           P0=DM【tt];
      
          switch(tt)
           {
                    case 0:LSA=0;LSB=0;LSC=0;break;
                    case 1:LSA=1;LSB=0;LSC=0;break;
                    case 2:LSA=0;LSB=1;LSC=0;break;
                    case 3:LSA=1;LSB=1;LSC=0;break;
                    case 4:LSA=0;LSB=0;LSC=1;break;
                    case 5:LSA=1;LSB=0;LSC=1;break;
                    case 6:LSA=0;LSB=1;LSC=1;break;
                    case 7:LSA=1;LSB=1;LSC=1;break;
                }
               tt++;
               if(tt==8) tt=0;
           }

  }
}

void T0l() interrupt 1  
{
     TH0=(65536-2000)/256;
     TL0=(65536-2000)%256;  //定时器设置2ms
     flag=1;                            //设置时间到标志
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:406879 发表于 2020-12-7 16:55 | 显示全部楼层
初值放大循环?那你每循环一次就清一次还显示毛线啊。。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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