找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

C51單片機(jī)+MAX7219十字路口交通燈Proteus仿真程序設(shè)計

[復(fù)制鏈接]
ID:739534 發(fā)表于 2020-4-28 10:32 | 顯示全部樓層 |閱讀模式
設(shè)計要求: 用單片機(jī)控制LED模擬交通燈。東西向通行時間為80s,南北向通行時間為60s,緩沖時間為3s。
本項目為典型的LED顯示和中斷定時電路。利用定時器T0產(chǎn)生每10ms一次的中斷,每100次中斷為1s。對兩個方向分別顯示紅、綠、黃燈,并顯示相應(yīng)的剩余時間。

本設(shè)計基于AT89C52單片機(jī),可用單片機(jī)控制信號燈的狀態(tài)變化,基本可以指揮交通的基本通行。用單片機(jī)控制紅、黃、綠LED燈模擬指示,模擬東西方向的十字路口交通信號控制情況。東西向通行時間為80s,南北向通行時間為60s,緩沖時間為3s,并將時間倒計時輸出,方便行人的觀看。
本設(shè)計主要設(shè)計指標(biāo):
  • 紅綠燈狀態(tài)提示模塊。
  • T0定時器模塊,實現(xiàn)三種時間的定時。
  • 驅(qū)動顯示模塊,利用MAX7219驅(qū)動數(shù)碼管的顯示倒計時。
1.3 系統(tǒng)結(jié)構(gòu)圖

圖1  系統(tǒng)結(jié)構(gòu)圖

系統(tǒng)正常運行后,5V的穩(wěn)壓源給MAX7219芯片、LED信號燈和單片機(jī)供電,通過單片機(jī)內(nèi)部的定時器T0產(chǎn)生每10ms一次的中斷,每100次中斷為1s。所計的時間以秒為單位,通過MAX7219驅(qū)動七段顯示器倒計時輸出,計滿時間后產(chǎn)生中斷,中斷產(chǎn)生后信號燈發(fā)生相應(yīng)的變化,以達(dá)到自動控制的目的。


2  理論分析與計算
定時器初值的計算,并掌握十進(jìn)制到十六進(jìn)制的轉(zhuǎn)化。在進(jìn)行通行時間上的控制時應(yīng)注意生活中的常識。
2.1 定時器初值的計算
通過單片機(jī)內(nèi)部的定時器T0產(chǎn)生每10ms一次的中斷,每100次中斷為1s。在本設(shè)計中所用的晶振為12MHZ,定時器              T0為工作方式一。其中初值為X,定時間為m us。

                 (1)
計算可得,定時m=10ms=10000us時,X=55536,轉(zhuǎn)化為十六進(jìn)制,X=D8F0H。即寫入定時器的初值TH0=0xD8,TL0=0xF0。
2.2 通行時間的計算
A方向紅燈時間=B方向綠燈時間+黃燈緩沖時間              (2)
3  硬件設(shè)計
  根據(jù)系統(tǒng)結(jié)構(gòu)圖,系統(tǒng)由MAX7219驅(qū)動電路、顯示電路、晶振電路、復(fù)位電路、單片機(jī)供電電路、單片機(jī)電路組成。
3.1顯示電路
通過該電路, 行人可以清楚的看見各路口狀態(tài)燈的亮滅情況,判斷是否通行。同時,數(shù)碼管顯示剩下通行的時間,提示行人。
數(shù)碼管顯示方面,東西南北各個方向分別用兩位7段數(shù)碼管,南北方向接DIG0、DIG1,東西方向接DIG2、DIG3,進(jìn)行位選控制,如圖2。
         
圖2 顯示電路1
紅綠燈采用三個共陽二極管作為指示燈,南北、東西方向各個一組,分別對應(yīng)數(shù)碼管的倒計時。東西方向接單片機(jī)的P1^0 , P1^1 , P1^2口,南北方向接單片機(jī)的P0^0 , P0^1 , P0^2口,如圖3。
圖3 顯示電路2

首先東西方向通行時間為80s,東西綠燈亮,南北紅燈亮。時間到后,東西南北黃燈亮3s。然后南北方向通行時間為60s,南北綠燈亮,東西紅燈亮。時間到后3s,東西南北黃燈亮3s。

3.2MAX7219驅(qū)動電路

采用專用數(shù)碼管顯示控制芯片MAX7219。MAX7219是美國MAXI生產(chǎn)的串行輸入/輸出共陰極顯示驅(qū)動器,該芯片最多可驅(qū)動8位7段數(shù)字LED顯示器或多個LED和條形圖顯示器。   

圖4 MAX7219驅(qū)動電路

4  軟件設(shè)計

在硬件的基礎(chǔ)上對軟件進(jìn)行設(shè)計,本程序由主程序,定時中斷子程序和顯示驅(qū)動子程序組成。主程序主要負(fù)責(zé)系統(tǒng)初始化和等待中斷,以及紅黃綠燈各種狀態(tài)判斷。定時中斷子程序主要負(fù)責(zé)各個狀態(tài)的定時要求,以及狀態(tài)的跳轉(zhuǎn)。顯示驅(qū)動子程序負(fù)責(zé)倒計時時間的顯示。

