找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機(jī)交通燈系統(tǒng)設(shè)計(流程框圖+硬件+源碼)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:410059 發(fā)表于 2018-10-15 17:21 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
這是老師要求做的項(xiàng)目,現(xiàn)在已經(jīng)做好了,沒有什么大問題。

一, 設(shè)計要求與方案論證
1.1設(shè)計要求:
              1.1.1基本要求:
              1、東西方向、南北方向均有紅、黃、綠三種信號燈,初始紅燈30秒,黃燈閃爍3秒,綠燈30秒,東西方向紅燈時刻,南北方向綠燈,南北方向綠燈,東西方向紅燈;
2、按鍵調(diào)節(jié)與控制功能,通過按鍵,可以控制某一個方向長時間綠燈,另一個方向長時間紅燈;通過按鍵可以控制某一個方向的紅燈時長,比如調(diào)整東西方向紅燈40秒,綠燈20秒,于此同時,南北方向紅燈20秒,綠燈40秒。
3、夜間模式按鈕按下,所有方向顯示黃燈閃爍
4、實(shí)時提醒燈亮的剩余時間

1.1.2拓展部分:
目前還沒拓展
1.2系統(tǒng)基本方案選擇和論證:
              1.2.1單片機(jī)芯片的選擇方案和論證:
    STC公司生產(chǎn)的8051內(nèi)核,CMOS工藝;
              1.2.2數(shù)碼管顯示模塊的選擇方案和論證:
    選擇的是共陽的數(shù)碼管,單片機(jī)的驅(qū)動能力不是很強(qiáng),故此選擇共陽數(shù)碼管;。
              1.2.3Led燈的選擇方案與論證:
    通過一個Led燈的電流大約是10ms。
              1.3 電路設(shè)計最終方案
2.1  表數(shù)的產(chǎn)生由定時器T0產(chǎn)生
TH0=0xFC;TL0=0x67; 每1ms中斷一下,對整個項(xiàng)目的標(biāo)志量改變一下它的值。
2.2  略;
3.1 電路設(shè)計框圖
3.2系統(tǒng)硬件描述
  主要的硬件是89C51這個芯片進(jìn)行輸入輸出控制。
3.3主要單元電路的設(shè)計
              3.3.1單片機(jī)主控模塊的設(shè)計
      
              3.3.2數(shù)碼管模塊的設(shè)計
      
              3.3.3Led燈模塊的設(shè)計
     
              3.3.4電源穩(wěn)壓模塊


4.1程序流程框圖
4.2 數(shù)碼管模塊流程圖
4.3 按鍵調(diào)整模塊設(shè)計框圖
5.1 測試儀器
萬能表對是否導(dǎo)通,是否短路進(jìn)行檢測。
5.2軟件測試平臺 Keil C51


5.3 硬件測試
              5.3.1 顯示模塊測試
   
  
5.4 測試結(jié)果分析與結(jié)論
              5.4.1測試結(jié)果分析
    已經(jīng)可以實(shí)現(xiàn)上述功能。
              5.4.2測試結(jié)論
    測試已經(jīng)完成,已經(jīng)可以實(shí)現(xiàn)了要求的功能。
作品總結(jié)
  在這一次的作品制作過程中對萬用表,c語言,Proteus的使用更加的得心應(yīng)手,更加的熟練。
附錄一:系統(tǒng)電路圖


