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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1440|回復: 7
收起左側

單片機 8位數碼管動態掃描,前7位亮度不夠,怎么解決?

[復制鏈接]
ID:1134694 發表于 2024-10-30 13:54 | 顯示全部樓層 |閱讀模式
問題如帖子標題,跪求大神解決!程序實現的時數碼管跑跑秒顯示,沒有用到定時器,單片機代碼如下
  1. while(1){
  2.                         /*
  3.                         DataPort=LedWei[0];                //先要給P0口賦值,否則出現殘影                        
  4.                         WEI=1;
  5.                         WEI=0;
  6.                         DataPort=LedDuan[0];
  7.                         DUAN=1;
  8.                         DUAN=0;
  9.                         Delay(1000);  //延時刷新頻率,太高了抖動,太低了有拖影
  10.                         
  11.                         DataPort=LedWei[1];
  12.                         WEI=1;
  13.                         WEI=0;
  14.                         DataPort=LedDuan[1];
  15.                         DUAN=1;
  16.                         DUAN=0;
  17.                         Delay1000();
  18.                         */                        
  19.                         t++;
  20.                         if(t>5){
  21.                                 num++;
  22.                                 t=0;
  23.                         }
  24.                         /*if(num==10){
  25.                                 num=0;        
  26.                         }*/
  27.                         
  28.                         Temp[0]=LedDuan[num/10000000];
  29.                         Temp[1]=LedDuan[(num%10000000)/1000000];
  30.                         Temp[2]=LedDuan[((num%10000000)%1000000)/100000];
  31.                         Temp[3]=LedDuan[(((num%10000000)%1000000)%100000)/10000];
  32.                         Temp[4]=LedDuan[((((num%10000000)%1000000)%100000)%10000)/1000];
  33.                         Temp[5]=LedDuan[(((((num%10000000)%1000000)%100000)%10000)%1000)/100];
  34.                         Temp[6]=LedDuan[((((((num%10000000)%1000000)%100000)%10000)%1000)%100)/10];
  35.                         Temp[7]=LedDuan[((((((num%10000000)%1000000)%100000)%10000)%1000)%100)%10];
  36.                         
  37.                         for(i=0;i<8;i++){
  38.                                 DataPort=0x00;  //把段數據清零,清除殘影
  39.                                 DUAN=1;
  40.                                 DUAN=0;
  41.                                 Delay(0);
  42.                                 DataPort=LedWei[i];
  43.                                 WEI=1;
  44.                                 WEI=0;
  45.                                 Delay(0);
  46.                                 DataPort=Temp[i];
  47.                                 DUAN=1;
  48.                                 DUAN=0;
  49.                                 Delay(60);
  50.                                 
  51.                         }
  52.                         


  53.                 }
復制代碼

回復

使用道具 舉報

ID:1109793 發表于 2024-10-30 14:45 | 顯示全部樓層
為何不用定時器?
回復

使用道具 舉報

ID:161164 發表于 2024-10-30 14:49 | 顯示全部樓層
2024-10-30_145553.png
回復

使用道具 舉報

ID:712493 發表于 2024-10-30 15:36 | 顯示全部樓層
                        Temp[0]=LedDuan[num/10000000];
                        Temp[1]=LedDuan[(num%10000000)/1000000];
                        Temp[2]=LedDuan[((num%10000000)%1000000)/100000];
                        Temp[3]=LedDuan[(((num%10000000)%1000000)%100000)/10000];
                        Temp[4]=LedDuan[((((num%10000000)%1000000)%100000)%10000)/1000];
                        Temp[5]=LedDuan[(((((num%10000000)%1000000)%100000)%10000)%1000)/100];
                        Temp[6]=LedDuan[((((((num%10000000)%1000000)%100000)%10000)%1000)%100)/10];
                        Temp[7]=LedDuan[((((((num%10000000)%1000000)%100000)%10000)%1000)%100)%10];這部分計算會很久?
回復

使用道具 舉報

ID:69038 發表于 2024-10-30 15:45 | 顯示全部樓層

按你的流程是這樣的:
1、計數加1
2、取第1位數,
3、取第2位數,
4、取第3位數,
5、取第4位數,
6、取第5位數,
7、取第6位數,
8、取第7位數,
9、取第8位數,
10、按1-8順序顯示各位數。
你這個從上述的第2步到第9步計算量太多,耗費大量的CPU時間了!
當你從第8位顯示完會之之后再顯示第1位數時,顯示停留最長,
所以看上去前7位亮度不夠,而第8位最亮,明白了嗎?
因為你的程序流程就有問題。
如果不想用定時器,就取一位數后,立即顯示這個數,這樣看上去8個數的顯示停留時間就差不多,亮度也就基本一致了。
最好的方法是開個定時器,按一定的時間比如2mS中斷,每次進中斷只顯示一位數,從dis_buf[0]到dis_buf[7],再到dis_buf[0],周日而復始。
而主程序只做計數、計算各位的值、并存入顯示緩存數組中dis_buf[8]...
回復

使用道具 舉報

ID:1134694 發表于 2024-10-31 19:58 | 顯示全部樓層

這個算的好!給力,謝謝
回復

使用道具 舉報

ID:1134694 發表于 2024-10-31 21:58 | 顯示全部樓層

