第一篇:基于單片機的交通燈設(shè)計
基于單片機的交通燈設(shè)計
設(shè)計程序:
#include
//共陽極
uchar
code table1[5]={0xf3,0xf5,0xde,0xee,0xf6};/*各種狀態(tài)下紅綠燈段選碼, 狀態(tài)1:A綠燈,B紅燈;狀態(tài)2:A黃燈亮,B紅燈;狀態(tài)3:A紅燈,B綠燈;狀態(tài)4:A紅燈,B黃燈亮;狀態(tài)5:A紅燈,B紅燈;*/ uchar
code tab[4]={0x1E,0x2D,0x4E,0x8D};//數(shù)碼管顯示位選碼 sbit key1=P1^0;//放行A sbit key2=P1^1;//放行B sbit key3=P1^2;//禁止通行
uchar EW=40,SN=30,K1_T=15,K2_T=15,K3_T=20;//初始化交通燈時間 uchar count;//計時中斷次數(shù) uchar i,j;//循環(huán)控制變量 char Timer;//子程序說明語句 void Process();void Display(uchar j);void Delay(uchar a);/**************************主程序**************************/ main(){ IP=0X02;//設(shè)置定時器中斷為高優(yōu)先級//成為中斷嵌套
TMOD=0x01;//定時器工作方式
TH0=0x3C;//定時器初始化
TL0=0xB0;IT0=1;//中斷觸發(fā)方式為下降沿觸發(fā)
EA=1;//CPU開中斷
ET0=1;//開定時中斷
TR0=1;//啟動定時
EX0=1;//啟動外部中斷0 while(1)
{
Process();
} } /*************************交通燈顯示子程序*************************/ void Display(uchar j)//j控制顯示table中連續(xù)位的起始點 {
char h,l;
h=Timer/10;//EW通行時間十位
l=Timer%10;//EW通行時間個位
for(i=0;i<4;)//按位顯示通行狀況及時間 {
P0=table1[j];//通行狀況顯示
P3=tab[i];//位選顯示
i++;
//j++;
if(i%2)//兩位計時顯示
{
P2=table[l];
Delay(400);
}
else
{
P2=table[h];
Delay(400);
} } Delay(5);
//設(shè)置掃描時間
} /*********鍵控*******/ void Keyboard()interrupt 0 using 0 {
if(key1==0)
{ Timer=K1_T;
while(Timer>0)
{
j=0;
Display(0);
//顯示一次
}
if(key2==0)
{
Timer=K2_T;
while(Timer>0)
{
j=2;
Display(j);
}
if(key3==0)
{
Timer=K3_T;
while(Timer>0)
{
j=4;
Display(j);
}
} } /**************************延時子程序**************************/ void Delay(uchar a)//循環(huán)a次 { uchar x;x=a;while(x--){;} }
/************************TO計時中斷服務(wù)程序************************/ void timer0(void)interrupt 1 using 1//T0中斷 { TH0=0x3C;TL0=0xB0;//定時計數(shù)初值
count++;//中斷溢出一次count+1 if(count==20){
Timer--;
count=0;//中斷次計數(shù),count回,倒計時時間
} } /**************************亮燈控制**************************/ void Process(){ Timer=EW;//初始化方向通行時間
while(Timer>3)//狀態(tài):A綠燈,B紅燈;{
j=0;
Display(j);//調(diào)用顯示函數(shù)
} while(Timer>0)//狀態(tài):A黃燈亮,B紅燈;{
j=1;
Display(j);
} Timer=SN;while(Timer>3)//狀態(tài):A紅燈,B綠燈;{
j=2;
Display(j);} while(Timer>0)//狀態(tài):A紅燈,B黃燈亮;{
j=3;
Display(j);
}
}
電路圖如下:
第二篇:交通燈單片機課程設(shè)計
《單片機原理與接口技術(shù)課程設(shè)計報告》
課題:以交通燈為主的多功能任務(wù)設(shè)計
班級 學號 學生姓名
指導教師
淮陰工學院 電子與電氣工程學院
2015-6 1
目錄
一、課程設(shè)計目的......................................................................................................3
二、設(shè)計要求..............................................................................................................3 1. 總體要求........................................................................................................3 2. 具體要求........................................................................................................3 3. 系統(tǒng)硬件總框圖............................................................................................4 1)AT89C52單片機.......................................................................................5 3)數(shù)碼管顯示電路........................................................................................6 4)LED燈顯示...............................................................................................7 5)鍵盤掃描模塊............................................................................................7 6)蜂鳴器電路................................................................................................8
三、硬件電路的設(shè)計及描述......................................................................................8 1. 硬件總框圖及原理圖....................................................................................8 2. 主程序流程圖..............................................................................................10 3. 各模塊流程圖..............................................................................................11 1)時間顯示程序流程圖..............................................................................12 2)流水燈程序流程圖..................................................................................12 3)利用蜂鳴器的音樂流程圖......................................................................13 4)交通燈控制..............................................................................................13
四、源程序代碼........................................................................................................14
六、調(diào)試情況
六、設(shè)計心得............................................................................................................20
七、參考文獻............................................................................................................20
一、設(shè)計目的
《單片機原理及應(yīng)用》課程設(shè)計是一項重要的實踐性教育環(huán)節(jié),是學生在校期間必須接受的一項工程訓練。在課程設(shè)計過程中,在教師指導下,應(yīng)用工程的方法,通過一個簡單課題的設(shè)計練習,可使學生初步體驗單片機應(yīng)用系統(tǒng)的設(shè)計過程、設(shè)計要求、完成的工作內(nèi)容和具體的設(shè)計方法,了解必須提交的各項工程文件,也達到鞏固、充實和綜合運用所學知識解決實際問題的目的。
通過課程設(shè)計,應(yīng)該能加強學生如下能力的培養(yǎng):(1)獨立工作能力和創(chuàng)造力;
(2)綜合運用專業(yè)及基礎(chǔ)知識,解決實際工程技術(shù)問題的能力;(3)查閱圖書資料、產(chǎn)品手冊和各種工具書的能力;(4)工程繪圖的能力;
(5)編寫技術(shù)報告和編寫技術(shù)資料的能力。
二、設(shè)計要求
1.總體要求
(1)獨立完成設(shè)計任務(wù)(2)繪制系統(tǒng)硬件總框圖(3)繪制系統(tǒng)原理電路圖
(4)制定編寫設(shè)計方案,編制軟件框圖,完成詳細完整的程序清單和注釋(5)制定編寫調(diào)試方案,編寫用戶操作使用說明書
(6)寫出設(shè)計工作小結(jié)。對在完成以上文件過程所進行的有關(guān)步驟如設(shè)計思想、指標論證、方案確定、參數(shù)計算、元器件選擇、原理分析等作出說明,并對所完成的設(shè)計作出評價,對自己整個設(shè)計工作中經(jīng)驗教訓,總結(jié)收獲和今后研究方向。
2.具體要求
本次工程實踐的校內(nèi)部分主要以單片機為基礎(chǔ),進行單片機軟件編程,目的 3 是為了提高學生的軟件編程和系統(tǒng)設(shè)計能力,整個設(shè)計系統(tǒng)包括兩個部分,硬件及軟件部分,硬件部分已經(jīng)制作成功,學生只需要掌握其原理和焊接相應(yīng)的元器件,掌握元器件的辨別和元器件的作用以及應(yīng)用場所即可,另外對所焊接的電路還需要進行仔細的檢查,判斷是否有焊接錯誤的地方或者短路的地方,對出現(xiàn)的異常情況要能夠根據(jù)現(xiàn)象判別原因,并具備解決問題的能力,從而切實提高學生的硬件電子電路的分析、判斷能力。
軟件編程是本次課程設(shè)計的重要環(huán)節(jié)。在為期兩周的工程實踐中,將占據(jù)主要時間,完成的軟件編程任務(wù)主要包括以下幾點:
1)、熟悉Keil C51編程平臺及相關(guān)編程軟件
2)、編寫、調(diào)試蜂鳴器、繼電器動作、方波程序并進行軟硬件聯(lián)調(diào) 3)、編寫、調(diào)試LED流水燈(循環(huán)顯示)程序并進行軟硬件聯(lián)調(diào) 4)、編寫、調(diào)試鍵盤掃描子程序并進行軟硬件聯(lián)調(diào) 5)、編寫、調(diào)試數(shù)碼管動態(tài)掃描程序并進行軟硬件聯(lián)調(diào) 6)、基于交通燈的多功能控制設(shè)計
其中前五個內(nèi)容是后兩個內(nèi)容的基礎(chǔ),主要是編制一些子程序,為后繼的整個系統(tǒng)設(shè)計打下基礎(chǔ)。交通燈控制是在五個課題中選做的一個設(shè)計,是一個簡單的單片機編程設(shè)計,來實現(xiàn)智能交通燈的多功能作用。
3.系統(tǒng)硬件總框圖
圖1 系統(tǒng)設(shè)計總框圖
此次課程設(shè)計,AT89C52是一種帶2K字節(jié)閃爍可編程可擦除只讀存儲器(FPEROM—Falsh Programmable and Erasable Read Only Memory)的低電壓,高性能CMOS 8位微處理器,俗稱單片機。1)AT89C52單片機
設(shè)計中所用的單片機型號為AT89C52,其主要功能為:
AT89C52是低功耗、高性能的CMOS 8位單片機。片內(nèi)帶有8KB的Flash存儲器,且允許在系統(tǒng)內(nèi)改寫或用編程器編程。另外,AT89C52的指令系統(tǒng)和引腳與80C52完全兼容,所以,近幾年AT89C52單片機應(yīng)用極為廣泛。
AT89C52單片機除了含有8KB的Flash存儲器外,片內(nèi)還有256 B的RAM,32條I/O口線,3個16位定時/計算器、6個中斷源、1個全雙工串行口等。同時,與80C52一樣,有空閑和掉電兩種節(jié)電運行方式。
AT89C52引腳如下圖所示:
圖2 AT89C52引腳
AT89C52單片機為40腳雙列直插封裝的8 位通用微處理器,采用工業(yè)標準的C51內(nèi)核,在內(nèi)部功能及管腳排布上與通用的8xc52 相同,其主要用于會聚調(diào)整時的功能控制。功能包括對會聚主IC 內(nèi)部寄存器、數(shù)據(jù)RAM及外部接口等功能部件的初始化,會聚調(diào)整控制,會聚測試圖控制,紅外遙控信號IR的接收解碼及與主板CPU通信等。
2)DS1302模塊
DS1302的RST是復位/片選線,通過把RST輸入驅(qū)動置高電平來啟動所有的數(shù)據(jù)傳送。當RST為高電平時,所有的數(shù)據(jù)傳送被初始化,允許對DS1302進行操作。如果在傳送過程中RST置為低電平,則會終止此次數(shù)據(jù)傳送,I/O引腳變?yōu)楦咦钁B(tài)。
其管腳圖如下:
圖3 DS1302管腳圖
各引腳功能:Vcc1為后備電源,VCC2為主電源,X1和X2是振蕩源,SCLK為輸入端
RST輸入有兩種功能:首先,RST接通控制邏輯,允許地址/命令序列送入移位寄存器;其次,RST提供終止單字節(jié)或多字節(jié)數(shù)據(jù)的傳送手段。
3)數(shù)碼管顯示電路
圖4 數(shù)碼管顯示電路
設(shè)計中采用六位共陰極數(shù)碼管,通過單片機STC89C52的P0口控制其位選和段選,以達到動態(tài)顯示相應(yīng)數(shù)值的效果。在其位選控制部分,采用了一個9012型三極管,要求當P0口輸出低電平時,位選成功。
所謂動態(tài)掃描就是指我們采用分時的方法,輪流控制各個顯示器的COM端,6 使各個顯示器輪流點亮。在輪流點亮掃描過程中,每位顯示器的點亮時間是極為短暫的(約1ms),但由于人的視覺暫留現(xiàn)象及發(fā)光二極管的余輝效應(yīng),盡管實際上各位顯示器并非同時點亮,但只要掃描的速度足夠快,給人的印象就是一組穩(wěn)定的顯示數(shù)據(jù),不會有閃爍感。
4)LED燈顯示
圖5 LED顯示模塊
本次課程設(shè)計中,“程序語言”通過“翻譯”軟件“翻譯”成單片機所需的二進制代碼,單片機可工作。要用外加電源和分壓電阻來控制低電平驅(qū)動點亮,因為單片機不能直接高電平驅(qū)動LED燈。如圖D1-D8和R1、R2以及R6-R11連接到單片機IO口,當P1口某腳變低時相應(yīng)LED發(fā)光。實現(xiàn)LED燈的閃爍,只需利用編程方法依次從低位到高位逐個變?yōu)榈碗娖?,等待少許時刻再變高即可。
5)鍵盤掃描模塊
圖6 按鍵輸入電路
本模塊四個開關(guān)分別用于控制流水燈控制電路,時間顯示電路,音樂蜂鳴器電路,交通燈四部分功能。當按下其中一個開關(guān)時,該部分電路導通,給單片機 發(fā)出地址信號,實現(xiàn)其中一項功能的運做,如圖4所示。
KEYA鍵:其功能是當該鍵按下時,蜂鳴器程序工作; KEYB鍵:其功能是當該鍵按下時,流水燈程序工作;
KEYC鍵:其功能是當該鍵按下時,數(shù)碼管動態(tài)掃描程序工作; KEYD鍵:其功能是當該鍵按下時,交通燈程序工作。
6)蜂鳴器電
圖7 蜂鳴器電路
路
蜂鳴器單元電路是通過一個PNP三極管來放大驅(qū)動蜂鳴器,蜂鳴器的正極接到+5V電源上面,蜂鳴器的負極接到三極管的發(fā)射極,三極管的基極經(jīng)過限流電阻后由單片機的P3.4控制。
當輸出高電平時,三極管截止,蜂鳴器的兩引腳間的直流電壓接近于0V,沒有電流流過線圈,蜂鳴器不發(fā)聲;當輸出低電平時,三極管導通,使蜂鳴器的兩個引腳間獲得將接近+5V的直流電壓,這樣蜂鳴器的電流形成回路,發(fā)出聲音。因此,我們可以通過程序控制IO口輸出的電平來控制蜂鳴器是否發(fā)出聲音,實現(xiàn)各種可能音響的產(chǎn)生。
三、硬件電路的設(shè)計及描述
1.硬件總框圖及原理圖
圖8 硬件總框圖
圖9 硬件總原理圖
2.主程序流程圖
3.各模塊流程圖 1)時間顯示程序流程圖
2)流水燈程序流程圖
3)利用蜂鳴器的音樂流程圖
4)智能交通燈
四、源程序代碼
/******************************************************************** * 文件名
: 4個功能由按鍵控制.c * 描
述
: 按下A鍵,實現(xiàn)蜂鳴器動作。
按下B鍵,實現(xiàn)LED流水燈循環(huán)顯示。
按下C鍵,實現(xiàn)數(shù)碼管動態(tài)掃描顯示。
按下D鍵,實現(xiàn)交通燈功能。* 創(chuàng)建人
:
***********************************************************************/ #include
#define uint unsigned int
// 無符號整形習慣的定義
#define uchar unsigned char
//無符號字符型習慣的定義 void buzz_key(void);
//子函數(shù)聲明 void led_key(void);void tube_key(void);void traffic(void);unsigned char code duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 0 1 2 3 4 5 6 7 8 9
unsigned char code weima[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
// 選擇哪個數(shù)碼管
unsigned char temp[6];uchar i=35;uchar k=30;uchar l=5;uchar j;uchar b;
//定義變量
sbit duan=P2^6;//定義管腳 sbit wei=P2^7;sbit key_A=P3^4;sbit key_B=P3^5;sbit key_C=P3^6;sbit key_D=P3^7;sbit buzz=P2^3;sbit DIOLA=P2^5;sbit csda=P3^2;sbit red=P1^0;//交通燈管腳定義 sbit green=P1^1;sbit yellow=P1^2;/******************************************************************** * 名稱 : Delay_1ms()* 功能 : 延時子程序,延時時間為 1ms * x * 輸入 : x(延時一毫秒的個數(shù))* 輸出 : 無
***********************************************************************/
void Delay_1ms(unsigned int t){ unsigned char x,y;for(x=t;x>0;x--)for(y=110;y>0;y--);
}
/******************************************************************** * 名稱 : Main()* 功能 : 實現(xiàn)蜂鳴器,流水燈,數(shù)碼管,交通燈
***********************************************************************/ void main(){
DIOLA=0;//流水燈鎖存器關(guān) 流水燈未選通
wei=0;//位選關(guān)
duan=1;
P0=0;
duan=0;
csda=0;
while(1){
if(key_A==0 || key_B==0 || key_C==0|| key_D==0)
{
if(key_A==0)
//A鍵按下
{
buzz_key();
//調(diào)用蜂鳴器子程序
}
else if(key_B==0)//B鍵按下
{
led_key();
//調(diào)用流水燈子程序
}
else if(key_C==0)//C鍵按下時
{
tube_key();//調(diào)用數(shù)碼管顯示子程序
}
else
//D鍵按下時
{
traffic();
//調(diào)用交通燈子程序
i=35;
k=30;
l=5;
return;
}
}
} }
/******************************************************************** * 名稱 : buzz_key(void)* 功能 : 蜂鳴器子程序
***********************************************************************/
void buzz_key(void)
{
DIOLA=0;wei=0;
buzz=0;
//蜂鳴器響
while(key_B&&key_C&&key_D&&!key_A);
buzz=1;
//關(guān)蜂鳴器
}
/********************************************************************* * 名稱 : led_key(void)* 功能 : 流水燈子程序
***********************************************************************/ void led_key(void){
DIOLA=1;b=0xfe;
P1=b;//11111110 while(key_B==0){
b=_crol_(b,1);
//左移11111101
Delay_1ms(500);
P1=b;
//111111011
Delay_1ms(500);
}
while(key_A&&key_B&&key_C&&key_D);
P1=0xff;
}
/******************************************************************** * 名稱 : tube_key(void)* 功能 : 數(shù)碼管子程序
***********************************************************************/
void tube_key(void){
DIOLA=0;
//流水燈使能端置0 while(key_C==0)
{ unsigned int i;
for(i=0;i<6;i++)
{
wei=1;
P0=weima[i];
//位選信號
wei=0;
duan=1;
P0=duanma[i];//段選信號
duan=0;
Delay_1ms(500);
}
duan=1;
P0=0;
duan=0;
//清零
}
}
/******************************************************************** * 名稱 : traffic_key(void)* 功能 : 交通燈子程序
***********************************************************************/
void traffic(void)
{
DIOLA=0;
while(key_D==0)
{
if(i>0)
{
DIOLA=1;
b=0xfe;
P1=b;//11111110
for(j=0;j<40;j++)
{
P0 = 0;
wei=1;
//消隱
P0 = weima[0];
wei=0;
duan=1;
//第1位數(shù)碼管顯示
P0 = duanma[(i / 10)%10];//在這里取 i 的個位數(shù)
Delay_1ms(40);
//延時40毫秒后顯示下一個數(shù)
P0 = 0;
wei=1;
//消隱
P0 = weima[1];
wei=0;
duan=1;
//第2位數(shù)碼管顯示
P0 = duanma[i % 10];
//在這里取 i 的個位數(shù)
Delay_1ms(40);
//延時40毫秒后顯示下一個數(shù)
}
i--;
}
else if(k>0)
{
DIOLA=1;
b=0xfd;
P1=b;//11111110
for(j=0;j<40;j++)
{
P0 = 0;
wei=1;
//消隱
P0 = weima[0];
wei=0;
duan=1;
//第1位數(shù)碼管顯示
P0 = duanma[(k / 10)%10];//在這里取 i 的個位數(shù)
Delay_1ms(40);
//延時3毫秒后顯示下一個數(shù)
P0 = 0;
wei=1;
//消隱
P0 = weima[1];
wei=0;
duan=1;
//第2位數(shù)碼管顯示
P0 = duanma[k % 10];
//在這里取 i 的個位數(shù)
Delay_1ms(40);
//延時3毫秒后顯示下一個數(shù)
}
k--;
}
else if(l>0)
{
DIOLA=1;
b=0xfb;
P1=b;//11111110
for(j=0;j<40;j++)
{
P0 = 0;
wei=1;
//消隱
P0 = weima[0];
wei=0;
duan=1;
//第1位數(shù)碼管顯示
P0 = duanma[(l / 10)%10];//在這里取 i 的個位數(shù)
Delay_1ms(40);
//延時3毫秒后顯示下一個數(shù)
P0 = 0;
wei=1;
//消隱
P0 = weima[1];
wei=0;
duan=1;
//第2位數(shù)碼管顯示
P0 = duanma[l % 10];
//在這里取 i 的個位數(shù)
Delay_1ms(40);
//延時3毫秒后顯示下一個數(shù)
}
l--;
}
}
}
五、設(shè)計心得
通過兩個星期的實驗,我的設(shè)計雖然有一些毛病,但總體上還是成功的。兩周的時間雖然短暫,但我從中受益匪淺,畢竟在課堂學習到的東西真真正正的用到實際中還是有很大困難的,要把理論運用于實踐確實并非一件易事。我從最初的設(shè)想設(shè)計一個什么樣的數(shù)字電路到繪制電路圖,然后打印排版,最后矯正設(shè)計中的漏洞與不足,整個過程我翻閱了大量的資料。
這次交通燈的課程設(shè)計,也使我得到了一次用專業(yè)知識、專業(yè)技能分析和解決現(xiàn)實問題的能力。使我在單片機的基本原理、單片機應(yīng)用學習過程中,以及在常用編程設(shè)計思路技巧的掌握方面都能向前邁了一大步,為日后成為一名合格的應(yīng)用型人才打下良好的基礎(chǔ)。綜合課程設(shè)計讓我把以前學習到的知識得到鞏固和進一步的提高認識,對已有知識有了更深層次的理解和認識。在此,由于自身能力有限,在課程設(shè)計中碰到了很多的問題,我通過查閱相關(guān)書籍、資料以及和周圍同學交流得到解決。
還有交通燈是我們生活中非常常見的一種東西,對于我們學以致用的這種能力得到了很好鍛煉,能夠為我們以后的工作于學習打下基礎(chǔ)。
六、參考文獻
1.《單片機原理及接口技術(shù)》 李朝青 北京航空航天大學出版社,2004 2.《單片機原理及應(yīng)用》 李全力 高等教育出版社,2001 3.《電子系統(tǒng)設(shè)計與實踐》 楊剛,周群 電子工業(yè)出出版社,1997 4.《單片機微型計算機技術(shù)》 劉國榮 機械工業(yè)出版社,1997 5.《數(shù)字電子技術(shù)》 楊志忠 高等教育出版社,2003 6.《電子技術(shù)》 胡宴如 高等教育出版社,2001 7.《電子線路CAD》 王延才 機械工業(yè)出版社,2001 8.《單片機應(yīng)用技術(shù)選編》 何利民 北京航空航天大學出版社,1996 9.《單片機應(yīng)用技術(shù)》 吳國經(jīng) 中國電力出版社,2004 10.《單片機及接口技術(shù)實踐教程》 胡健 北京機械工業(yè)出版社,2002 11.《使用接口技術(shù)》 李廣軍 成都電子科技大學出版社,1998
第三篇:單片機交通燈控制程序
#include
//*****define led port ********** sbit R1=P2^4;//east and west red led sbit Y1=P2^3;//east and west yellow led sbit G1=P2^2;//east and west green led sbit R2=P2^5;//south and north red led sbit Y2=P2^6;//south and north yellow led sbit G2=P2^7;//south and north green led
//*********define key************** sbit k0=P3^0;//emergency sbit k1=P3^1;//east and west pass sbit k2=P3^2;//south and north pass sbit k3=P3^3;//start and subtract 1 sbit k4=P3^4;//pause and add 1 sbit k5=P3^5;//set time
//*********define variable********* bit flag,flag_t;uchar dx_time,nb_time;uchar cnt,pass_time,cnt1,y_time;uchar k0num,k1num,k2num,k3num,k4num,k5num;
//*********define key******** void delay(uint i){ uint x,y;for(x=i;x>0;x--)
for(y=110;y>0;y--);} void timer0_init(){ TMOD=0x11;TH0=(65536-50000)/256;TL0=(65536-50000)%256;TH1=(65536-50000)/256;TL1=(65536-50000)%256;EA=1;ET0=1;ET1=1;}
void led_display(uchar dx,nb){ uchar dx1,dx2,nb1,nb2;dx2=dx/10;dx1=dx%10;nb2=nb/10;nb1=nb%10;if(dx>99){
led_w1=1;
led_w2=1;} else {
led_w1=0;
P0=table[dx1];
delay(5);
led_w1=1;
if(dx<10&&dx>0)led_w2=1;
else
{
led_w2=0;
P0=table[dx2];
delay(5);
led_w2=1;
} } if(nb>99){
led_w3=1;
led_w4=1;} else {
led_w3=0;
P0=table[nb1];
delay(5);
led_w3=3;
if(nb<10&&nb>0)led_w4=1;
else
{
led_w4=0;
P0=table[nb2];
delay(5);
led_w4=4;
} } } //*************light work********** void circle_led(){ if(!flag){
if(pass_time>5)
{
led_display(pass_time-5,pass_time);
R1=1;Y1=1;G1=0;
//east and west pass
R2=0;Y2=1;G2=1;
//south and north stop
}
if(pass_time<=5&&pass_time>0)
{
if(cnt>=10)led_display(pass_time,pass_time);
else led_display(100,pass_time);
R1=1;G1=1;
//east and west yellow led flash
if(cnt>=10)Y1=0;
else Y1=1;
R2=0;Y2=1;G2=1;
}
if(pass_time==0)
{
pass_time=nb_time;
flag=1;
} } else {
if(pass_time>5)
{
led_display(pass_time,pass_time-5);
R1=0;Y1=1;G1=1;
//east and west stop
R2=1;Y2=1;G2=0;
//south and north pass
}
if(pass_time<=5&&pass_time>0)
{
if(cnt>=10)led_display(pass_time,pass_time);
else led_display(pass_time,100);
R1=0;Y1=1;G1=1;
R2=1;G2=1;
//south and north yellow led flash
if(cnt>=10)Y2=0;
else Y2=1;
}
if(pass_time==0)
{
pass_time=dx_time;
flag=0;
} } }
void emergency()
//east and west,south and north stop { led_display(0,0);R1=0;Y1=1;G1=1;R2=0;Y2=1;G2=1;} void dx_pass()
//east and west pass,south and north stop { led_display(100,100);if(y_time<=5&&y_time>0){
TR1=1;
R1=0;Y1=1;G1=1;
R2=1;G2=1;
//south and north yellow led flash
if(cnt1>=10)Y2=0;
else Y2=1;} if(y_time==0){
TR1=0;
R1=1;Y1=1;G1=0;
R2=0;Y2=1;G2=1;} } void nb_pass()
//south and north pass,east and west stop { led_display(100,100);if(y_time<=5&&y_time>0){
TR1=1;
R1=1;G1=1;
if(cnt1>=10)Y1=0;//east and west yellow led flash
else Y1=1;
R2=0;Y2=1;G2=1;
} if(y_time==0){
TR1=0;
R1=0;Y1=1;G1=1;
R2=1;Y2=1;G2=0;} }
//***********keyboard scan************ void keyscan(){
if(!k5num)
{
if(k0==0)//*******emergency*******
{
delay(10);
if(k0==0)
{
while(!k0);
TR0=0;
k0num=1;
}
}
if(!k1num&&!k0num)
{
if(k1==0)
{
delay(10);
if(k1==0)
{
while(!k1);
k1num=1;
k2num=0;
y_time=5;//單方向通行時,黃燈閃爍時間
TR0=0;
TR1=1;
}
}
}
if(!k2num&&!k0num)
{
if(k2==0)
{
delay(10);
if(k2==0)
{
while(!k2);
k1num=0;
k2num=1;
y_time=5;//單方向通行時,黃燈閃爍時間
TR0=0;
TR1=1;
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!k3);
if(k1num||k2num)pass_time=dx_time;//由東西或南北通行返回時,重新開始執(zhí)行。
k0num=0;
k1num=0;
k2num=0;
k4num=0;
k5num=0;
TR0=1;
TR1=0;
flag_t=0;
}
} {
} if(!k4&&!k0num)
//pause { delay(10);if(k4==0){
while(!k4);
TR0=0;
k4num=1;} }
if(k4num==1)
//暫停鍵按下時,才可以調(diào)整兩個方向通行時間 if(k5==0){ delay(10);if(k5==0){
k5num++;
while(!k5);
switch(k5num)
{
case 1:
TR0=1;
flag_t=1;//調(diào)整時間時,pass_time值不變。
k5num=1;
break;
case 2:
k5num=2;
break;
case 3:
TR0=0;
k5num=0;
pass_time=dx_time;//重新賦值
break;
} } } if(k5num!=0){ if(k3==0){
delay(10);
if(k3==0)
{
while(!k3);
switch(k5num)
{
case 1:
dx_time--;
if(dx_time<10)
break;
case 2:
nb_time--;
if(nb_time<10)
break;
}
}
}
if(k4==0)
{
delay(10);
if(k4==0)
{
while(!k4);
switch(k5num)
{
case 1:
dx_time++;
if(dx_time>=100)
break;
case 2:
nb_time++;
if(nb_time>=100)
break;
}
}
}
} } } void main(){ timer0_init();dx_time=45;nb_time=30;
dx_time=99;nb_time=99;dx_time=10;nb_time=10;
pass_time=dx_time;while(1){ keyscan();if(k0num)emergency();else { switch(k4num){
case 0:
if(!k1num&&!k2num)
circle_led();
else
{
if(k1num)dx_pass();
if(k2num)nb_pass();
}
break;
case 1:
switch(k5num)
{
case 0:
if(!k1num&&!k2num)
circle_led();
else
{
if(k1num)dx_pass();
if(k2num)nb_pass();
}
break;
case 1:
R1=1;Y1=1;G1=1;//調(diào)整時間時,關(guān)閉所有燈
R2=1;Y2=1;G2=1;
if(cnt<=10)
led_display(100,nb_time);
else
led_display(dx_time,nb_time);
break;
case 2:
R1=1;Y1=1;G1=1;//調(diào)整時間時,關(guān)閉所有燈
R2=1;Y2=1;G2=1;
if(cnt<=10)
led_display(dx_time,100);
else
led_display(dx_time,nb_time);
break;
}
break;
}
}
} } void timer0()interrupt 1 { TH0=(65536-50000)/256;TL0=(65536-50000)%256;cnt++;if(cnt==20){
cnt=0;
if(flag_t==0)pass_time--;//調(diào)整時間時,不執(zhí)行此操作
} } void timer1()interrupt 3 { TH1=(65536-50000)/256;TL1=(65536-50000)%256;cnt1++;if(cnt1==20){
cnt1=0;
y_time--;//單方向通行時,黃燈閃爍時間。
} }
第四篇:基于單片機的交通燈控制系統(tǒng)設(shè)計
P10P11P12P13設(shè)置鍵加鍵減鍵模式鍵P00P01P02P03P04P05P06U18765P134P123P112P101P1.7P1.6P1.5P1.4P1.3P1.2P1.1/T2EXP1.0/T2P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0******23222***373839P37P36P35P34P22P23P24D7D4P27P26P25P24P23P22P21P20P07P06P05P04P03P02P01P0098765432110KP27LED-REDD92H1HD1D6P25LED-YELLOWD11P26LED-YELLOWLED-GREENLED-REDC31uF313029EAALEPSEND12P26R0100RP1P25LED-GREENLED-GREENC120PF9RSTD5P00P01P02P03P04P05P06LED-YELLOWD3P27LED-REDX1C220PF12M19LED-REDLED-GREENLED-YELLOWP24P23P22XTAL1AT89C51Q1PNPQ2PNPQ3PNPQ4PNPP34P35657U2SCKSDAWP24C02CA0A1A2123R151R1HR251R2HR351R3HR451R4HP36P37P21P00P01P02P03P04P05P0651R51R51R51R2H1HR19R20R21P20R223H4HXTAL2P00P01P02P03P04P05P0618D2D10D83H4H
#include
//調(diào)用單片機頭文件
#define uchar unsigned char
//宏定義“uchar”代替“unsigned char”。#define uint unsigned int
//宏定義“uint”用來定義無符號整型數(shù)。
//數(shù)碼管段選定義 0
7
uchar code smg_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, //
A B C
D
E
F 不顯示
0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff};//斷碼
uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};uchar smg_i = 4;
//顯示數(shù)碼管的個位數(shù)
//數(shù)碼管位選定義
sbit smg_we1 = P2^0;
//數(shù)碼管位選定義 sbit smg_we2 = P2^1;sbit smg_we3 = P3^6;sbit smg_we4 = P3^7;
char dx_s = 0;//東西
南北 倒計時變量 sbit dx_red
= P2^4;
//東西紅燈 sbit dx_green = P2^3;//東西綠燈 sbit dx_yellow = P2^2;//東西黃燈
sbit nb_red
= P2^7;//南北紅燈 sbit nb_green = P2^6;//南北綠燈 sbit nb_yellow = P2^5;//南北黃燈
sbit scl=P3^4;//寫24C02時鐘
sbit sda=P3^5;//寫24C02數(shù)據(jù)
uchar flag_jtd_mode;//交通燈的模式 根據(jù)時間
bit flag_1s = 0;bit flag_500ms;bit flag_dx_nb;uchar flag_5m_value;uchar i;//東西南北模式
uchar flag_alarm;//模式
uchar dx_time = 30,nb_time = 20;
//東西、南北的時間 uchar flag_jdgz;
//交通管制
//---延時函數(shù)---// void delay(){;;}
void start()//起始信號 { sda=1;delay();scl=1;delay();sda=0;delay();}
void stop()//停止信號 { sda=0;delay();scl=1;delay();sda=1;delay();}
void respons()//應(yīng)答信號 { uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}
void init()//初始狀態(tài),24C02的數(shù)據(jù)和時鐘線都拉高 { sda=1;delay();scl=1;delay();}
void writebyte(uchar date)//寫24C02 { uchar i,temp;temp=date;for(i=0;i<8;i++){
temp=temp<<1;
scl=0;
delay();
sda=CY;
delay();
scl=1;
delay();} scl=0;delay();sda=1;delay();} uchar readbyte()//讀24C02 { uchar i,k;scl=0;delay();sda=1;delay();
for(i=0;i<8;i++){
scl=1;
delay();
k=(k<<1)|sda;
scl=0;
delay();} return k;}
void writeadd(uchar address,uchar date)//寫24C02 {
start();//起始信號
writebyte(0xa0);//寫入器件地址寫 respons();
writebyte(address);//寫入存儲單元地址 respons();
writebyte(date);//寫入數(shù)據(jù) respons();
stop();//停止信號 }
uchar readadd(uchar address)//讀24C02 { uchar date;
start();//起始信號
writebyte(0xa0);//寫入器件地址寫
respons();
writebyte(address);//寫入讀單元地址
respons();
}
start();//起始信號
writebyte(0xa1);//讀命令 respons();date=readbyte();//讀數(shù)據(jù) stop();//停止信號 return date;/***********************數(shù)碼位選函數(shù)*****************************/ void smg_we_switch(uchar i){ switch(i){
case 0: smg_we1 = 0;smg_we2 = 1;smg_we3 = 1;smg_we4 = 1;break;
case 1: smg_we1 = 1;smg_we2 = 0;smg_we3 = 1;smg_we4 = 1;break;
case 2: smg_we1 = 1;smg_we2 = 1;smg_we3 = 0;smg_we4 = 1;break;
case 3: smg_we1 = 1;smg_we2 = 1;smg_we3 = 1;smg_we4 = 0;break;} }
/******************************************************************** * 名稱 : delay_1ms()* 功能 : 延時1ms函數(shù) * 輸入 : q * 輸出 : 無
***********************************************************************/ void delay_1ms(uint q){ uint i,j;for(i=0;i for(j=0;j<110;j++);} /******************************************************************** * 名稱 : display()* 功能 : 數(shù)碼管顯示 * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void display(){ uchar i;for(i=0;i P0 = 0xff; //消隱 smg_we_switch(i); //位選 P0 = dis_smg[i]; //段選 delay_1ms(3);} } /*********************定時器0、定時器1初始化******************/ void time0_init() { EA = 1; //開總中斷 TMOD = 0X11;//定時器0、定時器1工作方式1 ET0 = 1; //開定時器0中斷 TR0 = 1; //允許定時器0定時 } /*********************交通燈處理函數(shù)*********************************/ void jiaotongdeng_dis(){ char dx,nb; if(flag_dx_nb == 0){ dx=dx_s;nb=dx_s-5;if(nb<=0)nb=dx_s;} if(flag_dx_nb == 1){ dx=dx_s-5;nb=dx_s;if(dx<=0)dx=dx_s;} if(flag_1s == 1){ dx_s--;flag_1s = 0; if(dx_s == 0){ if(flag_dx_nb == 1) dx_s = nb_time; //南北時間 else dx_s = dx_time; //東西時間 flag_dx_nb = ~flag_dx_nb; } } dis_smg[0] = smg_du[dx % 10];dis_smg[1] = smg_du[dx / 10];dis_smg[2] = smg_du[nb % 10];dis_smg[3] = smg_du[nb / 10]; /***********************南北時間*********************************/ if(flag_dx_nb == 0) { if(dx_s > 5) { dx_red = 1;//滅 dx_green = 0;//亮 dx_yellow = 1;//滅 nb_red = 0;//亮 nb_green = 1;//滅 nb_yellow = 1;//滅 flag_5m_value = 0; }else if(dx_s <= 5) //當小于5秒時 黃燈要閃了 { dx_red = 1; //滅 } } dx_green = 1; //滅 nb_red = 0; //亮 nb_green = 1; //滅 nb_yellow = 1; //滅 if(flag_500ms == 0){ dx_yellow = 0;//亮 } else { } dx_yellow = 1;//滅 /***********************東西時間*********************************/ if(flag_dx_nb == 1) { if(dx_s > 5) { dx_red = 0; //亮 dx_green = 1; //滅 dx_yellow = 1; //滅 nb_red = 1; //滅 nb_green = 0; //亮 nb_yellow = 1; //滅 flag_5m_value = 0; }else if(dx_s <= 5) //當小于5秒時 黃燈要閃了 { dx_red = 0; //滅 dx_green = 1; //滅 dx_yellow = 1; //滅 nb_red = 1; //滅 nb_green = 1; //滅 if(flag_500ms == 0) //黃燈閃爍 { } } } nb_yellow = 0;//亮 } else { nb_yellow = 1;//滅 } /********************獨立按鍵程序*****************/ uchar key_can;//按鍵值 void key()//獨立按鍵程序 { static uchar key_new;key_can = 20; //按鍵值還原 P1 |= 0x1f; if((P1 & 0x1f)!= 0x1f)//按鍵按下 { delay_1ms(1); //按鍵消抖動 if(((P1 & 0x1f)!= 0x1f)&&(key_new == 1)) { key_new = 0;switch(P1 & 0x1f){ //確認是按鍵按下 case 0x1e: key_can = 1;break;//得到按鍵值 case 0x1d: key_can = 2;break;//得到按鍵值 case 0x1b: key_can = 3;break;//得到按鍵值 case 0x17: key_can = 4;break;//得到按鍵值 } } } else key_new = 1;} uchar menu_1,flag_s; /********************設(shè)置函數(shù)*****************/ void key_with(){ if(key_can == 4) //交通管制按鍵 { flag_jdgz ++; if(flag_jdgz > 5) flag_jdgz = 0; if(flag_jdgz == 1)// 全部亮紅燈 { dx_red = 0;//亮 dx_green = 1;//滅 dx_yellow = 1;//滅 } nb_red = 0;//亮 nb_green = 1;//滅 nb_yellow = 1;//滅 if(flag_jdgz == 2)// 東西紅燈 南北綠燈 { dx_red = 0;//亮 dx_green = 1;//滅 dx_yellow = 1;//滅 nb_red = 1;//滅 nb_green = 0;//亮 nb_yellow = 1;//滅 } if(flag_jdgz == 3)// 南北紅燈 { dx_red = 1;//滅 dx_green = 0;//亮 dx_yellow = 1;//滅 nb_red = 0;//亮 nb_green = 1;//滅 nb_yellow = 1;//滅 } if(flag_jdgz == 4)// 南北綠燈 { dx_red = 1;//滅 dx_green = 0;//亮 dx_yellow = 1;//滅 nb_red = 1;//滅 nb_green = 0;//亮 nb_yellow = 1;//滅 } if(flag_jdgz == 5)// 南北黃燈 { dx_red = 1;//滅 dx_green = 1;//滅 dx_yellow = 0;//亮 nb_red = 1;//滅 nb_green = 1;//滅 nb_yellow = 0;//亮 } } if(key_can == 1) //設(shè)置鍵 { menu_1 ++; 東西綠燈 東西綠燈 東西黃燈 if(menu_1 >= 3){ menu_1 = 0;} } if(menu_1 == 1) //設(shè)置東西的時間 { if(key_can == 2){ dx_time ++;//加1 if(dx_time > 99) dx_time = 99;} if(key_can == 3){ dx_time--;//減1 if(dx_time <= 10) dx_time = 10;} dis_smg[0] = smg_du[10];//顯示為A dis_smg[1] = smg_du[10];//顯示為A dis_smg[2] = smg_du[dx_time % 10];dis_smg[3] = smg_du[dx_time / 10]; writeadd(4,dx_time);//保存數(shù)據(jù) } if(menu_1 == 2) //設(shè)置南北的時間 { if(key_can == 2){ nb_time ++;//加1 if(nb_time > 99) nb_time = 99;} if(key_can == 3){ nb_time--;//減1 //顯示東西設(shè)置的時候 if(nb_time <= 10) nb_time = 10;} dis_smg[0] = smg_du[11];//顯示為B dis_smg[1] = smg_du[11];//顯示為B dis_smg[2] = smg_du[nb_time % 10];dis_smg[3] = smg_du[nb_time / 10]; //顯示東西設(shè)置的時候 writeadd(2,nb_time);//保存數(shù)據(jù) } } /******************************************************************** * 名稱 : main()* 功能 : 實現(xiàn)燈的閃爍 * 輸入 : 無 * 輸出 : 無 ***********************************************************************/ void main(){ time0_init(); init();//24C02初始化 nb_time=readadd(2);//讀取地址2處一個字節(jié)給 dx_time=readadd(4);//讀取地址4處一個字節(jié)給 if(nb_time>99)nb_time=20; if(dx_time>99)dx_time=30; dx_s = nb_time; //東西時間 while(1){ key(); if(key_can < 20) key_with(); if((menu_1 == 0)&&(flag_jdgz == 0)) } } jiaotongdeng_dis();display();/*********************定時器0中斷服務(wù)程序************************/ void time0_int()interrupt 1 { } static uchar value; //定時10ms中斷一次 TH0 = 0x3c;TL0 = 0xb0; //50ms value ++;flag_5m_value++;if(flag_5m_value % 10 == 0)flag_500ms = ~flag_500ms;if(value >= 20){ value = 0;flag_1s = 1;} 基于單片機的交通燈控制系統(tǒng)設(shè)計 摘要:十字路口車輛穿梭,行人熙攘,車行車道,人行人道,有條不紊。那么靠什么來實現(xiàn)這井然秩序呢?靠的就是交通信號燈的自動指揮系統(tǒng)。交通信號燈控制方式很多。本系統(tǒng)采用MSC-51系列單片機ATSC51和可編程并行I/O接口芯片8255A為中心器件來設(shè)計交通燈控制囂,實現(xiàn)了能根據(jù)實際車流量通過8051芯片的P1口設(shè)置紅、綠燈燃亮時間的功能;紅綠燈循環(huán)點亮。倒計時剩5秒時黃燈閃爍警示;車輛闖紅燈報警;綠燈時間可檢測車流量并可通過雙位數(shù)碼管顯示。本系統(tǒng)實用性強、操作簡單、擴展功能強。 關(guān)鍵詞:單片機;交通燈 單片機技術(shù)的發(fā)展對社會進步產(chǎn)生了巨大的影響。今天,單片機及其應(yīng)用技術(shù)的發(fā)展速度、深度及其廣度,在國防、科學研究、政治經(jīng)濟、教育文化等方面幾乎無所不及。將之用于交通燈控制系統(tǒng)設(shè)計,對于疏導交通流量、提高道路通行能力,減少交通事故有明顯效果。 1、單片機涵義 一臺能夠工作的計算機要有這樣幾個部份構(gòu)成:CPU(進行運算、控制)、RAM(數(shù)據(jù)存儲)、ROM(程序存儲)、輸入,輸出設(shè)備(例如:串行口、并行輸出口等)。在個人計算機上這些部份被分成若干塊芯片,安裝一個稱之為主板的印刷線路板上。而在單片機中,這些部份,全部被做到一塊集成電路芯片中了,所以就際=缸單片(單芯片)機,單片機即微控制器(Microniroller μC)有一些單片機中除了上述部份外,還集成了其它部份如AID,DIA,定時計數(shù)器,RTC,各種串行接口等。 2、MSC-51芯片簡介 2.1 MSC-51結(jié)構(gòu) 8051是MCS-51系列單片機的典型產(chǎn)品,8051單片機包含中央處理器、程序存儲器(ROM)、數(shù)據(jù)存儲器(RAM)、定時,計數(shù)器、并行接口、串行接口和中斷系統(tǒng)等幾大單元及數(shù)據(jù)總線、地址總線和控制總線等三大總線。 2.2 8255芯片簡介 8255可編程并行接口芯片有三個輸入輸出端口,即A口、B口和c口,對應(yīng)于引腳PAT—PA0、PB7-PB0和PC7-PC0。其內(nèi)部還有一個控制寄存器,即控制口。通常A口、B口作為輸入輸出的數(shù)據(jù)端口。c口作為控制或狀態(tài)信息的端口,它在方式字的控制下,可以分成4位的端口,每個端口包含一個4位鎖存器。它們分別與端口A/B配合使用,可以用作控制信號輸出或作為狀態(tài)信號輸入。 8255有兩種控制命令字;一個是方式選擇控制字;另一個是c口按位置位/復位控制字。 2.3 74LS373簡介 SN74LS373。SN74LS374常用的8d鎖存器。常用作地址鎖存和I/0輸出,可以用74he373代換,74H373是高速CMOS器件,功能與74LS373相同,兩者可以互換。74LS373內(nèi)有8個相同的D型(三態(tài)同相)鎖存器,由兩個控制端(11腳c或EN;1腳OUT、CONT、OE)控制。當OE接地時,若G為高電平,741Ls373接收由PPU輸出的地址信號;如果G為低電平,則將地址信號鎖存。 3、系統(tǒng)硬件 3.1 交通管理的方案論證 東西、南北兩干道交于一個十字路口,各干道有一組紅、黃、綠三色的指示燈,指揮車輛和行人安全通行。紅燈亮禁止通行。綠燈亮允許通行。黃燈亮提示人們注意紅、綠燈的狀態(tài)即將切換,且黃燈燃亮時間為東西、南北兩千道的公共停車時問。設(shè)東西道比南北道的車流量。 3.2 系統(tǒng)硬件設(shè)計 選用設(shè)備8031單片機一片選用設(shè)備:8031彈片機一片,8255并行通用接口芯片一片,74LS07兩片,MAX692‘看門狗’一片,共陰極的七段數(shù)碼管兩個雙向晶閘管若干,7805三端穩(wěn)壓電源一個,紅、黃、綠交通燈各兩個。開關(guān)鍵盤、連線若干。 4、控制器的軟件設(shè)計 4.1 每秒鐘的設(shè)定 延時方法可以有兩種:一種是利用NCS-51內(nèi)部定時器才生溢出中斷來確定1秒的時間,另一種是采用軟延時的方法。 4.2 計數(shù)器硬件延時 4.2.1 初值計算 定時器工作時必須給計數(shù)器送計數(shù)器初值,這個值是送到TH和TL中的。他是以加法記數(shù)的,并能從全1到全0時自動產(chǎn)生溢出中斷請求。因此,我們可以把計數(shù)器記滿為零所需的計數(shù)值設(shè)定為c和計數(shù)初值設(shè)定為TC。 4.2.2 1秒的方法 我們采用在主程序中設(shè)定一個初值為20的軟件計數(shù)器和使TO定時5O毫秒,這樣每當TO到50毫秒時cPu就響應(yīng)它的溢出中斷請求,進入他的中斷服務(wù)子程序。在中斷服務(wù)子程序中,cPu先使軟件計數(shù)器減1,然后判斷它是否為零。為零表示1秒已到可以返回到輸出時間顯示程序。 4.3 計數(shù)器軟件延時 MCS-51的工作頻率為2-12MHZ,我們選用的8031單片機的工作頻率為6MHZ。機器周期與主頻有關(guān),機器周期是主頻的12倍,所以一個機器周期的時間為12*(1/6M)=2us。我們可以知道具體每條指令的周期數(shù),這樣我們就可以通過指令的執(zhí)行條數(shù)來確定1秒的時間。 4.4 時間及信號燈的顯示 4.4.1 8051并行口的擴展 8051雖然有4個8位I/0端口,但真正能提供借用的只有Pl口。因為P2和P0口通常用于傳送外部傳送地址和數(shù)據(jù),P3口也有它的第二功能。因此,8031通常需要擴展。由于我們用外部輸入設(shè)定紅綠燈倒計時初值、數(shù)碼管的輸出顯示、紅綠黃信號燈的顯示都要用到一個I/0端口,顯然8031的端口是不夠,需要擴展。 擴展的方法有兩種:(1)借用外部RAM地址來擴展I/0端口;(2)采用I/0接口新片來擴充。我們用8255并行接口信片來擴展I/0端口。 4.4.2 8255與8051的連接 用8051的PO口的pO.7連接8255的片選信號,我們用8031的地址采用全譯碼方式,當pO.7:0時片選有效,其他無效,pO.1用于選擇8255端口。 5、結(jié) 論 本系統(tǒng)就是充分利用了8051和8255芯片的I/O引腳。系統(tǒng)統(tǒng)采用MSC-51系列單片機Intel8051和可編程并行I/0接口芯片8255A為中心器件來設(shè)計交通燈控制器,實現(xiàn)了能根據(jù)實際車流量通過8031芯片的Pl口設(shè)置紅、綠燈燃亮時間的功能;紅綠燈循環(huán)點亮,倒計時剩5秒時黃燈閃爍警示(交通燈信號通過PA口輸出,顯示時間直接通過8255的PC口輸出至雙位數(shù)碼管);車輛闖紅燈報警;綠燈時間可檢測車流量并可通過雙位數(shù)碼管顯示。 參考文獻: [1]張毅剛,新編MCS-51單片機應(yīng)用系統(tǒng)設(shè)計[M]哈爾濱:哈爾濱工業(yè)大學出版社,2006 [2]王義軍,單片機原理及應(yīng)用習題與實驗指導書[M],北京:中國電力出版社,2006 [3]陳明熒8051單片機課程設(shè)計實訓教材[M],北京:清華大學出版社。2004第五篇:基于單片機的交通燈控制系統(tǒng)設(shè)計