附錄二:系統(tǒng)C程序
  1. #include<reg52.h>
  2. #define              uint unsigned int;
  3. #define  uchar unsigned char;

  4. void  DigitalTube();   //數(shù)碼管顯示函數(shù)
  5. void  InterruptT0();              //內(nèi)部中斷0

  6. sbit  P10 = P1^0;                            //紅綠燈引腳的初始化
  7. sbit  P11 = P1^1;
  8. sbit  P12 = P1^2;
  9. sbit  P13 = P1^3;
  10. sbit  P14 = P1^4;
  11. sbit  P15 = P1^5;

  12. sbit  P16 = P1^6;                            //數(shù)碼管使能控制
  13. sbit  P17 = P1^7;
  14. sbit  P20 = P2^0;
  15. sbit  P21 = P2^1;

  16. sbit  K22 = P2^2;                 //按鍵22
  17. sbit  K23 = P2^3;
  18. sbit  K24 = P2^4;
  19. sbit dula = P2^5;

  20. uint LedBuf[10] = {
  21.                               0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
  22.                             0x80,0x90
  23. };                            //0~9的數(shù)字顯示共陽

  24. uint Kflag = 1;                              //按鍵24的標(biāo)志
  25. uint LedNumNS = 27;                 //南北的數(shù)字顯示
  26. uint LedNumEW = 30;                 //東西的數(shù)字顯示
  27. uint i = 0;
  28. uint j = 0;
  29. uint j1 = 0;
  30. uint k = 0;
  31. uint g = 0;
  32. uint z = 0;                                          //計數(shù)及狀態(tài)的變量

  33. uint LedTime1 = 30;
  34. uint LedTime2 = 27;
  35. uint LedTime3 = 30;
  36. uint LedTime4 = 27;

  37. uint Kf22 = 1;              //按鍵前一個狀態(tài)的值
  38. uint Kf23 = 1;
  39. uint Kf24 = 1;
  40. uint KSta24 = 1;              //按鍵的當(dāng)前值
  41. uint KSta23 = 1;
  42. uint KSta22 = 1;  
  43. uchar Kflag22 = 0;              //按鍵22的switch函數(shù)參數(shù)

  44. void main()
  45. {
  46.               EA = 1;                                          //開總中斷
  47.               ET0 = 1;                            //開內(nèi)部中斷0
  48.               TR0 = 1;
  49.               TMOD = 0x01;                 //方式1
  50.               TH0 = 0xFC;
  51.               TL0= 0x67; //1ms中斷
  52.               P1 = 0xEE;                            //

  53.               while(1)
  54.               {
  55.                             DigitalTube();              //數(shù)碼管顯示
  56.               }

  57. }


  58. void InterruptT0() interrupt 1
  59. {
  60.                                                         TH0 = 0xFC;
  61.                                                         TL0 = 0x67; //1ms中斷            
  62.                                                         i++;            
  63.                                                         k++;
  64.                                          
  65.                                                         KSta24 = K24;                                //按鍵K24  夜間模式
  66.                                                         if(Kf24 != KSta24)                            //按鍵有動作
  67.                                                         {
  68.                                                                       if(Kf24 == 1)                            //按鍵按下
  69.                                                                       {
  70.                                                                                     Kflag = !Kflag;                           
  71.                                                                       }
  72.                                                                       Kf24 = KSta24;
  73.                                                         }
  74.                                          


  75.                                           KSta23 = K23;                                //按鍵K23  增減時長
  76.                                           if(Kf23 != KSta23)                            //按鍵有動作
  77.                                           {
  78.                                                         if(Kf23 == 1)                            //按鍵按下
  79.                                                         {
  80.                                                         //              LedTime = LedTime +2;
  81.                                                                       LedTime1 = LedTime1 +5;              //32  34 36 38 30
  82.                                                                       LedTime2 = LedTime2 +5;              //25  23 21  19 17
  83.                                                                       LedTime3 = LedTime3 +5;
  84.                                                                       LedTime4 = LedTime4 +5;
  85.                                                                       if(LedTime1 >=60)
  86.                                                                                     {
  87.                                                                                                   LedTime1 = 10;
  88.                                                                                                   LedTime2 = 7;
  89.                                                                                                   LedTime3 = 10;
  90.                                                                                                   LedTime4 = 7;
  91.                                                                                     }            
  92.                                                                       LedNumEW = LedTime1;
  93.                                                                       LedNumNS = LedTime2;
  94.                                                         }
  95.                                                         Kf23= KSta23;
  96.                                           }
  97.                            


  98.                                           KSta22 = K22;                                //按鍵K22  某方向長時間紅燈
  99.                                           if(Kf22 != KSta22)                            //按鍵有動作
  100.                                           {
  101.                                                         if(Kf22 == 1)                            //按鍵按下
  102.                                                         {
  103.                                                                       Kflag22 ++;            
  104.                                                                       if(Kflag22>= 3)            
  105.                                                                                     {
  106.                                                                                     Kflag22 = 0;
  107.                                                                                     }

  108.                                                                       switch(Kflag22)
  109.                                                                       {
  110.                                                                                     case 1:
  111.                                                                                                   LedTime1 = 50;
  112.                                                                               LedTime2 = 47;              //case2
  113.                                                                                                   LedTime3 = 20;
  114.                                                                                                   LedTime4 = 17; //case1

  115.                                                                                                   LedNumEW = LedTime1;
  116.                                                                                                   LedNumNS = LedTime2;


  117.                                                                                         break;
  118.                                                                                     case 2:            
  119.                                                                                                   LedTime1 = 20;
  120.                                                                               LedTime2 = 17;                //case2
  121.                                                                                                   LedTime3 = 50;
  122.                                                                                                   LedTime4 = 47;              //case1

  123.                                                                                                   LedNumEW = LedTime1;
  124.                                                                                                   LedNumNS = LedTime2;
  125.                                                                                                   break;
  126.                                                                                     case 0:            
  127.                                                                      
  128.                                                                                                   LedTime1 = 30;
  129.                                                                               LedTime2 = 27;
  130.                                                                                                   LedTime3 = 30;
  131.                                                                                                   LedTime4 = 27;
  132.                                                                                                   LedNumEW = LedTime1;
  133.                                                                                                   LedNumNS = LedTime2;
  134.                                                                                     break;
  135.                                                                       }

  136.                                                         }
  137.                                                         Kf22 = KSta22;
  138.                                           }
  139.                                          

  140.               if(j >= 200)
  141.                             {
  142.                                           j  = 0;
  143.                                           j1++;
  144.                             }


  145.               if(i >= 1000)
  146.               {
  147.                             i = 0;
  148.                             LedNumNS--;              //27
  149.                             LedNumEW--;              //30
  150.                             switch(g)
  151.                             {                                            //剛開始東西紅  南北綠
  152.                                           case 0:                                                                                                                   //********2
  153.                                                         if(LedNumEW == 3)                                                           //*****3
  154.                                                         {
  155.                                                                                     P14 = ! P14;   //綠燈滅
  156.                                                         if(Kf24 == Kflag)                            P15 = ! P15;   //黃燈亮
  157.                                                                                     LedNumNS = 3;
  158.                                                         }            
  159.                                                         if(LedNumEW == 0)
  160.                                                         {
  161.                                                                       LedNumNS =  LedTime3;              //   30東西綠南北紅的時間
  162.                                                                       LedNumEW =               LedTime4;              //  27
  163.                                                                       P12 = ! P12;                 //東西綠燈亮
  164.                                                                       P10 = ! P10;                //東西紅燈滅
  165.                                                                       P13 = ! P13;                              //nanbei紅燈亮
  166.                                                             if(Kf24 == Kflag)
  167.                                                                       P15 = ! P15;                //南北黃燈滅
  168.                                                                       g = 1;
  169.                                                         }            
  170.                                                         break;

  171.                                           case 1:                                                                                                                              //******4
  172.                                                         if(LedNumNS == 3)                 //黃燈亮
  173.                                                                       {
  174.                                                                    P12 = !P12;
  175.                                                                                        P11 = !P11;            
  176.                                                                                        LedNumEW = 3;
  177.                                                                       }
  178.                                                         if(LedNumNS == 0)                                                                         //********5
  179.                                                         {
  180.                                                                       LedNumEW = LedTime1;//重新賦值
  181.                                                                       LedNumNS = LedTime2;
  182.                                                         if(Kf24 == Kflag)              P11 = !P11;                 //南北黃燈滅
  183.                                                                       P10 = !P10;                //dongxi紅燈亮
  184.                                                                       P14 = !P14;
  185.                                                                       P13 = !P13;
  186.                                                                       g = 0;
  187.                                                         }
  188.                                                         break;
  189.                                }
  190.                            

  191.                   if(Kf24 != Kflag)                                                        //夜間模式
  192.                             {
  193.                                           if(j1 % 2 == 0)
  194.                                           {
  195.                                                         P11 = ! P11;            
  196.                                                         P15 = ! P15;
  197.                                 }                                                          //所有方向黃燈閃爍
  198.                             }                             
  199.               }                                                                       
  200. }




  201. void  DigitalTube()                            //數(shù)碼管

  202. {                    
  203.               switch(z)
  204.               {
  205.                                           case 0:                                                                      //第一個數(shù)碼管顯示數(shù)字
  206.                                          
  207.                                               P0 =0xFF;                            //防止數(shù)字顯示混亂
  208.                                                         dula = 1;
  209.                                                         P0 = LedBuf[LedNumEW / 10];              //十位
  210.                                                         P20 = 0;
  211.                                                         P17 = 0;
  212.                                                         P21 = 0;
  213.                                                         P16 = 1;
  214.                                                         dula = 0;
  215.                                                         z++;            
  216.                                                         break;                             
  217.             
  218.                                           case 1:                                                          //第二個數(shù)碼管亮
  219.                                                            P0 =0xFF;
  220.                                                         dula = 1;
  221.                                                         P0 = LedBuf[LedNumEW % 10];              //個位
  222.                                                         P16 = 0;
  223.                                                         P20 = 0;
  224.                                                         P21 = 0;
  225.                                                         P17 = 1;
  226.                                                         dula = 0;
  227.                                               z++;
  228.                                                         break;
  229.                            
  230.                                           case 2:                                                        //第三個數(shù)碼管亮
  231.                                               P0 =0xFF;
  232.                                                         dula = 1;
  233.                                                         P0 = LedBuf[LedNumNS / 10]; //十位
  234.                                                         P21 = 0;
  235.                                                         P16 = 0;
  236.                                                         P17 = 0;                                            //關(guān)閉2
  237.                                                         P20 = 1;                                            //使能第3個數(shù)碼管
  238.                                                         dula = 0;
  239.                                                         z++;                                                        //進(jìn)入3
  240.                                                         break;
  241.                                          
  242.                                           case 3:                                                          //第四個數(shù)碼管亮

  243.                                               P0 =0xFF;
  244.                                                         dula = 1;
  245.                                                         P0 = LedBuf[LedNumNS % 10];              //個位
  246.                                                         P20 = 0;                                          //第三個關(guān)閉
  247.                                                         P16 = 0;
  248.                                                         P17 = 0;
  249.                                                         P21 = 1;                                          //使能第四個數(shù)碼管
  250.                                                         dula = 0;
  251.                                                         z = 0;                                                          //進(jìn)入0
  252.                                                         break;

  253.                                           default:break;                                                                                                   
  254.               }
  255. }
