标题: 单片机动态数码管显示数字不正常 [打印本页]

作者: 忆1709    时间: 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++;   
}



作者: csmyldl    时间: 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;                            //设置时间到标志
}

作者: 回忆不堪回首    时间: 2020-12-7 16:55
初值放大循环?那你每循环一次就清一次还显示毛线啊。。




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