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

標題: C51單片機+MAX7219十字路口交通燈Proteus仿真程序設計 [打印本頁]

作者: wangmo    時間: 2020-4-28 10:32
標題: C51單片機+MAX7219十字路口交通燈Proteus仿真程序設計
設計要求: 用單片機控制LED模擬交通燈。東西向通行時間為80s,南北向通行時間為60s,緩沖時間為3s。
本項目為典型的LED顯示和中斷定時電路。利用定時器T0產生每10ms一次的中斷,每100次中斷為1s。對兩個方向分別顯示紅、綠、黃燈,并顯示相應的剩余時間。

本設計基于AT89C52單片機,可用單片機控制信號燈的狀態變化,基本可以指揮交通的基本通行。用單片機控制紅、黃、綠LED燈模擬指示,模擬東西方向的十字路口交通信號控制情況。東西向通行時間為80s,南北向通行時間為60s,緩沖時間為3s,并將時間倒計時輸出,方便行人的觀看。
本設計主要設計指標:
1.3 系統結構圖

圖1  系統結構圖

系統正常運行后,5V的穩壓源給MAX7219芯片、LED信號燈和單片機供電,通過單片機內部的定時器T0產生每10ms一次的中斷,每100次中斷為1s。所計的時間以秒為單位,通過MAX7219驅動七段顯示器倒計時輸出,計滿時間后產生中斷,中斷產生后信號燈發生相應的變化,以達到自動控制的目的。


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

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

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

3.2MAX7219驅動電路

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

圖4 MAX7219驅動電路

4  軟件設計

在硬件的基礎上對軟件進行設計,本程序由主程序,定時中斷子程序和顯示驅動子程序組成。主程序主要負責系統初始化和等待中斷,以及紅黃綠燈各種狀態判斷。定時中斷子程序主要負責各個狀態的定時要求,以及狀態的跳轉。顯示驅動子程序負責倒計時時間的顯示。

根據系統軟件設計要求將軟件劃分為:延時模塊,狀態判斷模塊,中斷服務模塊,驅動顯示模塊。
4.1 主程序
主程序完成MAX7219的初始化,定時器的初始化,狀態燈的初始化并進行狀態的判斷。



圖 5  程序流程圖
進入主程序后,先初始化并開啟定時器1和MAX7219芯片,再裝入初始狀態和初始值,然后等待中斷響應。根據收到的中斷響應,主程序依次判斷。首先南北綠燈亮,東西紅燈亮,倒計時60S;定時結束后,由中斷跳轉到下一個狀態,再東西南北黃燈亮,倒計時3S;定時結束后,由中斷跳轉到下一個狀態,東西綠燈亮,南北紅燈亮,倒計時80S;定時結束后,再由中斷跳轉到下一個狀態,東西南北黃燈亮,倒計時3S。依次循環執行。

主要(關鍵)代碼:
  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;                                          //關閉南北綠燈,東西紅燈
  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++)              //循環三次進行延時閃爍
  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. }
復制代碼


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

圖 6  定時中斷子程序流程圖
設置通行時間,并利用定時器進行倒計時,其中狀態一60S,其中狀態二3S,其中狀態三80S,其中狀態四3S。
關鍵代碼介紹:
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語句對計時是否完畢進行判斷,如計時完畢,執行if中的內容。
4.2 MAX7219驅動程序
      MAX7219采用串行尋址方式,在傳送的串行數據中包含內部RAM的地址。加在DIN腳上的串行數據,必須在LOAD信號為高電平的前提下,以每個字節為一個數據包,在CLK信號上升沿移入16位的移位寄存器。然后在LOAD信號的上升沿鎖存進數字或控制寄存器中。LOAD信號必須在第16個CLK信號上升沿的同時,或在下一個CLK信號上升沿之前升高,否則,數據會丟失。DIN腳上的串行數據在16.5個CLK信號后出現在DOUT腳上,以便級聯應用時傳到下一個MAX7219上。
圖 7   數據串行傳送時序圖

關鍵代碼介紹:
  1. void MAX_write(uchar ch)                            //以8位一個字節進行寫值

  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的數據寫入到7219

  12.     }

  13. }

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

  15. {

  16.     LOAD = 0;        

  17.               _nop_();

  18.     MAX_write(addr);

  19.               _nop_();

  20.     MAX_write(num);

  21.               _nop_();

  22.     LOAD = 1;                                                    //鎖存

  23. }                     
復制代碼

系統測試

5.1 倒計時狀態測試
由Proteus仿真軟件進行系統測試。

                                                                                                                  圖8  60S、80S計時
結論:單片機內部定時器能夠進行定時。
5.2 紅綠燈狀態測試
由Proteus仿真軟件進行系統測試。
表1  紅綠燈狀態測試

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

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



6  總結以及展望

本設計實現設計要求。

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


圖9  系統原理圖

本系統的PCB版圖為雙重布線。
圖10  系統PCB圖


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

作者: dong12    時間: 2020-5-15 00:02
不錯的程序




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1