復(fù)制代碼

完整的Word格式文檔51黑下載地址:
項(xiàng)目報告說明書.docx (239.11 KB, 下載次數(shù): 293)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:531151 發(fā)表于 2019-6-8 14:19 | 只看該作者
可以,很強(qiáng)勢
回復(fù)

使用道具 舉報

板凳
ID:548675 發(fā)表于 2019-6-10 12:59 來自手機(jī) | 只看該作者
可以看看我的嗎?  大佬幫我加個按鍵
回復(fù)

使用道具 舉報

地板
ID:531151 發(fā)表于 2019-6-27 11:27 | 只看該作者
我也想加按鍵  但是不會
回復(fù)

使用道具 舉報

5#
ID:575535 發(fā)表于 2019-7-1 15:04 來自手機(jī) | 只看該作者
這不需要接晶振嗎?
回復(fù)

使用道具 舉報

6#
ID:678389 發(fā)表于 2019-12-31 14:18 | 只看該作者
很厲害,剛需
回復(fù)

使用道具 舉報

7#
ID:687420 發(fā)表于 2020-1-19 19:08 | 只看該作者
gxgxg 發(fā)表于 2019-7-1 15:04
這不需要接晶振嗎?

肯定需要接的。。。。。。!
回復(fù)

使用道具 舉報

