欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6059|回復: 2
收起左側

51單片機驅動數碼管數字顯示混亂是怎么回事?

[復制鏈接]
ID:245101 發表于 2017-11-2 20:48 來自觸屏版 | 顯示全部樓層 |閱讀模式
如題,共陽級數碼管

Screenshot_2017-11-02-20-45-31.png
     程序無誤,管腳接觸無誤

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

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

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

  22. 交通燈的電機源程序:
  23.         
  24. #include<reg51.H>                                         // 對單片機的口進行了定義
  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};//段碼組合,共陽極
  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;                         /*數碼管顯示值設置*/
  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;                        /*設置時間*/
  39. sbit K2=P3^3;                        /*緊急剎車*/

  40. void delay(uchar t);                /*定義延時程序*/
  41. void key();                                /*定義鍵盤程序*/
  42. void display();                        /*定義顯示程序*/
  43. void settime();                /*定義時間設置顯示程序*/
  44. //*************************程序初始*********************************************
  45. void init(void)
  46. {
  47.         TMOD=0x01;                          /*使用定時器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                 //        通行時間設置
  60. {         
  61.   EA=0;
  62.   P1=0xd8;                                /*紅燈全亮*/
  63.   
  64. for(;;)
  65.         {
  66.            settime();

  67.                    if(K1==0)                                          /*P3^6=0設置主干道通行時間*/
  68.            {  
  69.           delay(40);
  70.           if(K1==0)
  71.                   {
  72.              while(!K1)
  73.              {settime();}
  74.                                  DXG++;                                /*主干道通行時間加1*/
  75.              if(DXG==100)
  76.              DXG=0;                        
  77.           }
  78.            }
  79.          
  80.                    if(K0==0)                                                         /*P3^5=0設置支干道通行時間*/
  81.            {  
  82.              delay(40);
  83.              if(K0==0)
  84.                      {
  85.                while(!K0)
  86.                {settime();}
  87.                            NBG++;                                                /*支干道通行時間加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;                                                            /*停止計數*/

  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];                                          /*返回緊急前狀態開始計數*/
  137.                 TR0=!TR0;                                                /*重啟計數*/
  138.                 break;                                                           
  139.                 }
  140.         }
  141. }
  142. void time1(void) interrupt 1                                                /*交通燈控制程序*/
  143. {
  144.         TH0=0x3c;                                                                                /*定時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)                         //延時程序延時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];        /*顯示主干道通行時間         */
  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];                /*顯示支干道通行時間*/
  186.            delay(20);
  187.                   
  188.        P2=b[3],P0=a[(DXG+H)/10];        
  189.            delay(20);
  190. }
  191. void  key()                                //鍵盤程序用KO K1模擬一道有車一道無車
  192. {
  193.             if(K1==0)                                           /*主干道有車支干道無車*/
  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)                                            /*支干道有車主干道無車*/
  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的不同值進入確定顯示數值*/
  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();}                                                /*執行for循環延時*/                        
  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.           }
復制代碼


回復

使用道具 舉報

ID:96682 發表于 2017-11-2 23:24 | 顯示全部樓層
顯示亂碼是因為單片機與數碼管的連接有誤
回復

使用道具 舉報

ID:126608 發表于 2017-11-3 10:11 | 顯示全部樓層
你的共陽段碼不是標準接線碼,你的接線看不見,無法判斷正確不正確,要根據接線編輯段碼。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表