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

QQ登錄

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

搜索
查看: 5694|回復(fù): 2
收起左側(cè)

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

[復(fù)制鏈接]
ID:245101 發(fā)表于 2017-11-2 20:48 來(lái)自手機(jī) | 顯示全部樓層 |閱讀模式
如題,共陽(yáng)級(jí)數(shù)碼管

Screenshot_2017-11-02-20-45-31.png
     程序無(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、自鎖開(kāi)關(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;                        /*緊急剎車(chē)*/

  40. void delay(uchar t);                /*定義延時(shí)程序*/
  41. void key();                                /*定義鍵盤(pán)程序*/
  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;                                  //開(kāi)中斷
  51.         ET0=1;
  52.         TR0=1;
  53.         EA=1;
  54.         EX0=1;
  55.         EX1=1;
  56.         P1=c[k];                                  //開(kāi)啟交通燈
  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)開(kā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()                                //鍵盤(pán)程序用KO K1模擬一道有車(chē)一道無(wú)車(chē)
  192. {
  193.             if(K1==0)                                           /*主干道有車(chē)支干道無(wú)車(chē)*/
  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)                                            /*支干道有車(chē)主干道無(wú)車(chē)*/
  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ù)制代碼


回復(fù)

使用道具 舉報(bào)

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)接線碼,你的接線看不見(jiàn),無(wú)法判斷正確不正確,要根據(jù)接線編輯段碼。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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