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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2108|回復: 8
收起左側

51單片機實現2位一體數碼管的99-1顯示的代碼和仿真 顯示很閃?

[復制鏈接]
ID:664329 發表于 2022-3-7 14:37 | 顯示全部樓層 |閱讀模式
51單片機實現2位一體數碼管的99-1顯示的代碼和仿真,按鍵可以暫停和繼續開始
可以重復實現99到1的倒計時
按鍵按一下為暫停,再按一次繼續倒計

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif

單片機源程序如下:
  1. #include "reg52.h"
  2. #include <stdio.h>
  3. typedef unsigned int u16;
  4. typedef unsigned char u8;
  5. sbit key = P3^4;
  6. sbit LS0 = P3^0;
  7. sbit LS1= P3^1;   
  8. unsigned char led_mod[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  9. void display(u8 num);
  10. void delay_ms(u16 num);
  11. void main()
  12. {
  13. u8 c;
  14. u8 m,n,a;        
  15. c=99;        
  16. while(1)
  17. {
  18.         display(c);
  19.         delay_ms(300);
  20.         c=c-1;
  21.         if(key==0)
  22.         {
  23.                 a=1;
  24.                 while(a)
  25.                 {
  26.                         display(c);
  27.                         delay_ms(300);
  28.                         if(key==0)
  29.                         {
  30.                                 a=0;
  31.                         }
  32.                 }
  33.         }
  34.         if(c<=0)
  35.         {
  36.                 c=99;
  37.         }
  38. }
  39. }        

  40. void display(u8 num)
  41. {
  42. u8 m, n,j;
  43. m = num/10;
  44. n = num%10;
  45. for(j=0;j<2;j++)  
  46.             {
  47.                          switch(j)         
  48.                          {
  49.                                  case(0):
  50.                                          LS0=0;LS1=1;
  51.                                          P2=led_mod[m];                                 
  52.                                          break;
  53.                                  case(1):
  54.                                          LS0=1;LS1=0;
  55.                                          P2=led_mod[n];                                 
  56.                                         break;                                 
  57.                          }                        
  58.                          delay_ms(25);
  59.                          P2=0x00;
  60.                  }
  61. }




  62. void delay_ms(u16 num)
  63. {
  64.         u16 x, y;
  65.         for(x = num; x > 0; x--)
  66.         for(y = 110; y > 0; y--);
  67. }
復制代碼

Keil代碼與Proteus仿真下載:
電子設計.7z (61.44 KB, 下載次數: 9)
回復

使用道具 舉報

ID:966423 發表于 2022-3-7 21:34 | 顯示全部樓層
建議你程序規范一些,u8 c最好初始化的時候直接定于0或者其他數據要不然編譯器有時會給你隨便搞一個數值。
回復

使用道具 舉報

ID:514254 發表于 2022-3-8 00:20 | 顯示全部樓層
閃爍是“視覺暫留”沒有控制好啊,delay_ms(300);delay_ms(25);都是問題
回復

使用道具 舉報

ID:123289 發表于 2022-3-8 15:39 | 顯示全部樓層
何時不用DELAY了,就好了。
初學者,只會用最低級的DELAY延時,不知道教課書上有沒有教過DELAY的危害是什么。誰害了初學者。
你想想看,當你DELAY 0.3秒時,在這0.3秒里,兩個LED是顯示的是什么?一個有字一個無字?
回復

使用道具 舉報

ID:1008839 發表于 2022-3-8 16:19 | 顯示全部樓層
延遲弄長一點看看
回復

使用道具 舉報

ID:213173 發表于 2022-3-8 16:45 | 顯示全部樓層
樓主仔細對比一下,會有收獲。
  1. #include "reg52.h"
  2. #include <stdio.h>
  3. typedef unsigned int u16;
  4. typedef unsigned char u8;
  5. sbit key = P3^4;
  6. sbit LS0 = P3^0;
  7. sbit LS1 = P3^1;   
  8. unsigned char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  9. void display(u8 num);
  10. void delay_ms(u16 num);

  11. void main()
  12. {
  13.         u16 count;
  14.         u8  c=0,a=0;
  15.         bit n=0,m=0;
  16.         while(1)
  17.         {
  18.                 if(key==0)
  19.                 {
  20.                         if(++a>=10 && n==0)
  21.                         {
  22.                                 n=1;
  23.                                 if(c!=0)m=~m;
  24.                                 else        
  25.                                 {
  26.                                         c=99;
  27.                                         m=1;
  28.                                 }
  29.                         }
  30.                 }
  31.                 else
  32.                 {
  33.                         a=0;
  34.                         n=0;
  35.                 }
  36.                 if(m==1)
  37.                 {               
  38.                         if(++count>=1000)
  39.                         {
  40.                                 count=0;
  41.                                 if(c>0)c--;
  42.                                 else m=0;
  43.                         }
  44.                 }
  45.                 display(c);
  46.                 delay_ms(1);       
  47.         }
  48. }        

  49. void display(u8 num)
  50. {
  51.         static bit i=0;
  52.         P2=0x00;
  53.         if(i==0)
  54.         {
  55.                 LS0=0;LS1=1;       
  56.                 P2=led_mod[num/10];
  57.                 i=1;
  58.         }
  59.         else
  60.         {
  61.                 LS0=1;LS1=0;       
  62.                 P2=led_mod[num%10];
  63.                 i=0;
  64.         }
  65. }

  66. void delay_ms(u16 num)
  67. {
  68.         u16 x, y;
  69.         for(x=num;x>0;x--)
  70.                 for(y=110;y>0;y--);
  71. }
復制代碼
回復

使用道具 舉報

ID:824490 發表于 2022-3-8 16:45 | 顯示全部樓層
本帖最后由 名字不是重點 于 2022-3-8 17:00 編輯

動態掃描顯示,就是利用人眼的“視覺暫留”效果,來實現整幅畫面的“穩定”顯示。
人眼的“視覺暫留”一般在100ms-400ms,如要8個數碼管動態掃顯,必需保證至少每100ms(掃描間隔Ts)要輸出一幀的顯示數據。假如傳輸一幀數據花費的時間為2ms(Tf),一幀包含8個數碼管,所以每個數碼管的維持時間(Th)約為0.25ms,這時數碼管顯示看上去很暗,就要把Th加大。而且每個數碼管的Th必需相同,這樣才不會顯得亮度不均(硬件參數正確的情況下)。而Ts太大了,就會出現數碼管閃爍的現象,也不能太小,否則會影響其它任務的時效性。這就牽涉到任務時間片的調度,
在祼奔系統中,常規的做法是把掃顯任務做成一個函數,在其它任務片中按需調用。比如按鍵掃描,插入掃顯,替代“去抖動延時”,等等。而RTOS之類的系統另說。
回復

使用道具 舉報

ID:1008839 發表于 2022-3-8 21:33 | 顯示全部樓層
應該是延時中斷的問題
回復

使用道具 舉報

ID:824490 發表于 2022-3-8 22:09 | 顯示全部樓層
void display(u8 num)這個函數有點廢。。
總共就2個數碼管,又是if ,又是switchr ...
  • void display(u8 num)
  • {
  • u8 m, n;
  • m = num/10;
  • n = num%10;
  • LS0=0;LS1=1;
  • P2=led_mod[m];
  • delay_ms(25);
  • LS0=1;LS1=0;
  •   P2=led_mod[n];
  •   delay_ms(25);
  •   P2=0x00;
  • }

這樣不更快嗎?


回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 天天干视频 | 午夜国产一级 | 日韩高清三区 | 一区二区三区av | h视频在线播放 | 99re在线视频免费观看 | 亚洲国产精品成人综合久久久 | 99国产精品99久久久久久 | 日韩在线 | 国产色网 | 欧美一区视频 | 欧美国产日韩一区二区三区 | 一级黄色片免费 | 电影91久久久 | 天天操夜夜操免费视频 | 国产精品区一区二区三区 | 欧美区在线| 嫩呦国产一区二区三区av | 久久久久久久久国产成人免费 | 国产传媒视频在线观看 | 亚洲精品一区二区二区 | 国精产品一区二区三区 | 久久网一区二区三区 | 中文字幕在线看人 | 美女高潮网站 | 国产伦精品一区二区三区四区视频 | 日韩一区二区三区在线播放 | 中文字幕av在线播放 | 欧美精品一区二区三区四区五区 | 欧美亚洲国产一区二区三区 | 欧美jizzhd精品欧美巨大免费 | 久久爱黑人激情av摘花 | 天天干天天操天天看 | 91麻豆精品国产91久久久久久久久 | 天天澡天天狠天天天做 | 日本小电影网站 | 精品福利在线 | 久久综合爱 | 日韩中文久久 | 一区二区不卡 | 日韩欧美精品在线 |