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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8225|回復: 4
打印 上一主題 下一主題
收起左側

智能交通燈控制系統單片機課程設計報告

  [復制鏈接]
跳轉到指定樓層
樓主
ID:429279 發表于 2018-11-19 16:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
題目:智能交通燈控制系統設計     

摘要:交通燈在我們日常生活中隨處可見,它在交通系統中處于至關重要的位置。交通燈的使用大大減少了交通繁忙路口的事故發生,給行人和車輛提供一個安全的交通環境,人們的生命和財產安全有了保障。本設計旨在模擬十字路口的交通燈,以AT89C52單片機為基礎,結合按鍵和數碼管等元器件設計出一個簡單且完全的交通燈系統。

目錄
一、課程設計任務
1、設計目的
2、設計要求
二、設計總體方案
1、主要器件介紹
    1.1 AT89C52單片機              2
    1.2兩位共陰極數碼顯示管              3
    1.3紅綠燈              3
2、流程圖              4
3、硬件電路設計              4
3.1時鐘模塊              5
3.2開關控制模塊              5
3.3顯示輸出模塊              6
3.4蜂鳴器模塊              6
3.5復位電路模塊              7
三、模擬仿真結果              7
四、心得體會              10
參考文獻              11
附件1 源程序代碼              12
附件2 原理圖              22

一、課程設計任務1、設計目的

隨著經濟的發展,城市現代化程度不斷提高,交通需求和交通量迅速增長,城市交通網絡中交通擁擠日益嚴重,道路運輸所帶來的交通擁堵、交通事故和環境污染等負面效應也日益突出,逐步成為經濟和社會發展中的全球性公共問題。因此,研究基于智能集成的城市交通信號控制系統具有相當的學術價值和使用價值,使交通燈具有智能化的控制,未來的城市交通控制系統才能適應城市交通的發展。

本次設計實現了一個簡易智能交通燈控制系統,其核心思想就是根據兩個交叉方向的車流量、天氣狀況、是否是上下班高峰期等因素,能實現不同的紅綠燈切換時間,并且具有倒計時的功能。本次的課程設計,是基于89C51單片機結合按鍵,數碼管,二極管采用C語言作為編程語言設計的一個簡易的交通燈控制系統,具有紅綠燈計時,緊急車強制通過,自定義時間,黃燈閃爍,聲音提示等功能。

2、設計要求

(1)設計一個十字路口的交通燈控制電路,要求南北方向和東西方向兩條交叉道路上的車輛交替運行,每次通行時間都設30秒,時間可設置修改。

(2)在綠燈轉為紅燈時,要求黃燈先亮5秒鐘,才能變換運行車道,且黃燈亮時,要求每秒亮一次。

(3)有緊急車輛要求通過時,系統要能禁止東西和南北兩條路上所有的車輛通行。

二、設計總體方案1、主要器件介紹1.1 AT89C52單片機

本系統的課程設計選用MCS-51系列單片機作為整個系統的控制核心。AT89C52(如圖1)是一個低電壓,高性能CMOS 8位單片機,片內含8k bytes的可反復擦寫的Flash只讀程序存儲器和256 bytes的隨機存取數據存儲器(RAM),器件采用ATMEL公司的高密度、非易失性存儲技術生產,兼容標準MCS-51指令系統,片內置通用8位中央處理器和Flash存儲單元,功能強大的AT89C52單片機可提供許多較復雜系統控制應用場合。

  AT89C52有40個引腳,32個外部雙向輸入/輸出(I/O)端口,同時內含2個外中斷口,3個16位可編程定時計數器,2個全雙工串行通信口,2個讀寫口線,AT89C52可以按照常規方法進行編程,也可以在線編程。其將通用的微處理器和Flash存儲器結合在一起,特別是可反復擦寫的Flash存儲器可有效地降低開發成本。鑒于以上的優點本系統采用AT8952作為主控芯片,實現對整個系統的控制。

圖1  AT89C52單片機

1.2 兩位共陰極數碼顯示管

在紅綠燈與數碼管的顯示上,本系統采用兩位的7段兩位共陰極數碼管,可顯示00-99范圍,對于交通燈的倒計時,已經完全滿足需求。

P0輸入到數碼管為高電平是才能顯示,數碼管顯示通過控制其中的8個發光二極管來控制顯示,abcdefg用于控制數字顯示,dp用于控制小數點,例如:輸出為0X3f即00111111時abcdef都顯示,此時整個數碼管顯示0。1,2端口用于動態顯示時控制需要輸出到那個數碼管。

