久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1446|回復: 7
收起左側(cè)

單片機 8位數(shù)碼管動態(tài)掃描,前7位亮度不夠,怎么解決?

[復制鏈接]
ID:1134694 發(fā)表于 2024-10-30 13:54 | 顯示全部樓層 |閱讀模式
問題如帖子標題,跪求大神解決!程序?qū)崿F(xiàn)的時數(shù)碼管跑跑秒顯示,沒有用到定時器,單片機代碼如下
  1. while(1){
  2.                         /*
  3.                         DataPort=LedWei[0];                //先要給P0口賦值,否則出現(xiàn)殘影                        
  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;  //把段數(shù)據(jù)清零,清除殘影
  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 發(fā)表于 2024-10-30 14:45 | 顯示全部樓層
為何不用定時器?
回復

使用道具 舉報

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

使用道具 舉報

ID:712493 發(fā)表于 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 發(fā)表于 2024-10-30 15:45 | 顯示全部樓層

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

使用道具 舉報

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

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

使用道具 舉報

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

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

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

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

  9. /***********************************
  10.         數(shù)碼管碼表
  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位---從右側(cè)開始
  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];  //臨時數(shù)組,用于顯示函數(shù)
  26. void Display(A,B,C,D,E,F,G,H);   //顯示函數(shù)
  27. /*****************************
  28. 延時函數(shù)
  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.    主函數(shù)
  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){ //用于延時一段時間顯示,類似延時函數(shù),
  45.                         i++;
  46.                         t=0;
  47.                 }
  48.                 if(Temp[0]==9){ //判斷數(shù)碼管是不是跑到 99999999 ,如果是,重新計數(shù)
  49.                         i=0;
  50.                 }
  51.         t++;
  52.         //數(shù)碼管斷碼分離計算
  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.         //顯示函數(shù)
  62.         Display(Temp[0],Temp[1],Temp[2],Temp[3],Temp[4],Temp[5],Temp[6],Temp[7]);
  63.         }

  64. }
  65. /*******************************
  66. 顯示函數(shù):
  67. 8個參數(shù)分別對應8個數(shù)碼管
  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 發(fā)表于 2024-11-1 21:30 | 顯示全部樓層
wei893699490 發(fā)表于 2024-10-31 21:58
給力,經(jīng)過改進可以正常跑了,而且8個管顯示都正常

樓主這個顯示程序在實際應用中會有許多問題,常見的問題可能亮度不夠或亮度不均勻、閃爍、鬼影等。建議用定時器中斷1~2ms運行如下數(shù)碼管顯示程序。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;//循環(huán)計數(shù)
}

回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 999国产精品视频免费 | 99精品久久久久久中文字幕 | 中文字幕在线人 | 国产一区二区在线视频 | 香蕉久久久久久 | 日韩免费福利视频 | 日日夜夜精品视频 | 狠狠色狠狠色综合日日92 | 亚洲国产情侣自拍 | 国产在线视频在线观看 | 男女精品网站 | 亚洲一区二区三区在线 | 成人国产在线视频 | 91精品国产乱码久久久久久久 | 天天射视频 | 女人牲交视频一级毛片 | 久久亚洲精品久久国产一区二区 | 亚洲精品无人区 | 久久成人精品一区二区三区 | 91一区二区在线观看 | 国产一区在线免费观看 | 久久蜜桃av | 日韩成人精品在线 | 男女免费观看在线爽爽爽视频 | 久久久精品国产 | 欧美无乱码久久久免费午夜一区 | 黄色一级大片在线免费看产 | 久久一区二区三区四区 | 91久久夜色精品国产网站 | 特一级黄色毛片 | 黄色国产| 亚洲精选一区 | 欧美一区二区在线视频 | 欧美一区二区三区大片 | 成人视屏在线观看 | 请别相信他免费喜剧电影在线观看 | 日韩精品一区二区三区免费视频 | 国产免费一区二区 | 四虎影院久久 | 欧美激情啪啪 | 免费色网址 |