給力,經過改進可以正常跑了,而且8個管顯示都正常

  1. /*-----------------------------------------------
  2.   名稱:8位數碼管動態掃描顯示變化數據
  3.   內容:8位數碼管分別顯示不同數字,這種掃描顯示方式成為動態掃描,并不停變化賦值
  4. ------------------------------------------------*/
  5. #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
  6. #define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換

  7. sbit DUAN=P2^6;//定義鎖存使能端口 段鎖存
  8. sbit WEI=P2^7;//                 位鎖存

  9. /***********************************
  10.         數碼管碼表
  11. ***********************************/                               
  12. unsigned char code LedDuan[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //LED段碼

  13. /*****該程序位碼表沒有使用*****
  14. unsigned char code LedWei[10]={
  15. 0xfe,  //0 第1位---從右側開始
  16. 0xfd,  //1 第2位
  17. 0xfb,  //2 第3位
  18. 0xf7,  //3 第4位
  19. 0xef,  //4 第5位
  20. 0xdf,  //5 第6位
  21. 0xbf,  //6 第7位
  22. 0x7f,  //7 第8位
  23. };
  24. ***************************/

  25. unsigned char Temp[8];  //臨時數組,用于顯示函數
  26. void Display(A,B,C,D,E,F,G,H);   //顯示函數
  27. /*****************************
  28. 延時函數
  29. *****************************/
  30. void delay(unsigned int t)
  31. {
  32.     unsigned int i,j;
  33.     for(i = 0; i < t; i++)
  34.         for(j = 0; j < 125; j++);
  35. }
  36. /***********************************
  37.    主函數
  38. ***********************************/
  39. void main(void){
  40.         unsigned char num=0,t=0;
  41.         unsigned int i=0;
  42.         //unsigned int a,b,c,d,e,f,g,h;
  43.         while(1){
  44.                 if(t==80){ //用于延時一段時間顯示,類似延時函數,
  45.                         i++;
  46.                         t=0;
  47.                 }
  48.                 if(Temp[0]==9){ //判斷數碼管是不是跑到 99999999 ,如果是,重新計數
  49.                         i=0;
  50.                 }
  51.         t++;
  52.         //數碼管斷碼分離計算
  53.         Temp[0]=i/10000000;
  54.         Temp[1]=i/1000000%10;
  55.         Temp[2]=i/100000%10;
  56.         Temp[3]=i/10000%10;
  57.         Temp[4]=i/1000%10;
  58.         Temp[5]=i/100%10;
  59.         Temp[6]=i/10%10;
  60.         Temp[7]=i%10;
  61.         //顯示函數
  62.         Display(Temp[0],Temp[1],Temp[2],Temp[3],Temp[4],Temp[5],Temp[6],Temp[7]);
  63.         }

  64. }
  65. /*******************************
  66. 顯示函數:
  67. 8個參數分別對應8個數碼管
  68. *******************************/
  69. void Display(A,B,C,D,E,F,G,H){
  70.         //打開第一位
  71.         DUAN=1;
  72.         DataPort=LedDuan[A];
  73.         DUAN=0;
  74.        
  75.         WEI=1;
  76.         DataPort=0xfe;
  77.         WEI=0;
  78.         delay(1);
  79.         //打開第二位
  80.         DUAN=1;
  81.         DataPort=LedDuan[B];
  82.         DUAN=0;
  83.         WEI=1;
  84.         DataPort=0xfd;
  85.         WEI=0;
  86.         delay(1);
  87.         //打開第三位
  88.         DUAN=1;
  89.         DataPort=LedDuan[C];
  90.         DUAN=0;
  91.         WEI=1;
  92.         DataPort=0xfb;
  93.         WEI=0;
  94.         delay(1);
  95.         //第四位
  96.         DUAN=1;
  97.         DataPort=LedDuan[D];
  98.         DUAN=0;
  99.        
  100.         WEI=1;
  101.         DataPort=0xf7;
  102.         WEI=0;
  103.         delay(1);
  104.         //第五位
  105.         DUAN=1;
  106.         DataPort=LedDuan[E];
  107.         DUAN=0;
  108.        
  109.         WEI=1;
  110.         DataPort=0xef;
  111.         WEI=0;
  112.         delay(1);
  113.         //第六位
  114.         DUAN=1;
  115.         DataPort=LedDuan[F];
  116.         DUAN=0;
  117.        
  118.         WEI=1;
  119.         DataPort=0xdf;
  120.         WEI=0;
  121.         delay(1);
  122.         //第七位
  123.         DUAN=1;
  124.         DataPort=LedDuan[G];
  125.         DUAN=0;
  126.        
  127.         WEI=1;
  128.         DataPort=0xbf;
  129.         WEI=0;
  130.         delay(1);
  131.         //第八位
  132.         DUAN=1;
  133.         DataPort=LedDuan[H];
  134.         DUAN=0;
  135.         WEI=1;
  136.         DataPort=0x7f;
  137.         WEI=0;
  138.         delay(1);
  139. }
復制代碼


回復

使用道具 舉報

ID:1133081 發表于 2024-11-1 21:30 | 顯示全部樓層
wei893699490 發表于 2024-10-31 21:58
給力,經過改進可以正常跑了,而且8個管顯示都正常

樓主這個顯示程序在實際應用中會有許多問題,常見的問題可能亮度不夠或亮度不均勻、閃爍、鬼影等。建議用定時器中斷1~2ms運行如下數碼管顯示程序。void Display()
{
        static unsigned char i=0;
        DataPort=0x00;DUAN=1;DUAN=0;//段消隱
        DataPort=~(0x01<<i);WEI=1;WEI=0;//送位碼   
        DataPort=LedDuan;DUAN=1;DUAN=0;//送段碼
        i=++i%8;//循環計數
}

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

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