圖2 共陰極數碼顯示管

1.3 紅綠燈

              紅綠燈控制由P2端口控制,輸出高電平時就會時某一個發光二極管發亮,P2.1-P2.3控制東西方向,P2.4-P2.6控制南北方向,從而模擬紅綠燈的效果例如,輸出為P2 = 0Xc3時東西為綠燈,南北為黃燈。

圖3 紅綠燈設計圖

2、流程圖

圖4 設計流程圖


3、硬件電路設計

本系統的設計主要分為兩大部分,單片機最小系統模塊和顯示模塊。

單片機最小系統模塊的電路設計比較簡單,主要由時鐘電路、復位電路組成。此外,本系統添加了三個輸入按鍵,主要實現三個功能:東西通行、南北通行、禁止通行。

顯示電路采用七段共陰極數碼管顯示,南北方向的數碼管的段選端分別與P0端口的P0.0-P0.7相連,位選端分別與P1.2和P1.3相連;東西方向數碼關的段選端也與P2端口的P0.0-P0.7相連,位選端分別與P1.0和P1.1相連。

交通燈采用的是發光二極管,南北方向的紅黃綠等分別與P2.6、P2.5和P2.4相連:東西方向的紅黃綠燈分別與P2.3、P2.2和P2.1相連。

本系統的軟件設計主要分為五大模塊:時鐘模塊、開關控制模塊、顯示輸出模塊、蜂鳴器模塊、紅綠燈與數碼管模塊。

2.1時鐘模塊

MCS-51單片機芯片內部有一個用于構成振蕩器的高增益反向放大器,引腳XTAL1和XTAL2分別是此放大器的輸入端和輸出端。當使用內部震蕩電路時,XTAL1和XTAL2引腳外接石英晶體和微調電容,C2,C3大小一般為30pF,采用12M的晶振。時鐘模塊電路圖如圖5。

圖5 時鐘模塊電路圖

2.2開關控制模塊

在這個模塊中,主要用到了兩個外部中斷INT0和INT1,用于控制南北或東西強制通行,其他的5個開關在程序中定義。開關模塊電路圖如圖6。

圖6 開關模塊電路圖

2.3顯示輸出模塊

排插是因為P0口是準雙向口,即是開漏輸出的,當P0口作為并行口使用時,只能輸出低電平,不能輸出高電平,需要接一個上拉電阻才能輸出高電平,輸出是采用動態輸出P1.0,P1.1,P1.2,P1.3用與控制輸出選擇。顯示模塊電路圖如圖7。

圖7 開關模塊電路圖

2.4蜂鳴器模塊

P3.7用于蜂鳴器輸出,蜂鳴器一端接地,當P3.7口輸出高電平時,蜂鳴器就會響聲。蜂鳴器模塊電路圖如圖8。

圖8 蜂鳴器模塊電路圖

2.5復位電路模塊

使用Vcc為電容充電,當按下開關時電容,當持續輸出2us時即可reset單片機。復位電路模塊如圖9。

圖9 復位電路模塊電路圖

三、模擬仿真結果

(1)南北正常通行仿真結果如圖 10。

圖10 南北正常通行

(2)東西正常通行仿真結果如圖 11。

圖11 東西正常通行

(3)交通燈跳轉黃燈仿真結果如圖 12。

圖12 交通燈跳轉黃燈

(4)外部中斷南北通行仿真結果如圖13。

圖13 南北通行

(5)外部中斷東西通行仿真結果如圖14。

圖14 東西通行


(6)緊急情況仿真結果如圖15。

圖15 緊急車

4、心得體會

這次交通燈的制作是我學會了不少的東西,首先是proteus和keil的使用。單片機程序的編寫和原理圖的仿真都是在這兩個軟件的運行下才可以進行的。這個實驗最重要的是讓我對51系列的單片機有了更深層次的了解,這一學期開始接觸單片機的時候覺得這是一門極其高深的課程,老師講的什么基本完全不懂,課后看仍舊是一頭霧水。通過交通燈的學習和制作,對單片機有了初步的了解,知道了它的組成、工作原理等等。

在軟件編寫這一塊,開始時遇到了很大的難題,因為兩百行的程序,哪怕有一個錯誤,修改起來也不是十分方便。時常沒有心思去尋找和改正錯誤,所以軟件這一塊花了很大的一部分時間。幾次調試后總算出現“0 warning”和“0 error”的字樣。

