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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1234|回復(fù): 7
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
問(wèn)題如帖子標(biāo)題,跪求大神解決!程序?qū)崿F(xiàn)的時(shí)數(shù)碼管跑跑秒顯示,沒(méi)有用到定時(shí)器,單片機(jī)代碼如下
  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);  //延時(shí)刷新頻率,太高了抖動(dòng),太低了有拖影
  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.                 }
復(fù)制代碼

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1109793 發(fā)表于 2024-10-30 14:45 | 只看該作者
為何不用定時(shí)器?
回復(fù)

使用道具 舉報(bào)

板凳
ID:161164 發(fā)表于 2024-10-30 14:49 | 只看該作者

回復(fù)

使用道具 舉報(bào)

地板
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];這部分計(jì)算會(huì)很久?
回復(fù)

使用道具 舉報(bào)

5#
ID:69038 發(fā)表于 2024-10-30 15:45 | 只看該作者

按你的流程是這樣的:
1、計(jì)數(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ù)。
你這個(gè)從上述的第2步到第9步計(jì)算量太多,耗費(fèi)大量的CPU時(shí)間了!
當(dāng)你從第8位顯示完會(huì)之之后再顯示第1位數(shù)時(shí),顯示停留最長(zhǎng),
所以看上去前7位亮度不夠,而第8位最亮,明白了嗎?
因?yàn)槟愕某绦蛄鞒叹陀袉?wèn)題。
如果不想用定時(shí)器,就取一位數(shù)后,立即顯示這個(gè)數(shù),這樣看上去8個(gè)數(shù)的顯示停留時(shí)間就差不多,亮度也就基本一致了。
最好的方法是開(kāi)個(gè)定時(shí)器,按一定的時(shí)間比如2mS中斷,每次進(jìn)中斷只顯示一位數(shù),從dis_buf[0]到dis_buf[7],再到dis_buf[0],周日而復(fù)始。
而主程序只做計(jì)數(shù)、計(jì)算各位的值、并存入顯示緩存數(shù)組中dis_buf[8]...
回復(fù)

使用道具 舉報(bào)

6#
ID:1134694 發(fā)表于 2024-10-31 19:58 | 只看該作者

這個(gè)算的好!給力,謝謝
回復(fù)

使用道具 舉報(bào)

7#
ID:1134694 發(fā)表于 2024-10-31 21:58 | 只看該作者

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

  1. /*-----------------------------------------------
  2.   名稱(chēng):8位數(shù)碼管動(dòng)態(tài)掃描顯示變化數(shù)據(jù)
  3.   內(nèi)容:8位數(shù)碼管分別顯示不同數(shù)字,這種掃描顯示方式成為動(dòng)態(tài)掃描,并不停變化賦值
  4. ------------------------------------------------*/
  5. #include<reg52.h> //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  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. /*****該程序位碼表沒(méi)有使用*****
  14. unsigned char code LedWei[10]={
  15. 0xfe,  //0 第1位---從右側(cè)開(kāi)始
  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ù)組,用于顯示函數(shù)
  26. void Display(A,B,C,D,E,F,G,H);   //顯示函數(shù)
  27. /*****************************
  28. 延時(shí)函數(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í)一段時(shí)間顯示,類(lèi)似延時(shí)函數(shù),
  45.                         i++;
  46.                         t=0;
  47.                 }
  48.                 if(Temp[0]==9){ //判斷數(shù)碼管是不是跑到 99999999 ,如果是,重新計(jì)數(shù)
  49.                         i=0;
  50.                 }
  51.         t++;
  52.         //數(shù)碼管斷碼分離計(jì)算
  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個(gè)參數(shù)分別對(duì)應(yīng)8個(gè)數(shù)碼管
  68. *******************************/
  69. void Display(A,B,C,D,E,F,G,H){
  70.         //打開(kāi)第一位
  71.         DUAN=1;
  72.         DataPort=LedDuan[A];
  73.         DUAN=0;
  74.        
  75.         WEI=1;
  76.         DataPort=0xfe;
  77.         WEI=0;
  78.         delay(1);
  79.         //打開(kāi)第二位
  80.         DUAN=1;
  81.         DataPort=LedDuan[B];
  82.         DUAN=0;
  83.         WEI=1;
  84.         DataPort=0xfd;
  85.         WEI=0;
  86.         delay(1);
  87.         //打開(kāi)第三位
  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. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

8#
ID:1133081 發(fā)表于 2024-11-1 21:30 | 只看該作者
wei893699490 發(fā)表于 2024-10-31 21:58
給力,經(jīng)過(guò)改進(jìn)可以正常跑了,而且8個(gè)管顯示都正常

樓主這個(gè)顯示程序在實(shí)際應(yīng)用中會(huì)有許多問(wèn)題,常見(jiàn)的問(wèn)題可能亮度不夠或亮度不均勻、閃爍、鬼影等。建議用定時(shí)器中斷1~2ms運(yùn)行如下數(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)計(jì)數(shù)
}

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久久精品国产v日韩v亚洲 | 亚洲精品久久久久久一区二区 | 人人干人人干人人干 | 亚洲成人精品 | 在线成人| 最新毛片网站 | 久久一| 久久99精品久久久久久 | 中文二区| 久久久久久久国产精品影院 | 国产精品欧美一区喷水 | 婷婷亚洲综合 | 欧产日产国产精品99 | 日韩电影免费在线观看中文字幕 | 亚洲精品美女视频 | 麻豆天堂 | 91影视| 成人精品一区二区三区中文字幕 | 一区二区三区欧美 | 成人免费精品视频 | 玖玖视频| 一区二区三区欧美在线 | 精品99久久 | 国产精品毛片一区二区在线看 | 超碰免费观看 | 91网视频| а天堂中文最新一区二区三区 | 婷婷综合久久 | 久久久性| 国产欧美一区二区三区久久 | 欧美午夜一区 | 精品三级在线观看 | 日本色婷婷 | 久久久精品网站 | 凹凸日日摸日日碰夜夜 | 日韩精品成人免费观看视频 | 日韩免费视频 | wwwxxx日本在线观看 | 国产精品色 | 国产精品成av人在线视午夜片 | 超碰精品在线 |