8#
ID:732153 發(fā)表于 2020-4-18 23:48 | 只看該作者
這個程序有點(diǎn)問題啊,單步調(diào)式了一下,p1口根本就不變化,交通燈不涼,數(shù)碼管是對的,另外我導(dǎo)入proteux里面得到的也是一樣的結(jié)果
回復(fù)

使用道具 舉報

9#
ID:736487 發(fā)表于 2020-4-23 21:13 | 只看該作者
可以把引腳的編碼再發(fā)一遍嗎?能看清數(shù)字的那種,謝謝
回復(fù)

使用道具 舉報

10#
ID:738054 發(fā)表于 2020-5-6 18:33 來自手機(jī) | 只看該作者
有做的成品提供下載
回復(fù)

使用道具 舉報

11#
ID:776037 發(fā)表于 2020-6-11 11:48 | 只看該作者
引腳看不清難受
回復(fù)

使用道具 舉報

12#
ID:779601 發(fā)表于 2020-6-15 16:47 | 只看該作者
在實(shí)驗(yàn)箱上怎么連啊
回復(fù)

使用道具 舉報

13#
ID:779392 發(fā)表于 2020-6-15 21:00 來自手機(jī) | 只看該作者
雪菜 發(fā)表于 2020-4-18 23:48
這個程序有點(diǎn)問題啊,單步調(diào)式了一下,p1口根本就不變化,交通燈不涼,數(shù)碼管是對的,另外我導(dǎo)入proteux里 ...

我數(shù)碼管不亮咋辦
回復(fù)

使用道具 舉報

14#
ID:845493 發(fā)表于 2020-11-25 20:37 | 只看該作者
李李李89 發(fā)表于 2020-4-23 21:13
可以把引腳的編碼再發(fā)一遍嗎?能看清數(shù)字的那種,謝謝

附議。。!大佬可以再發(fā)下可以看清引腳的圖片的嗎?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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