除了學會很多東西以為,也發現了自己的不足。由于自己在這一方面只是的短缺,所以很多問題都需要查閱資料或者向別的同學請教。比如說proteus和keil的使用方法,都是看著別人操作幾遍之后才慢慢學會。另外,由于時間問題,沒能做到真正的實物實現,沒有接觸到焊接工作,這一點是十分遺憾的,相信如果做了實物實現,可能還會遇到更多的問題,學習到更多的實踐知識。

慶幸設計模擬結果是成功的,模擬出了交通燈的功能,各個按鍵的功能也和模擬時一致,看著數字的跳動自己信息也感到十分開心。雖然想過在這個交通燈里加入一些額外的功能,但終究由于自己知識的局限性而放棄,有點遺憾,不過能夠學到東西就好。此次試驗增長了自己的單片機知識外也讓我知道實踐和理論學習的差別。實踐過程中學到的知識自己記得會更加牢固一些,不容易忘記。總的來說,單片機的制作讓我收獲不小。


附件2 原理圖


  1. #include <reg51.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. uchar data buf[4];
  5. uchar data sec_dx = 20;//東西數默認
  6. uchar data sec_nb = 30;//南北默認值
  7. uchar data set_timedx = 20;
  8. uchar data set_timenb = 30;
  9. int n;
  10. uchar data b;//定時器中斷次數
  11. sbit  k1 = P1 ^ 6;//++
  12. sbit  k2 = P1 ^ 7; //--
  13. sbit  k3 = P2 ^ 7;  //確定
  14. sbit  k4 = P3 ^ 0; //切換方向
  15. sbit  k5 = P3 ^ 1; //緊急車
  16. sbit Yellow_nb = P2 ^ 5;        //南北黃燈標志
  17. sbit Yellow_dx = P2 ^ 2;        //東西黃燈標志
  18. sbit Green_nb = P2 ^ 4;
  19. sbit Green_dx = P2 ^ 1;
  20. sbit Red_nb = P2 ^ 6;
  21. sbit Red_dx = P2 ^ 3;
  22. sbit Buzz = P3 ^ 7;
  23. bit Buzzer_Indicate;
  24. bit time = 0;//燈狀態循環標志
  25. bit   set = 1;//調時方向切換鍵標志
  26. uchar code table[11] = {          //共陰極字型碼
  27.         0x3f,  //--0
  28.         0x06,  //--1
  29.         0x5b,  //--2
  30.         0x4f,  //--3
  31.         0x66,  //--4
  32.         0x6d,  //--5
  33.         0x7d,  //--6
  34.         0x07,  //--7
  35.         0x7f,  //--8
  36.         0x6f,  //--9
  37.         0x00   //--NULL
  38. };

  39. //函數的聲明部分
  40. void delay(int ms);//延時子程序
  41. void key();//按鍵掃描子程序
  42. void key_to1();//鍵處理子程序
  43. void key_to2();
  44. void key_to3();
  45. void display();//顯示子程序
  46. void logo();   //開機LOGO
  47. void Buzzer();
  48. //主程序
  49. void main()
  50. {
  51.            TMOD = 0X01;
  52.         /*TH0 = 0XD8;
  53.         TL0 = 0XF0;*/
  54.         TH0 = 0X3C; //1101 1000   50ms
  55.         TL0 = 0XB0;
  56.         EA = 1;
  57.         ET0 = 1;
  58.         TR0 = 1;        //開始
  59.         EX0 = 1;        //外部中斷0請求標志 允許
  60.         EX1 = 1;
  61.         logo();
  62.         P2 = 0Xc3;// 開始默認狀態,東西綠燈,南北黃燈
  63.         sec_nb = sec_dx + 5;
  64.         while (1)
  65.         {
  66.                 key(); //調用按鍵掃描程序
  67.                 display(); //調用顯示程序
  68.                 //Buzzer();
  69.         }
  70. }
  71. //函數的定義部分
  72. void key()        //按鍵掃描子程序
  73. {
  74.         if (k1 != 1)
  75.         {
  76.                 delay(10);
  77.                 if (k1 != 1)
  78.                 {
  79.                         while (k1 != 1)
  80.                         {
  81.                                 key_to1(); //時間增加
  82.                                 for (n = 0; n < 40; n++)
  83.                                 {
  84.                                         display();
  85.                                 }
  86.                         }
  87.                 }
  88.         }
  89.         if (k2 != 1)
  90.         {
  91.                 delay(10);
  92.                 if (k2 != 1)
  93.                 {
  94.                         while (k2 != 1)
  95.                         {
  96.                                 key_to2(); //時間減少
  97.                                 for (n = 0; n < 40; n++)
  98.                                 {
  99.                                         display();
  100.                                 }
  101.                         }
  102.                 }
  103.         }
  104.         if (k3 != 1)
  105.         {
  106.                 TR0 = 1;   //啟動定時器
  107.                 Buzzer_Indicate = 0;
  108.                 sec_nb = set_timenb;        //從中斷回復,仍顯示設置過的數值
  109.                 sec_dx = set_timedx;
  110.                 if (time == 0)
  111.                 {
  112.                         P2 = 0X99; sec_nb = sec_dx + 5;
  113.                 }
  114.                 else { P2 = 0xC3; sec_dx = sec_nb + 5; }
  115.         }
  116.         if (k4 != 1)
  117.         {
  118.                 //切換方向
  119.                 delay(5);
  120.                 if (k4 != 1)
  121.                 {
  122.                         while (k4 != 1);
  123.                         set = !set;
  124.                 }
  125.         }
  126.         if (k5 != 1)
  127.         {
  128.                 delay(5);
  129.                 if (k5 != 1)
  130.                 {
  131.                         while (k5 != 1)
  132.                                 //緊急車
  133.                                 key_to3();
  134.                 }
  135.         }
  136. }
  137. void display() //顯示子程序
  138. {
  139.         buf[1] = sec_dx / 10; //第1位 東西秒十位
  140.         buf[2] = sec_dx % 10; //第2位 東西秒個位
  141.         buf[3] = sec_nb / 10; //第3位 南北秒十位
  142.         buf[0] = sec_nb % 10; //第4位 南北秒個位               
  143.         P1 = 0xff;                                    // 初始燈為滅的
  144.         P0 = 0x00;
  145.         P1 = 0xfe;                                     //片選LCD1
  146.         P0 = table[buf[1]];
  147.         delay(1);
  148.         P1 = 0xff;
  149.         P0 = 0x00;
  150.         P1 = 0xfd;                              //片選LCD2
  151.         P0 = table[buf[2]];
  152.         delay(1);
  153.         P1 = 0xff;
  154.         P0 = 0x00;
  155.         P1 = 0Xfb;                  //片選LCD3
  156. P0 = table[buf[3]];
  157. delay(1);
  158. P1 = 0xff;
  159. P0 = 0x00;
  160. P1 = 0Xf7;
  161. P0 = table[buf[0]];                  //片選LCD4        
  162. delay(1);
  163. }
  164. void time0(void) interrupt 1 using 1  //定時中斷 定時器0 子程序
  165. {
  166.         Buzz = 1;
  167.         b++;
  168.         if (b == 20)                          // 定時器中斷次數
  169.         {
  170.                      Buzz = 0;
  171.                      b = 0;
  172.                      sec_dx--;
  173.                      sec_nb--;
  174.                      if (sec_nb <= 5 && time == 0)  //東西黃燈閃               
  175.                      {
  176.                              Green_dx = 0; Yellow_dx = !Yellow_dx;
  177.                      }
  178.                      if (sec_dx <= 5 && time == 1)  //南北黃燈閃               
  179.                      {
  180.                              Green_nb = 0; Yellow_nb = !Yellow_nb;
  181.                      }
  182.                      if (sec_dx == 0 && sec_nb == 5)
  183.                              sec_dx = 5;
  184.                      if (sec_nb == 0 && sec_dx == 5)
  185.                              sec_nb = 5;
  186.                      if (time == 0 && sec_nb == 0)
  187.                      {
  188. P2 = 0x99; time = !time; sec_nb = set_timenb; sec_dx = set_timenb + 5;
  189.                      }
  190.                      if (time == 1 && sec_dx == 0)
  191.                      {
  192. P2 = 0Xc3; time = !time; sec_dx = set_timedx; sec_nb = set_timedx + 5;
  193.                      }
  194.         }
  195. }
  196. void key_to1()        //鍵盤處理子程序之+
  197. {
  198.         TR0 = 0;               //關定時器        
  199.              if (set == 0)
  200.                 set_timenb++;    //南北加1S
  201.         else
  202.                 set_timedx++;    //東西加1S
  203.         if (set_timenb == 100)
  204.                 set_timenb = 1;
  205.         if (set_timedx == 100)
  206.                 set_timedx = 1;   //加到100置1
  207.         sec_nb = set_timenb;         //設置的數值賦給東西南北
  208.         sec_dx = set_timedx;
  209. }
  210. void key_to2()           //鍵盤處理子程序之-
  211. {
  212.         TR0 = 0;         //關定時器        
  213.             if (set == 0)
  214.                 set_timenb--;  //南北減1S
  215.         else
  216.                 set_timedx--;  //東西減1S
  217.             if (set_timenb == 0)
  218.                 set_timenb = 99;
  219.         if (set_timedx == 0)
  220.                 set_timedx = 99;   //減到1重置99
  221.         sec_nb = set_timenb;         //設置的數值賦給東西南北
  222.         sec_dx = set_timedx;
  223. }
  224. void key_to3()   //鍵盤處理之緊急車通行
  225. {
  226.         TR0 = 0;
  227.         P2 = 0Xc9;
  228.         sec_dx = 00;
  229.         sec_nb = 00;
  230.         Buzzer_Indicate = 1;
  231. }
  232. void int0(void) interrupt 0 using 1         //只允許東西通行 外部中斷0 INT
  233. {
  234.         TR0 = 0;
  235.         P2 = 0Xc3;
  236.         Buzzer_Indicate = 0;
  237.         sec_dx = 00;
  238.             sec_nb = 00;
  239. }

  240. void int1(void) interrupt 2 using 1                   //只允許南北通行 外部中斷1 INT
  241. {
  242.              TR0 = 0;
  243.         P2 = 0X99;        //控制紅綠燈
  244.         Buzzer_Indicate = 0;
  245.         sec_nb = 00;
  246.         sec_dx = 00;
  247. }
  248. void logo()//開機的Logo  "- - - -"
  249. {
  250.              for (n = 0; n < 50; n++)
  251.         {
  252.                 P0 = 0x40;
  253.                 P1 = 0xfe;
  254.                 delay(1);
  255.                 P1 = 0xfd;
  256.                 delay(1);
  257.                 P1 = 0Xfb;
  258.                 delay(1);
  259.                 P1 = 0Xf7;
  260.                 delay(1);
  261.                 P1 = 0xff;
  262.         }
  263. }
  264. void Buzzer()        //蜂鳴器
  265. {
  266.         if (Buzzer_Indicate == 1)
  267.                      Buzz = !Buzz;
  268.              else Buzz = 0;
  269. }
  270. void delay(int ms)                //延時子程序
  271. {
  272.         uint j, k;
  273.              for (j = 0; j < ms; j++)
  274.                      for (k = 0; k < 124; k++);
  275. }


