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

QQ登錄

只需一步,快速開始

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

51單片機(jī)驅(qū)動(dòng)數(shù)碼管數(shù)字顯示混亂是怎么回事?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:245101 發(fā)表于 2017-11-2 20:48 來(lái)自觸屏版 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
如題,共陽(yáng)級(jí)數(shù)碼管


     程序無(wú)誤,管腳接觸無(wú)誤

  1. /**********交通燈元件清單***********/

  2. 1、9*15萬(wàn)用板            一塊
  3. 2、單片機(jī)            一枚
  4. 3、兩位數(shù)碼管            4個(gè)
  5. 4、LED燈            9個(gè)
  6. 5、排阻            一個(gè)
  7. 6、晶振            1個(gè)
  8. 7、三極管8550        4個(gè)
  9. 8、電解電容10uf        1個(gè)
  10. 9、按鍵            6個(gè)
  11. 10、USB接口            1個(gè)
  12. 11、自鎖開關(guān)            1個(gè)
  13. 12、電阻470            9個(gè)
  14. 13、電阻.7K            4個(gè)
  15. 14、電阻10K            1個(gè)

  16. 交通燈的pcb:
  17. 0.png 0.png
  18. 交通燈原理圖:
  19. 0.png
  20. 交通燈仿真:
  21. 0.png 0.png

  22. 交通燈的電機(jī)源程序:
  23.         
  24. #include<reg51.H>                                         // 對(duì)單片機(jī)的口進(jìn)行了定義
  25. #define uint unsigned int
  26. #define uchar unsigned char
  27. uchar code a[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//段碼組合,共陽(yáng)極
  28. uchar code b[4]={0x01,0x02,0x04,0x08}; //位碼組合         
  29. uchar code c[4]={0xcc,0xd4,0x78,0xb8};/*P1 綠紅、黃紅、紅綠、紅黃*/
  30.                   
  31. //12MHz                          
  32. //*************************************************************************************
  33. uchar NB=25,DX=30,NBG=25,DXG=15,H=5;                         /*數(shù)碼管顯示值設(shè)置*/
  34. uchar  i,k=0,cnt=0,j=0;

  35. sbit K0=P3^4;                           /*支干道通行*/
  36. sbit K1=P3^5;                           /*主干道通行*/
  37. sbit K4=P3^6;                           /*返回*/
  38. sbit K3=P3^2;                        /*設(shè)置時(shí)間*/
  39. sbit K2=P3^3;                        /*緊急剎車*/

  40. void delay(uchar t);                /*定義延時(shí)程序*/
  41. void key();                                /*定義鍵盤程序*/
  42. void display();                        /*定義顯示程序*/
  43. void settime();                /*定義時(shí)間設(shè)置顯示程序*/
  44. //*************************程序初始*********************************************
  45. void init(void)
  46. {
  47.         TMOD=0x01;                          /*使用定時(shí)器0模式一*/
  48.         TH0=0x3c;                          /*(65536-5000)/256*/
  49.         TL0=0xb0;                          /*(65536-5000)%256*/
  50.         IT0=1;                                  //開中斷
  51.         ET0=1;
  52.         TR0=1;
  53.         EA=1;
  54.         EX0=1;
  55.         EX1=1;
  56.         P1=c[k];                                  //開啟交通燈
  57. }
  58. //*************************中斷0處理程序***************************************
  59. void int0(void) interrupt 0                 //        通行時(shí)間設(shè)置
  60. {         
  61.   EA=0;
  62.   P1=0xd8;                                /*紅燈全亮*/
  63.   
  64. for(;;)
  65.         {
  66.            settime();

  67.                    if(K1==0)                                          /*P3^6=0設(shè)置主干道通行時(shí)間*/
  68.            {  
  69.           delay(40);
  70.           if(K1==0)
  71.                   {
  72.              while(!K1)
  73.              {settime();}
  74.                                  DXG++;                                /*主干道通行時(shí)間加1*/
  75.              if(DXG==100)
  76.              DXG=0;                        
  77.           }
  78.            }
  79.          
  80.                    if(K0==0)                                                         /*P3^5=0設(shè)置支干道通行時(shí)間*/
  81.            {  
  82.              delay(40);
  83.              if(K0==0)
  84.                      {
  85.                while(!K0)
  86.                {settime();}
  87.                            NBG++;                                                /*支干道通行時(shí)間加1*/
  88.                if(NBG==100)
  89.                NBG=0;               
  90.              }
  91.            }
  92.          
  93.            if(K4==0)                                                           /*P3^7=0返回*/
  94.        {  
  95.                 delay(40);        
  96.                     if(K4==0)
  97.                     {
  98.                        while(!K4)
  99.                            {
  100.                            }
  101.                            k=0;P1=c[k];
  102.                            NB=NBG,DX=NBG+H;        
  103.                        display();
  104.                            EA=1;
  105.                         
  106.                    break;
  107.                     }                       
  108.        }
  109.     }
  110. }


  111. //***********************************中斷1處理程序********************
  112. void int1(void) interrupt 2                                         //緊急情況
  113. {                                                                                          
  114.                                                          /*東西南北紅燈亮*/
  115.         EA=0;                                                                        
  116.         TR0=!TR0;                                                            /*停止計(jì)數(shù)*/

  117.         for(;;)                                                                   /*主支干道顯示全為0*/
  118.         {         
  119.                 P1=0xd8,
  120.                 P0=a[0];
  121.            P2=b[0];
  122.            delay(20);
  123.            
  124.            P2=b[1];
  125.            delay(20);

  126.            P2=b[2];
  127.            delay(20);

  128.            P2=b[3];
  129.            delay(20);
  130.    

  131.            if(K4==0)                                                   /*返回*/
  132.         {
  133.                  delay(20);
  134.                 EA=1;
  135.                   
  136.                 P1=c[k];                                          /*返回緊急前狀態(tài)開始計(jì)數(shù)*/
  137.                 TR0=!TR0;                                                /*重啟計(jì)數(shù)*/
  138.                 break;                                                           
  139.                 }
  140.         }
  141. }
  142. void time1(void) interrupt 1                                                /*交通燈控制程序*/
  143. {
  144.         TH0=0x3c;                                                                                /*定時(shí)50ms*/
  145.         TL0=0xb0;                                                                                         
  146.         cnt++;
  147.         
  148.         if(cnt>=20)                                                                                  /*每20*50ms=1s自減一*/
  149.         {
  150.                 NB--;
  151.                 DX--;
  152.                 cnt=0;
  153.                 if(NB==0||DX==0)
  154.                 {
  155.                         k++;
  156.                         if(k>3)                                                                        /*k取0,1,2,3*/
  157.                         k=0;
  158.                         switch(k)
  159.                         {        
  160.                                 case 0:NB=NBG,DX=NBG+H;j=0;P1=c[k];break;          /*主干道通行顯示綠紅*/
  161.                             case 1:NB=H;j=1;P1=c[k];break;                                           /*主干道黃燈閃爍*/
  162.                                 case 2:NB=DXG+H,DX=DXG;j=0;P1=c[k];break;          /*支干道通行顯示紅綠*/
  163.                                 case 3:DX=H;j=2;P1=c[k];break;                                           /*支干道黃燈閃爍*/
  164.                         }
  165.                 }                 
  166.         }
  167. }
  168. void delay(uchar t)                         //延時(shí)程序延時(shí)0.1*nms   
  169. {
  170.   uchar i;
  171.   do
  172.    {
  173.      for(i=0;i<20;i++)
  174.      ;;;
  175.    } while(t--);
  176. }
  177. void settime()
  178. {
  179.            P2=b[0],P0=a[(NBG+H)%10];        /*顯示主干道通行時(shí)間         */
  180.        delay(20);
  181.                   
  182.            P2=b[1],P0=a[(NBG+H)/10];        
  183.            delay(20);
  184.                   
  185.           P2=b[2],P0=a[(DXG+H)%10];                /*顯示支干道通行時(shí)間*/
  186.            delay(20);
  187.                   
  188.        P2=b[3],P0=a[(DXG+H)/10];        
  189.            delay(20);
  190. }
  191. void  key()                                //鍵盤程序用KO K1模擬一道有車一道無(wú)車
  192. {
  193.             if(K1==0)                                           /*主干道有車支干道無(wú)車*/
  194.     {  
  195.        delay(40);
  196.        if(K1==0)                        
  197.        {
  198.           while(!K1)
  199.           {  
  200.                                  display();
  201.           }
  202.              k=0,P1=c[k];cnt=0;
  203.           NB=NBG, DX=NBG+H;
  204.          display();
  205.        }
  206.     }
  207.            if(K0==0)                                            /*支干道有車主干道無(wú)車*/
  208.     {  
  209.        delay(40);
  210.        if(K0==0)
  211.        {
  212.           while(!K0)
  213.           {
  214.            display();
  215.           }
  216.                 k=2,P1=c[k];cnt=0;
  217.           NB=DXG+H,DX=DXG;
  218.                    display();
  219.            }
  220.         }
  221. }
  222. void display()                                                        //顯示程序
  223.         {
  224.                 P2=b[0],P0=a[NB%10];                           /*由k的不同值進(jìn)入確定顯示數(shù)值*/
  225.                 delay(20);
  226.         
  227.                 P2=b[1],P0=a[NB/10];
  228.                 delay(20);
  229.         
  230.                 P2=b[2],P0=a[DX%10];
  231.                 delay(20);
  232.                                                    
  233.                 P2=b[3],P0=a[DX/10];
  234.                 delay(20);
  235.         }
  236. void main(void)
  237. {                //主程序
  238.         init();
  239.         
  240.         for(;;)
  241.         {
  242.           display();
  243.           key();
  244.          
  245.           //黃燈閃爍程序
  246.           while(j==1)                                                                                        /*主干道黃燈閃爍*/
  247.        {                                                                                                               
  248.                      P1=0xdc;                                                                        /*給黃燈一高電平黃燈滅*/                  
  249.                          for(i=83;i>0;i--){display();}                                                /*執(zhí)行for循環(huán)延時(shí)*/                        
  250.                          P1=c[k];                                                                        /*再給黃燈一低電平黃燈亮*/
  251.                          for(i=83;i>0;i--){display();}
  252.                 }
  253.         while(j==2)
  254.          {                                                                                    /*支干道黃燈閃爍*/
  255.                     
  256.                          P1=0xf8;
  257.                          for(i=83;i>0;i--){display();}
  258.                          P1=c[k];
  259.                          for(i=83;i>0;i--){display();}
  260.                  }                                                                          
  261.           }
復(fù)制代碼


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

使用道具 舉報(bào)

沙發(fā)
ID:96682 發(fā)表于 2017-11-2 23:24 | 只看該作者
顯示亂碼是因?yàn)閱纹瑱C(jī)與數(shù)碼管的連接有誤
回復(fù)

使用道具 舉報(bào)

板凳
ID:126608 發(fā)表于 2017-11-3 10:11 | 只看該作者
你的共陽(yáng)段碼不是標(biāo)準(zhǔn)接線碼,你的接線看不見,無(wú)法判斷正確不正確,要根據(jù)接線編輯段碼。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表