欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4246|回復: 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 單片機教程網

快速回復 返回頂部 返回列表