基于89C52單片機的紅外遙控雙模式交通燈控制系統(tǒng)設(shè)計
引言
近年來,隨著經(jīng)濟的快速發(fā)展,城市中車輛不斷增多。由此引起交通擁擠、堵塞,交通事故頻發(fā)等一系列問題。交通燈是城市重要的交通指揮系統(tǒng),與人們的日常生活有十分密切的關(guān)系,它不僅關(guān)系到城市交通的有序進行,也影響到人們的出行便捷和安全。設(shè)計一個穩(wěn)定、靈活、便捷的交通燈控制系統(tǒng)具有必要性和現(xiàn)實性。然而現(xiàn)實生活中很多交通燈都是按照一個時間間隔切換。而本設(shè)計中交通燈可根據(jù)平時或上下班高峰期來轉(zhuǎn)換紅綠燈切換時間,如上下班高峰期紅燈轉(zhuǎn)換時間設(shè)置為40 秒,平時設(shè)置為60 秒。這樣可有效緩解在上下班時間,由于紅燈設(shè)置時間太長,為了趕時間而闖紅燈現(xiàn)象。同時,有效緩解交通堵塞現(xiàn)象。
1 交通管理方案的論證
1968 年,聯(lián)合國《道路交通和道路標志信號協(xié)定》對各種信號燈的含義作了規(guī)定:綠燈亮允許通行;紅燈亮,禁止通行;黃燈亮,提示人們注意紅,綠燈的狀態(tài)即將切換。為了方便說明,現(xiàn)假設(shè)東西,南北走向的兩干道相交于一處十字路口。同時,為了保證行人安全,設(shè)置A,B,C,D 四條人行道。如圖1 所示。
圖1. 路口指示燈示意圖
路口指示燈工作情況說明:當東西道為紅燈,此道車輛禁止通行,此時B,D 人行道上行人可通過馬路;同時南北道為綠燈,此道車輛通過,此時A,C 人行道上行人禁止通行,時間為60 秒。黃燈閃爍5 秒,警示車輛和行人紅,綠燈的狀態(tài)即將切換。當東西道為綠燈,此道車輛通行,此時B,D 人行道上行人禁止通過馬路;同時南北道為紅燈,此道車輛禁止通過,此時A,C 人行道上行人可通行,時間為60 秒。依此循環(huán),即可指引車輛有序行駛,行人安全通過馬路。
2 系統(tǒng)硬件電路的設(shè)計
2.1 系統(tǒng)電路總體概要
本設(shè)計主要由89C52 單片機、交通燈顯示模塊、紅外接收模塊、數(shù)碼管、按鍵等組成。
89C52 單片機為系統(tǒng)主控制器,控制其他模塊協(xié)調(diào)工作;按鍵和紅外接收模塊用來切換系統(tǒng)工作模式:正常模式或上下班高峰模式。即正常模式下,紅燈設(shè)置的時間為60 秒;上下班高峰模式下,紅燈設(shè)置的時間為40 秒。交通燈顯示模塊用以指引各路道車輛的通行,數(shù)碼管為了顯示交通紅綠燈所剩的切換時間,行人依此判斷是否有足夠時間過馬路,是走還是停。其主要框圖如圖2 所示。
圖 2. 系統(tǒng)設(shè)計總框圖
2.2 硬件電路的設(shè)計
2.2.1 控制器的選擇
作為交通智能控制的中心,控制器的選擇十分重要。我們常見的有:(1)現(xiàn)場可編程門陣列FPGA;(2)可編程邏輯控制器PLC;(3)51 系列單片機等。這是一種較為實用的系統(tǒng),所以要從價格和使用方面等因素綜合考慮。以上3 種控制器都可以很好的完成交通燈的智能控制,而FPGA和PLC 操作和完成簡單,但成本價格較高,性價比低。對于本設(shè)計,51 系列單片機完全可以實現(xiàn)其控制,且性能良好,價格低廉。因此選用大家所熟知的89C52單片機作為控制器。
2.2.2 紅外發(fā)射接收原理
圖3 紅外發(fā)射與接收原理圖
通用紅外遙控系統(tǒng)由發(fā)射和接收兩大部分組成,應(yīng)用編/解碼專用集成電路芯片來進行控制如圖3所示。紅外接收頭的工作原理:內(nèi)置接收管將紅外發(fā)射管發(fā)射出來的光信號轉(zhuǎn)換為微弱的電信號,此信號經(jīng)由IC內(nèi)部放大器進行放大,然后通過自動增益控制、帶通濾波、解調(diào)變、波形整形后還原為遙控器發(fā)射出來的原始編碼,經(jīng)由接收頭的信號輸出腳輸入到電器上的編碼識別電路。
2.2.3 硬件電路總圖
本設(shè)計選用 89C52單片機作為控制器,控制系統(tǒng)的正常運行。本系統(tǒng)有兩種運行模式,普通模式和上下班高峰模式??赏ㄟ^按鍵或紅外遙控對系統(tǒng)運行模式進行切換。按鍵切換適于值班人員使用,而紅外遙控切換適于交警巡查時使用,方便快捷?,F(xiàn)簡要介紹該系統(tǒng)工作原理:89C52 單片機通過鎖存器控制數(shù)碼管顯示紅綠燈時間,東西、南北四組數(shù)碼管時間顯示相同。P1^2~P1^7 控制交通燈的顯示。P1^2~P1^4 控制東西道兩組交通燈的顯示,這兩組紅綠燈通過單片機控制顯示相同顏色的指示燈并且切換時間相同;而P1^5~P1^7 控制南北道兩組交通燈的顯示,這兩組紅綠燈同樣通過單片機控制顯示相同顏色的指示燈并且切換時間相同。P3^5 接按鍵S1,通過此按鍵可控制系統(tǒng)運行模式。P3^2 接紅外接收模塊,通過此接口可紅外遙控切換系統(tǒng)運行模式。如圖4 所示:
圖4,硬件電路圖
到此,硬件電路搭建完成。
3 系統(tǒng)軟件的設(shè)計
近年來,單片機開發(fā)技術(shù)不斷發(fā)展,從普遍使用匯編語言到逐漸使用高級語言,單片機的開發(fā)軟件也在不斷發(fā)展,Keil 軟件是目前最流行開發(fā)MCS-51 系列單片機程序的軟件。
Keil 提供了包括C 編譯器、宏匯編、連接器、庫管理和一個功能強大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個集成開發(fā)環(huán)境(uVisON)將這些部分連在一起。
因此該系統(tǒng)的軟件部分在Keil 環(huán)境下進行程序的編程,下面主要介紹程序中的主要子程序和一些重要部分:
初始函數(shù)主要是對定時/計數(shù)器和一些參數(shù)初值的設(shè)定:
#include
#define uint unsigned int
#define uchar unsigned char
uint aa,num,MODEL1,numa,HMODE1;
uchar shi,ge,gtime,rtime;
… …
sbit dula=P1^0; // 段選
sbit wela=P1^1; // 位選
sbitLED1=P1^2; // 東西(紅燈)
sbit LED2=P1^5; // 南北(紅燈)
sbit LED3=P1^6; // 南北(黃燈)
sbit LED4=P1^3; // 東西(黃燈)
sbit LED5=P1^7; // 南北(綠燈)
sbit LED6=P1^4; // 東西(綠燈)
sbit KEY1=P3^5;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar table1[]={0xbf,0x7f};
void delay(uchar z) // 延時函數(shù)
{ uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--); }
void init()
{ TMOD=0x01; // 選擇方式一,16 位計數(shù)器
TH0=15536/256;
TL0=15536%256; // 定時器高、低位,置入初值
EA=1; // 中斷允許總控制位
ET0=1; // 定時器0 中斷允許控制位
TR0=1; // 定時器0 運行控制位
aa=0;
gtime=60;
rtime=40;
num=1;
numa=1;
MODEL1=1;
HMODE1=0;}
定時的函數(shù)及原理:
當單片機工作于定時狀態(tài)時,定時/計數(shù)器對機器周期進行計數(shù),每個機器周期包括12個振蕩周期,以晶振頻率為12MHz為例,則:
1 個機器周期=12/晶振頻率=12/12000000=0.001ms定時時間為:TC=XTP。其中,TP 為機器周期,TC 為定時時間。
則應(yīng)裝入計數(shù)/定時器的初值為:
(注:M=2n , TP 為機器周期,TC 為定時時間)
對于方式1,一次最大的定時時間為:T=(216-0)×0.001=65.536ms ,為了便于計算,設(shè)定每次最大定時時間為50ms,計算應(yīng)裝入的初值:N = 65536 ? 50000 = 15536
顯示子函數(shù):
通過單片機對鎖存器進行位選,段選的控制,使數(shù)碼管顯示需要的數(shù)字。
void display(shi,ge)
{ dula=1;
P0=table[shi];
dula=0;
wela=1;
P0=table1[0];
wela=0;
delay(5);
P0=0xff; // 對數(shù)碼管消影
dula=1;
P0=table[ge];
dula=0;
wela=1;
P0=table1[1];
wela=0;
delay(5);
P0=0xff;}
模式一函數(shù):
void mod1()
{ if(num==1&>ime>5) // 東西道紅燈亮,南北道綠燈亮,最后5 秒切換成黃燈
{LED5=0;
LED1=0; }
if(num==2) // 東西道綠燈亮,南北道紅燈亮
{ LED2=0;
LED6=0;
LED5=1;
LED3=1;
LED1=1; }
if(num==1&>ime==5) // 東西道紅燈亮,南北道黃燈亮5 秒
{ LED5=1;
LED2=1;
LED3=0; }
shi=gtime/10;
ge=gtime%10;
if(aa==20) // 50ms×20=1s, 即過1s 數(shù)碼管數(shù)字減1
{ aa=0;
gtime--; }
display(shi,ge);
if(gtime==0&&num!=2)
{ gtime=60;
num=2; }
if(gtime==0&&num==2)
{ num=1;
gtime=60;
LED2=1;
LED6=1; } }
模式二函數(shù):
如同模式一,只是參數(shù)有變化。如將gtime=60 換成rtime=40;num=1 換成numa=1;僅此而已。
主函數(shù):
void main()
{ init();
while(1)
/* 模式一,平常模式,紅綠燈切換