根據(jù)系統(tǒng)軟件設(shè)計要求將軟件劃分為:延時模塊,狀態(tài)判斷模塊,中斷服務(wù)模塊,驅(qū)動顯示模塊。
4.1 主程序
主程序完成MAX7219的初始化,定時器的初始化,狀態(tài)燈的初始化并進(jìn)行狀態(tài)的判斷。



圖 5  程序流程圖
進(jìn)入主程序后,先初始化并開啟定時器1和MAX7219芯片,再裝入初始狀態(tài)和初始值,然后等待中斷響應(yīng)。根據(jù)收到的中斷響應(yīng),主程序依次判斷。首先南北綠燈亮,東西紅燈亮,倒計時60S;定時結(jié)束后,由中斷跳轉(zhuǎn)到下一個狀態(tài),再東西南北黃燈亮,倒計時3S;定時結(jié)束后,由中斷跳轉(zhuǎn)到下一個狀態(tài),東西綠燈亮,南北紅燈亮,倒計時80S;定時結(jié)束后,再由中斷跳轉(zhuǎn)到下一個狀態(tài),東西南北黃燈亮,倒計時3S。依次循環(huán)執(zhí)行。

主要(關(guān)鍵)代碼:
  1. void main()
  2. {
  3.               T0_init();
  4.               MAX7219_init();
  5.               EA=1;
  6.               NS=60;                                                                                                                                               //初始南北通行60秒
  7.               EW=63;                                                                                                                  
  8.    R2=0,G1=0;                                                                                                       //南北綠燈亮,東西紅燈亮
  9. while (1)
  10.         {
  11.                             uint k;
  12.                             display();      
  13.       switch(i)
  14.                {
  15.               case 1:               R2=1,G1=1;                                          //關(guān)閉南北綠燈,東西紅燈
  16.                                                                                                     Y1=0,Y2=0;                                          //黃燈閃爍
  17.                       for(k=0;k<3;k++)
  18.                         {
  19.                               Y1=~Y1;
  20.                                                                                                                                 Y2=~Y2;
  21.                               delay(10000);
  22.                            }      
  23.                                   break;
  24.               case 2: G2=0,R1=0;                                          //東西綠燈亮,南北紅燈亮
  25.                                                                               break;
  26.               case 3: G2=1,R1=1;
  27.                                                                                            Y1=0,Y2=0;                                          //黃燈閃爍
  28.                       for(k=0;k<3;k++)              //循環(huán)三次進(jìn)行延時閃爍
  29.                         {
  30.                               Y1=~Y1;
  31.                                                                                                                                 Y2=~Y2;
  32.                               delay(10000);
  33.                             }
  34.                                   break;
  35.               case 4: R2=0,G1=0;                                           //東西紅燈亮,南北綠燈亮
  36.                                                                     break;
  37.              }                       
  38.          }
  39. }
復(fù)制代碼


此段程序是對狀態(tài)的判斷,利用switch()....case語句對狀態(tài)進(jìn)行判斷。
4.2 定時中斷子程序
定時器子程序是進(jìn)行時間的設(shè)定,并實現(xiàn)狀態(tài)的自動跳轉(zhuǎn)。跳轉(zhuǎn)過后產(chǎn)生的中斷送入主程序進(jìn)行判斷并輸出。

圖 6  定時中斷子程序流程圖
設(shè)置通行時間,并利用定時器進(jìn)行倒計時,其中狀態(tài)一60S,其中狀態(tài)二3S,其中狀態(tài)三80S,其中狀態(tài)四3S。
關(guān)鍵代碼介紹:
void T0_(void)interrupt 1
{
  temp++;
  TH0=0XD8;
  TL0=0XF0;
  if(temp==100)
    {
      temp=0;
      NS--;
      EW--;
          if((NS==0)&&(EW==3))
         {
          NS=3;
          EW=3;
          i=1;
         }
      if((NS==0)&&(EW==0)&&(i==1))
         {
          NS=83;
          EW=80;
          i=2;
         }
     if((NS==3)&&(EW==0))
         {
          NS=3;
          EW=3;
          i=3;
         }
     if((NS==0)&&(EW==0)&&(i==3))
         {
          NS=60;
          EW=63;
          i=4;
         }
              }
              display();
}
利用if語句對計時是否完畢進(jìn)行判斷,如計時完畢,執(zhí)行if中的內(nèi)容。
4.2 MAX7219驅(qū)動程序
      MAX7219采用串行尋址方式,在傳送的串行數(shù)據(jù)中包含內(nèi)部RAM的地址。加在DIN腳上的串行數(shù)據(jù),必須在LOAD信號為高電平的前提下,以每個字節(jié)為一個數(shù)據(jù)包,在CLK信號上升沿移入16位的移位寄存器。然后在LOAD信號的上升沿鎖存進(jìn)數(shù)字或控制寄存器中。LOAD信號必須在第16個CLK信號上升沿的同時,或在下一個CLK信號上升沿之前升高,否則,數(shù)據(jù)會丟失。DIN腳上的串行數(shù)據(jù)在16.5個CLK信號后出現(xiàn)在DOUT腳上,以便級聯(lián)應(yīng)用時傳到下一個MAX7219上。
