找回密码
 立即注册

QQ登录

只需一步,快速开始

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

数码管同时闪烁的单片机程序问题,请教大家,谢谢

[复制链接]
ID:482058 发表于 2019-12-16 08:34 | 显示全部楼层 |阅读模式
用定时器实现两个数码管同时点亮的程序:


if(smgtime==10)  
      {
          smg_show(10);
        WE_1=1;
        WE_2=0;
        smg_show(data/10);
      }
      if(smgtime==20)
      {   smg_show(10);
        WE_1=0;
        WE_2=1;
        smg_show(data%10);
        smgtime=0;

      }


现在想让数码管实现闪烁的功能,两个数码管按照一定的频率闪烁,在同时点亮的基础上加了一个关闭数码管的功能,我是这样编写的,
if(smgtime==10)  
      {
          smg_show(10);
        WE_1=1;
        WE_2=0;
        smg_show(data/10);
      }
      if(smgtime==20)
      {   smg_show(10);
        WE_1=0;
        WE_2=1;
        smg_show(data%10);

      }
      if(smgtime==30)
      {
          smg_show(10);
          smgtime=0;
      }


出现的问题是,第二个数码管的亮度比第一个数码管亮度明显,第一个数码管出现明显的闪烁,第二个数码管闪烁不明显。硬件电路是这样设计的,
74HC573驱动段选,数码管是共阴极的,单片机通过三极管来控制公共端。
现在问题不知道出现在哪里,请大家帮我分析一下,谢谢。

回复

使用道具 举报

ID:470332 发表于 2019-12-16 10:25 | 显示全部楼层
延时太多了
回复

使用道具 举报

ID:213173 发表于 2019-12-16 15:28 | 显示全部楼层
多位数码管显示电路分静态显示和动态显示,要实现单个闪烁或多个同时闪烁并不难。只要在正常显示的基础上按闪烁频率的1/2时间给段码驱动端送消隐码即可。共阴数码管送0x00,共阳数码管送0xff。数码管亮度不均匀或闪烁有差异是因为显示电路或显示代码本身不正常造成的。给你一个示例,用简单的4位时钟改成闪烁显示以便于理解。注释掉的部分是原来正常显示的部分。
无标题.jpg

  1. #include <AT89X52.H>

  2. #define uint unsigned int               
  3. #define uchar unsigned char   

  4. sbit key1 =P3^4;
  5. sbit key2 =P3^5;

  6. //顺序共阴极数码管段码表,段码a-h顺序接PX0-PX7
  7. unsigned char code table[]={//共阴数码管段码"0~f-."
  8.                 0x3f,0x06,0x5b,0x4f,
  9.                 0x66,0x6d,0x7d,0x07,
  10.                 0x7f,0x6f,0x77,0x7c,
  11.                 0x39,0x5e,0x79,0x71,0x40,0x80};
  12. uchar hour=12,min=0,sec=0;
  13. uchar tcnt;
  14. bit flag;

  15. void delayms(uint k)//1T
  16. {
  17.     uint i,j;            
  18.     for(i=k;i>0;i--)   
  19.         for(j=125;j>0;j--);
  20. }

  21. void InitTimer0()//50毫秒@12.000MHz
  22. {

  23.         TMOD= 0x01;                //设置定时器模式
  24.         TL0 = 0xB0;                //设置定时初值
  25.         TH0 = 0x3C;                //设置定时初值
  26.         TF0 = 0;                        //清除TF0标志
  27.         TR0 = 1;                        //定时器0开始计时
  28.         EA  = 1;
  29.         ET0 = 1;
  30. }

  31. void keyscan()       
  32. {
  33.         static uchar count1,count2;
  34.         if(!key1)
  35.         {
  36.                 if(++count1>=100)
  37.                 {
  38.                         count1=0;
  39.                         hour++;
  40.                         if(hour>=24)
  41.                                 hour=0;
  42.                 }
  43.         }
  44.         else count1=0;

  45.         if(!key2)
  46.         {
  47.                 if(++count2>=100)
  48.                 {
  49.                         count2=0;
  50.                         min++;
  51.                         tcnt=0;
  52.                         sec=0;
  53.                         if(min>=60)
  54.                                 min=0;
  55.                 }
  56.         }
  57.         else count2=0;
  58. }


  59. void display()
  60. {
  61.         static uchar i=0;
  62.         P0=0x00;//消隐
  63.         P3&=0xf0;//清P3低4位
  64. /*        switch(i)
  65.         {
  66.                 case 0: P3|=0x0e;P0=table[hour/10];break;
  67.                 case 1: P3|=0x0d;if(flag==1)P0=table[hour%10]|0x80;//加点
  68.                                                  else P0=table[hour%10];break;//不加点                               
  69.                 case 2: P3|=0x0b;P0=table[min/10] ;break;
  70.                 case 3: P3|=0x07;P0=table[min%10] ;break;
  71.         }*/
  72.         switch(i)
  73.         {
  74.                 case 0: P3|=0x0e;if(flag==1)P0=table[hour/10];
  75.                                                           else P0=0x00;break;
  76.                 case 1: P3|=0x0d;if(flag==1)P0=table[hour%10]|0x80;//加点
  77.                                                      else P0=0x00;break;
  78.                 case 2: P3|=0x0b;if(flag==1)P0=table[min/10];
  79.                                                      else P0=0x00;break;
  80.                 case 3: P3|=0x07;if(flag==1)P0=table[min%10];
  81.                                                      else P0=0x00;break;
  82.         }
  83.         delayms(2);
  84.         i++;
  85.         i%=4;
  86. }

  87. void main(void)
  88. {
  89.         InitTimer0();
  90.         while (1)
  91.         {
  92.                 keyscan();
  93.                 display();
  94.         }
  95. }

  96. void Timer0Interrupt(void) interrupt 1
  97. {
  98.         tcnt++;
  99.         if(tcnt<10)
  100.                 flag=1;
  101.         else flag=0;
  102.         if(tcnt>=20)
  103.         {
  104.                 tcnt=0;
  105.                 sec++;
  106.                 if(sec>=60)
  107.                 {
  108.                         sec=0;
  109.                         min++;
  110.                         if(min>=60)
  111.                         {
  112.                                 min=0;
  113.                                 hour++;
  114.                                 if(hour>=24)
  115.                                         hour=0;
  116.                         }
  117.                 }
  118.         }
  119. }
复制代码



回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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