復制代碼

完整的Word格式文檔51黑下載地址:
智能交通燈控制系統設計報告.docx (467.52 KB, 下載次數: 124)


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

使用道具 舉報

沙發
ID:425883 發表于 2018-11-25 22:44 | 只看該作者
請問一下,如果我想用c51單片機去給這個裝置,做一個檢測各個燈的狀態和目前某路燈還剩多少秒,應該怎么做。
回復

使用道具 舉報

板凳
ID:397699 發表于 2018-11-28 15:27 | 只看該作者
請問樓主可以發布一下proteus仿真圖嗎
回復

使用道具 舉報

地板
ID:870047 發表于 2020-12-29 11:00 | 只看該作者
請問 紅綠燈中間那個東西南北的圓盤 是哪個元器件啊




回復

使用道具 舉報

5#
ID:1106031 發表于 2023-12-28 14:45 | 只看該作者
你好, 請問樓主可以發布一下proteus仿真圖嗎
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日韩欧美在线播放 | 一区久久 | 久热精品在线观看视频 | 日韩在线中文字幕 | 综合二区 | 91五月婷蜜桃综合 | 久久亚洲一区二区三区四区 | a中文在线视频 | 欧美一级久久久猛烈a大片 日韩av免费在线观看 | 亚洲一区国产 | 激情一区 | 精品一区二区三区四区 | 国产成人网 | 亚洲天堂av在线 | 国产日韩精品久久 | 久久久久国产一区二区三区不卡 | 国产在线精品一区二区三区 | 亚洲综合五月天婷婷 | 国产在线播放av | 国产精品一区二区久久 | 尤物在线 | 亚洲精品一区在线观看 | 日韩毛片在线观看 | 亚洲天堂日韩精品 | 特黄视频 | 日韩在线国产 | 久久爆操 | 午夜精品久久久久久久星辰影院 | 久久视频精品在线 | 日韩中文av在线 | 男人av在线播放 | 中文字幕成人av | 国产精品1区2区3区 欧美 中文字幕 | 久久精品一区二区 | 久久er99热精品一区二区 | 亚洲精品福利在线 | 人人玩人人干 | 本道综合精品 | 99久久精品国产麻豆演员表 | 三级视频国产 | 久久久综合久久 |