圖 7   數(shù)據(jù)串行傳送時序圖

關(guān)鍵代碼介紹:
  1. void MAX_write(uchar ch)                            //以8位一個字節(jié)進(jìn)行寫值

  2. {

  3.               uchar j,ads;

  4.     for(j=0;j<8;j++)                                             //8位

  5.               {

  6.       ads=ch&0x80;                                   //取最高位

  7.       CLK = 0;                             //時鐘線置低

  8.       if(ads)  DIN = 1;

  9.       else      DIN = 0;

  10.       ch=ch<<1;                               //左移一位

  11.       CLK=1;                                                            //上升沿,DIN的數(shù)據(jù)寫入到7219

  12.     }

  13. }

  14. void MAX7219(uchar addr, uchar num)                            //寫地址,寫數(shù)據(jù)

  15. {

  16.     LOAD = 0;        

  17.               _nop_();

  18.     MAX_write(addr);

  19.               _nop_();

  20.     MAX_write(num);

  21.               _nop_();

  22.     LOAD = 1;                                                    //鎖存

  23. }                     
復(fù)制代碼

系統(tǒng)測試

5.1 倒計時狀態(tài)測試
由Proteus仿真軟件進(jìn)行系統(tǒng)測試。

                                                                                                                  圖8  60S、80S計時
結(jié)論:單片機(jī)內(nèi)部定時器能夠進(jìn)行定時。
5.2 紅綠燈狀態(tài)測試
由Proteus仿真軟件進(jìn)行系統(tǒng)測試。
表1  紅綠燈狀態(tài)測試

60S
3S
80S
3S
東西方向
紅燈亮
黃燈閃爍
綠燈亮
黃燈閃爍
南北方向
綠燈亮
黃燈閃爍
紅燈亮
黃燈閃爍

結(jié)論:每個狀態(tài)能夠正常的跳轉(zhuǎn)。
5.3 系統(tǒng)聯(lián)機(jī)測試
1、接硬件圖接線,為了確保東西南北紅黃綠燈能夠?qū)?yīng)顯示,實驗時,對P1口的接線做了調(diào)整。即,P1.0接G2綠燈,P1.1接Y2黃燈,P1.2接R2紅燈,P0.1接G1綠燈,P0.2接Y1黃燈,P0.3接R1紅燈。
2、從第一個狀態(tài)開始連續(xù)運行,觀察六個LED燈是否與交通顯示情況對應(yīng),如果有偏差,則單步運行或斷點運行,進(jìn)行調(diào)試,直至滿足設(shè)計要求。
3、調(diào)試完燈的顯示后,從第一個狀態(tài)開始連續(xù)運行,觀察數(shù)碼管顯示的是否正常,如果不正常,則運用單步運行或斷點運行進(jìn)行分析和調(diào)試,直至滿足要求。
4、整體運行,觀察燈顯示和時間顯示是否都符合要求,如果不符合,則再調(diào)試。直至滿足要求



6  總結(jié)以及展望

本設(shè)計實現(xiàn)設(shè)計要求。

本設(shè)計在實現(xiàn)相應(yīng)功能的時候主要是考慮到現(xiàn)有的條件,采用成熟度高的STC89C52作為CPU的解決方案,同時用LED燈和雙位數(shù)碼管作為顯示模塊,軟件則使用了移植性好的C語言。從功能需求上來看,已經(jīng)能夠滿足簡單的應(yīng)用需要。
在設(shè)計過程中,從開始設(shè)計該系統(tǒng)的功能,到方案的論證,再到最后的調(diào)試,每一步都顯得是那么的重要,在這個過程中學(xué)習(xí)到了比這次設(shè)計本身更多的知識,除此之外,在這次設(shè)計中也奠定了我對一個工業(yè)產(chǎn)品設(shè)計的思維,收獲頗豐。
展望,由于時間有限,本設(shè)計還需要做很多的改進(jìn)才能作為產(chǎn)品進(jìn)入市場,如:在對單片機(jī)供電方案中可以改為更簡單的電容降壓電路;在狀態(tài)的多樣性方面還很單一,可以增加一些更加符合實際情況的狀態(tài),如彎道時的狀態(tài)、擁堵時的狀態(tài)、應(yīng)急狀態(tài);在PCB元器件布局還可以更科學(xué)使線的寬度做的更寬等元器件選擇方面的問題,使其能夠通過一些標(biāo)準(zhǔn)。

  • 系統(tǒng)原理圖

圖9  系統(tǒng)原理圖

  • 系統(tǒng)PCB版圖
本系統(tǒng)的PCB版圖為雙重布線。
圖10  系統(tǒng)PCB圖
51hei.png

全部資料51hei下載地址:
通信交通燈.7z (981.18 KB, 下載次數(shù): 121)

評分

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

查看全部評分

回復(fù)

使用道具 舉報

ID:479983 發(fā)表于 2020-5-15 00:02 | 顯示全部樓層
不錯的程序
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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