第一篇:?jiǎn)纹瑱C(jī):交通燈控制系統(tǒng)設(shè)計(jì)
交通燈控制系統(tǒng)設(shè)計(jì)
摘要:本系統(tǒng)由單片機(jī)系統(tǒng)、鍵盤、LED 顯示、交通燈演示系統(tǒng)組成。系統(tǒng)包括人行道、左轉(zhuǎn)、右轉(zhuǎn)、以及基本的交通燈的功能。系統(tǒng)除基本交通燈功能外,還具有倒計(jì)時(shí)、時(shí)間設(shè)置、緊急情況處理、分時(shí)段調(diào)整信號(hào)燈的點(diǎn)亮?xí)r間以及根據(jù)具體情況手動(dòng)控制等功能。關(guān)鍵詞:AT89S51,交通規(guī)則
一、方案比較、設(shè)計(jì)與論證 1 電源提供方案
為使模塊穩(wěn)定工作,須有可靠電源。我們考慮了兩種電源方案
方案一:采用獨(dú)立的穩(wěn)壓電源。此方案的優(yōu)點(diǎn)是穩(wěn)定可靠,且有各種成熟電路可供選用;缺點(diǎn)是各模塊都采用獨(dú)立電源,會(huì)使系統(tǒng)復(fù)雜,且可能影響電路電平。方案二:采用單片機(jī)控制模塊提供電源。改方案的優(yōu)點(diǎn)是系統(tǒng)簡(jiǎn)明扼要,節(jié)約成本;缺點(diǎn)是輸出功率不高。綜上所述,我們選擇第二種方案。2 顯示界面方案
該系統(tǒng)要求完成倒計(jì)時(shí)、狀態(tài)燈等功能?;谏鲜鲈?,我們考慮了三種方案: 方案一:完全采用數(shù)碼管顯示。這種方案只顯示有限的符號(hào)和數(shù)碼字苻,無(wú)法勝任題目要求。
方案二:完全采用點(diǎn)陣式LED 顯示。這種方案實(shí)現(xiàn)復(fù)雜,且須完成大量的軟件工作;但功能強(qiáng)大,可方便的顯示各種英文字符,漢字,圖形等。
方案三:采用數(shù)碼管與點(diǎn)陣LED 相結(jié)合的方法因?yàn)樵O(shè)計(jì)既要求倒計(jì)時(shí)數(shù)字輸出,又要求有狀態(tài)燈輸出等,為方便觀看并考慮到現(xiàn)實(shí)情況,用數(shù)碼管與LED燈分別顯示時(shí)間與提示信息。這種方案既滿足系統(tǒng)功能要求,又減少了系統(tǒng)實(shí)現(xiàn)的復(fù)雜度。權(quán)衡利弊,第三種方案可互補(bǔ)一二方案的優(yōu)缺,我們決定采用方案三以實(shí)現(xiàn)系統(tǒng)的顯示功能。3 輸入方案:
題目要求系統(tǒng)能手動(dòng)設(shè)燈亮?xí)r間、緊急情況處理,我們討論了兩種方案: 方案一:采用8155擴(kuò)展I/O 口及鍵盤,顯示等。該方案的優(yōu)點(diǎn)是:
使用靈活可編程,并且有RAM,及計(jì)數(shù)器。若用該方案,可提供較多I/O 口,但操作起來(lái)稍顯復(fù)雜。
方案二: 直接在IO口線上接上按鍵開(kāi)關(guān)。因?yàn)樵O(shè)計(jì)時(shí)精簡(jiǎn)和優(yōu)化了電路,所以剩余的口資源還比較多,我們使用四個(gè)按鍵,分別是K1、K2、K3、K4。由于該系統(tǒng)對(duì)于交通燈及數(shù)碼管的控制,只用單片機(jī)本身的I/O 口就可實(shí)現(xiàn),且本身的計(jì)數(shù)器及RAM已經(jīng)夠用,故選擇方案二。
二、理論分析與計(jì)算
1.交通燈顯示時(shí)序的理論分析與計(jì)算
對(duì)于一個(gè)交通路口來(lái)說(shuō),能在最短的時(shí)間內(nèi)達(dá)到最大的車流量,就算是達(dá)到了最佳的性能,我們稱在單位時(shí)間內(nèi)多能達(dá)到的最大車流為車流量,用公式:車流量= 車流 / 時(shí)間 來(lái)表示。
先設(shè)定一些標(biāo)號(hào)如圖2-1 所示。
說(shuō)明:此圖為直方圖,上邊為北路口燈,右邊為東路口燈,下邊為南路口燈,左邊為西 路口燈。
圖2-2 所示為一種紅綠燈規(guī)則的狀態(tài)圖,分別設(shè)定為S1、S2、S3、S4,交通燈以這四 的狀態(tài)為一個(gè)周期,循環(huán)執(zhí)行(見(jiàn)圖2-3)。
請(qǐng)注意圖2-1b和圖2-1d,它們?cè)谝粋€(gè)時(shí)間段中四個(gè)方向都可以通車,這種狀態(tài)能在
一定的時(shí)間內(nèi)達(dá)到較大的車流量,效率特別高。
依據(jù)上述的車輛行駛的狀態(tài)圖,可以列出各個(gè)路口燈的邏輯表,由于相向的燈的狀態(tài)圖
是一樣的,所以只需寫出相鄰路口的燈的邏輯表;根據(jù)圖2-3 可以看出,相鄰路口的燈它
們的狀態(tài)在相位上相差180°。因此最終只需寫出一組S1、S2、S3、S4的邏輯狀態(tài)表。
如表2-1 所示。
表中的“×”代表是紅燈亮(也代表邏輯上的0),“√”是代表綠燈亮(也代表邏輯上 的1),依上表,就可以向相應(yīng)的端口送邏輯值。2.交通燈顯示時(shí)間的理論分析與計(jì)算
東西和南北方向的放行時(shí)間的長(zhǎng)短是依據(jù)路口的各個(gè)方向平時(shí)的車流量來(lái)設(shè)定,并且
S1、S2、S3、S4各個(gè)狀態(tài)保持的時(shí)間之有嚴(yán)格的對(duì)應(yīng)關(guān)系,其公式如下所示。T-S1+T-S2=T-S3 T-S2=T-S4 T-S1=T-S3 我們可以依據(jù)上述的標(biāo)準(zhǔn)來(lái)改變車輛的放行時(shí)間。按照一般的規(guī)則,一個(gè)十字路口可分
為主干道和次干道,主干道的放行時(shí)間大于次干道的放行時(shí)間,我們?cè)O(shè)定值時(shí)也應(yīng)以此為參 考。
三、電路圖及設(shè)計(jì)文件 1.燈控制電路設(shè)計(jì)
由于32個(gè)LED 來(lái)實(shí)現(xiàn)紅綠燈狀態(tài),若直接接在單片機(jī)的口線,路口倒計(jì)時(shí)的顯示就不
能實(shí)現(xiàn),所以本次設(shè)計(jì)中采用一種新型的電路如圖3-1 所示。
圖中74LS04的作用是倒相和驅(qū)動(dòng),它輸出的電流大約48mA,實(shí)際測(cè)試發(fā)現(xiàn)足以滿足要
求,而且發(fā)光管也能達(dá)到足夠的亮度。
觀察圖可以看出:兩組發(fā)光管(一組紅、一組綠)由于反相器的作用,其邏輯狀態(tài)恰恰 相反。
圖中和電阻串聯(lián)的二極管的作用是為了分壓,防止因上下兩組發(fā)光管分壓不同導(dǎo)致邏輯 的錯(cuò)誤。
共四組和上述相同的電路分別代表東西南北四個(gè)方向的紅綠燈,使用兩片74LS04 作為 驅(qū)動(dòng)。
2.倒計(jì)時(shí)顯示電路設(shè)計(jì)
前面已經(jīng)分析過(guò)相向的燈的狀態(tài)和倒計(jì)時(shí)都是相同的,所以為了節(jié)省,采用兩組四個(gè)數(shù)碼管
作為倒計(jì)時(shí)的顯示;同時(shí)為了節(jié)省口資源,采用串口顯示的方式驅(qū)動(dòng)數(shù)碼管。見(jiàn)圖3-2 所 示。
四、程序設(shè)計(jì)思路與流程圖 1.主程序流程圖
主程序中主要是一個(gè)死循環(huán),不停的循環(huán)四個(gè)狀態(tài),如圖4-1 所示。
2.按鍵子程序流程圖
它包含倒計(jì)時(shí)調(diào)整和緊急狀態(tài)兩個(gè)狀態(tài)。
主程序中放了一個(gè)按鍵的判斷指令,當(dāng)有按鍵按下的時(shí)候,程序就自動(dòng)的跳轉(zhuǎn)到按鍵子
程序處理。當(dāng)檢測(cè)到K2鍵按下的時(shí)候就自動(dòng)返回到主程序。當(dāng)出現(xiàn)緊急的情況的時(shí)候,按下K3或者K4 就切換到緊急狀態(tài),當(dāng)緊急事件處理完畢 的時(shí)候,按下K2,就可以返回正常狀態(tài)。
五、測(cè)試、數(shù)據(jù)及結(jié)果分析 1.狀態(tài)燈顯示測(cè)試
當(dāng)電路連接完畢后,將寫好的測(cè)試程序刷寫到芯片內(nèi),K1 和K2分別給端口送高電平和
低電平,通電即可檢測(cè)。2.?dāng)?shù)碼管的測(cè)試
將串口的和電路板上的接口連接,將寫好的測(cè)試程序刷寫到芯片內(nèi),開(kāi)電源即可測(cè)試。
3.整體電路測(cè)試
系統(tǒng)上電,刷寫好程序即可開(kāi)始測(cè)試,觀測(cè)一個(gè)周期(共計(jì)S1~S4四個(gè)狀態(tài),默認(rèn)140 秒)燈的顯示狀態(tài)是否正常,同時(shí)觀察倒計(jì)的計(jì)數(shù)是否正常。
六、總結(jié)
由于使用的是單片機(jī)作為核心的控制元件,使得電路的可靠性比較高,功能也比較強(qiáng)大,而且可以隨時(shí)的更新系統(tǒng),進(jìn)行不同狀態(tài)的組合。
但是在我們?cè)O(shè)計(jì)和調(diào)試的過(guò)程中,也發(fā)現(xiàn)了一些問(wèn)題,譬如紅燈和綠燈的切換還不夠迅
速,紅綠燈規(guī)則不效率還不是很高等等,這需要在實(shí)踐中進(jìn)一步完善。附錄 系統(tǒng)總體電路圖
1.滿足南北向紅綠燈亮,東西向紅燈亮,占25秒——南北向黃燈亮,東西向紅燈亮,占5秒——南北向紅燈亮,東西向綠燈亮,占25秒——南北向紅燈亮,東西向黃燈亮,占5秒。如此循環(huán),周而復(fù)始。2.十字路口要有數(shù)字顯示,提示行人把握時(shí)間:當(dāng)某方向綠燈亮?xí)r,置顯示器為24,然后以每秒減1計(jì)數(shù)方式工作,直到減為0,綠燈滅,黃燈亮。黃燈滅,紅燈亮?xí)r,再次置顯示器為29,并開(kāi)始減計(jì)數(shù),直到為0,十字路口紅綠燈交換,完成一次工作循環(huán)。
3.可手動(dòng)調(diào)整和自動(dòng)調(diào)整,夜間為黃燈閃耀。下面是一個(gè)單片機(jī)交通燈程序 /*
****************************************************************************************** * *
* Keil C 89S51 交通信號(hào)控制程序 * *(C)版權(quán)所有 Dai_Weis@hotmail.com * * *
****************************************************************************************** */
#include “reg51.h” #define UINT unsigned int #define ULONG unsigned long #define UCHAR unsigned char /*
信號(hào)燈變量
南北方向綠燈
sbit n_bike_g = P1^0;//自行車
sbit n_right_g = P1^1;//右轉(zhuǎn)
sbit n_up_g = P1^2;//直行
sbit n_left_g = P1^3;//左轉(zhuǎn) 調(diào)頭
南北方向紅燈
sbit n_bike_r = P1^4;//自行車
sbit n_right_r = P1^5;//右轉(zhuǎn)
sbit n_up_r = P1^6;//直行
sbit n_left_r = P1^7;//左轉(zhuǎn) 調(diào)頭 南北方向黃燈
sbit n_bike_y = P3^0;//自行車
sbit n_right_y = P3^1;//右轉(zhuǎn)
sbit n_up_y = P3^2;//直行
sbit n_left_y = P3^3;//左轉(zhuǎn) 調(diào)頭
東西方向綠燈
sbit e_bike_g = P2^0;//自行車
sbit e_right_g = P2^1;//右轉(zhuǎn)
sbit e_up_g = P2^2;//直行
東西方向紅燈
sbit e_bike_r = P2^4;//自行車
sbit e_right_r = P2^5;//右轉(zhuǎn)
sbit e_up_r = P2^6;//直行
東西方向黃燈
sbit e_bike_y = P3^4;//自行車
sbit e_right_y = P3^5;//右轉(zhuǎn)
sbit e_up_y = P3^6;//直行
*/ //延時(shí)
void delay(UINT t, UINT s){ while(t){ UINT i;
for(i = 0;i < s;i++){ } t--;} }
//信號(hào)燈狀態(tài)
void time_x(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3){
P1 = P_P1;P2 = P_P2;P3 = P_P3;delay(150, 65535);}
void time_s(UCHAR P_P1, UCHAR P_P2, UCHAR P_P3, UCHAR P_P11, UCHAR P_P22){ UINT i;
for(i = 0;i < 3;i ++){
P1 = P_P1;P2 = P_P2;delay(5, 65535);P1 = P_P11;P2 = P_P22;delay(5, 65535);}
P1 = P_P1;P2 = P_P2;P3 = P_P3;delay(10, 65535);} //主程序
void main(){
P1 = P2 = P3 = 0x0;while(1){
time_x(0xA5, 0x38, 0x0);
time_s(0xA4, 0x38, 0x1, 0xA5, 0x38);time_x(0x96, 0x52, 0x0);
time_s(0x92, 0x52, 0x4, 0x96, 0x52);time_x(0x5A, 0x52, 0x0);
time_s(0x50, 0x50, 0x2A, 0x5A, 0x52);time_x(0xF0, 0x25, 0x0);
time_s(0xF0, 0x24, 0x20, 0xF0, 0x25);time_x(0xD2, 0x16, 0x0);
time_s(0xD0, 0x10, 0x62, 0xD2, 0x16);} }
給你一個(gè)定時(shí)控制的信號(hào)系統(tǒng),我只做的簡(jiǎn)單的測(cè)試,至于延時(shí)我用的軟件,你自己想辦法。^_^
Dai_Weis 于 2005-5-4 13:43:23 重新給你說(shuō)明
/*
*********************************************************************************** * *
* Keil C AT89S51 交通信號(hào)控制程序 * *(C)版權(quán)所有 Dai_Weis@hotmail.com * * *
*********************************************************************************** 開(kāi)發(fā)說(shuō)明:
固定時(shí)間信號(hào)變換,南北設(shè)置調(diào)頭、左傳、直行、右轉(zhuǎn)、自行車。
東西設(shè)置左傳、直行、右轉(zhuǎn)、自行車。
時(shí)序狀態(tài):
紅 綠 紅 綠
序號(hào) 左 前 右 自 左 前 右 自 前 右 自 前 右 自1 0 1 0 0 1 0 1 1 1 1 0 0 0 2 1 0 0 1 0 1 1 0 1 0 1 0 1 0 3 0 1 0 1 1 0 1 0 1 0 1 0 1 0 4 1 1 1 1 0 0 0 0 0 1 0 1 0 1 5 1 1 0 1 0 0 1 0 0 0 1 1 1 0 */
另外修正個(gè)錯(cuò)誤
while(1){
time_x(0xA5, 0x70, 0x0);time_s(0xA4, 0x70, 0x1, 0xA5, 0x70);
材料: 1、89S51 11.0592M 晶振
1K電阻、10UF電容
12個(gè)燈,紅、黃、綠各四個(gè),12個(gè)1K電阻
,十字路口嘛。蜂鳴器一個(gè)。
按鍵一個(gè),按鍵復(fù)位
采用AT89s51型號(hào)的單片機(jī),由于交通十字路口的對(duì)稱性,所以一個(gè)引腳可以同時(shí)控制兩個(gè)燈,將發(fā)光二極管分別接到P1各個(gè)引腳,在其中加入一個(gè)時(shí)振蕩當(dāng)電路,來(lái)控制時(shí)間,在P3.0引腳接入蜂鳴器只黃燈亮的時(shí)候發(fā)出聲響,這里我們讓每次黃燈亮的時(shí)候發(fā)出六聲響,通過(guò)C程序的控制就可以實(shí)現(xiàn),每次循環(huán)是10秒。2、9cm*15cm萬(wàn)用板 1片 單片機(jī)及IC座 1套 12M晶振 1只 22P電容 2只 10uF電容 1只 10K電阻 1只 1K排阻 1只 兩位一體數(shù)碼管 2只 DC座 1只 自鎖開(kāi)關(guān) 1只
發(fā)光二極管紅綠黃
各4只 按鍵 7只 USB電源線 1條 導(dǎo)線
若干
1、基于51系列單片機(jī)(型號(hào):STC89C52、AT89C51/C52、AT89S51/S52,隨機(jī)選擇,如有特
殊要求請(qǐng)與店主討論)設(shè)計(jì)實(shí)現(xiàn)。(以上幾種單片機(jī)全部為51系列單片機(jī),除了名字不一樣外,功能及應(yīng)用完全一樣,互相
兼容)
2、兩個(gè)兩位一體數(shù)碼管顯示東西、南北方向時(shí)間。
3、四方向各有紅綠黃三顆燈。
4、七個(gè)按鍵操作,分別是:禁止通行、東西通行、南北通行、時(shí)間加、時(shí)間減、切換方向、確認(rèn)。
第二篇:基于單片機(jī)的交通燈控制系統(tǒng)設(shè)計(jì)
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)用單片機(jī)頭文件
#define uchar unsigned char
//宏定義“uchar”代替“unsigned char”。#define uint unsigned int
//宏定義“uint”用來(lái)定義無(wú)符號(hào)整型數(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ù)碼管的個(gè)位數(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;//東西
南北 倒計(jì)時(shí)變量 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時(shí)鐘
sbit sda=P3^5;//寫24C02數(shù)據(jù)
uchar flag_jtd_mode;//交通燈的模式 根據(jù)時(shí)間
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;
//東西、南北的時(shí)間 uchar flag_jdgz;
//交通管制
//---延時(shí)函數(shù)---// void delay(){;;}
void start()//起始信號(hào) { sda=1;delay();scl=1;delay();sda=0;delay();}
void stop()//停止信號(hào) { sda=0;delay();scl=1;delay();sda=1;delay();}
void respons()//應(yīng)答信號(hào) { uchar i;scl=1;delay();while((sda==1)&&(i<250))i++;scl=0;delay();}
void init()//初始狀態(tài),24C02的數(shù)據(jù)和時(shí)鐘線都拉高 { 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();//起始信號(hào)
writebyte(0xa0);//寫入器件地址寫 respons();
writebyte(address);//寫入存儲(chǔ)單元地址 respons();
writebyte(date);//寫入數(shù)據(jù) respons();
stop();//停止信號(hào) }
uchar readadd(uchar address)//讀24C02 { uchar date;
start();//起始信號(hào)
writebyte(0xa0);//寫入器件地址寫
respons();
writebyte(address);//寫入讀單元地址
respons();
}
start();//起始信號(hào)
writebyte(0xa1);//讀命令 respons();date=readbyte();//讀數(shù)據(jù) stop();//停止信號(hào) 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()* 功能 : 延時(shí)1ms函數(shù) * 輸入 : q * 輸出 : 無(wú)
***********************************************************************/ void delay_1ms(uint q){ uint i,j;for(i=0;i for(j=0;j<110;j++);} /******************************************************************** * 名稱 : display()* 功能 : 數(shù)碼管顯示 * 輸入 : 無(wú) * 輸出 : 無(wú) ***********************************************************************/ void display(){ uchar i;for(i=0;i P0 = 0xff; //消隱 smg_we_switch(i); //位選 P0 = dis_smg[i]; //段選 delay_1ms(3);} } /*********************定時(shí)器0、定時(shí)器1初始化******************/ void time0_init() { EA = 1; //開(kāi)總中斷 TMOD = 0X11;//定時(shí)器0、定時(shí)器1工作方式1 ET0 = 1; //開(kāi)定時(shí)器0中斷 TR0 = 1; //允許定時(shí)器0定時(shí) } /*********************交通燈處理函數(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; //南北時(shí)間 else dx_s = dx_time; //東西時(shí)間 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]; /***********************南北時(shí)間*********************************/ 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) //當(dāng)小于5秒時(shí) 黃燈要閃了 { 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;//滅 /***********************東西時(shí)間*********************************/ 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) //當(dāng)小于5秒時(shí) 黃燈要閃了 { 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;//滅 } /********************獨(dú)立按鍵程序*****************/ uchar key_can;//按鍵值 void key()//獨(dú)立按鍵程序 { static uchar key_new;key_can = 20; //按鍵值還原 P1 |= 0x1f; if((P1 & 0x1f)!= 0x1f)//按鍵按下 { delay_1ms(1); //按鍵消抖動(dòng) if(((P1 & 0x1f)!= 0x1f)&&(key_new == 1)) { key_new = 0;switch(P1 & 0x1f){ //確認(rèn)是按鍵按下 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è)置東西的時(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è)置南北的時(shí)間 { if(key_can == 2){ nb_time ++;//加1 if(nb_time > 99) nb_time = 99;} if(key_can == 3){ nb_time--;//減1 //顯示東西設(shè)置的時(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è)置的時(shí)候 writeadd(2,nb_time);//保存數(shù)據(jù) } } /******************************************************************** * 名稱 : main()* 功能 : 實(shí)現(xiàn)燈的閃爍 * 輸入 : 無(wú) * 輸出 : 無(wú) ***********************************************************************/ void main(){ time0_init(); init();//24C02初始化 nb_time=readadd(2);//讀取地址2處一個(gè)字節(jié)給 dx_time=readadd(4);//讀取地址4處一個(gè)字節(jié)給 if(nb_time>99)nb_time=20; if(dx_time>99)dx_time=30; dx_s = nb_time; //東西時(shí)間 while(1){ key(); if(key_can < 20) key_with(); if((menu_1 == 0)&&(flag_jdgz == 0)) } } jiaotongdeng_dis();display();/*********************定時(shí)器0中斷服務(wù)程序************************/ void time0_int()interrupt 1 { } static uchar value; //定時(shí)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;} 基于單片機(jī)的交通燈控制系統(tǒng)設(shè)計(jì) 摘要:十字路口車輛穿梭,行人熙攘,車行車道,人行人道,有條不紊。那么靠什么來(lái)實(shí)現(xiàn)這井然秩序呢?靠的就是交通信號(hào)燈的自動(dòng)指揮系統(tǒng)。交通信號(hào)燈控制方式很多。本系統(tǒng)采用MSC-51系列單片機(jī)ATSC51和可編程并行I/O接口芯片8255A為中心器件來(lái)設(shè)計(jì)交通燈控制囂,實(shí)現(xiàn)了能根據(jù)實(shí)際車流量通過(guò)8051芯片的P1口設(shè)置紅、綠燈燃亮?xí)r間的功能;紅綠燈循環(huán)點(diǎn)亮。倒計(jì)時(shí)剩5秒時(shí)黃燈閃爍警示;車輛闖紅燈報(bào)警;綠燈時(shí)間可檢測(cè)車流量并可通過(guò)雙位數(shù)碼管顯示。本系統(tǒng)實(shí)用性強(qiáng)、操作簡(jiǎn)單、擴(kuò)展功能強(qiáng)。 關(guān)鍵詞:?jiǎn)纹瑱C(jī);交通燈 單片機(jī)技術(shù)的發(fā)展對(duì)社會(huì)進(jìn)步產(chǎn)生了巨大的影響。今天,單片機(jī)及其應(yīng)用技術(shù)的發(fā)展速度、深度及其廣度,在國(guó)防、科學(xué)研究、政治經(jīng)濟(jì)、教育文化等方面幾乎無(wú)所不及。將之用于交通燈控制系統(tǒng)設(shè)計(jì),對(duì)于疏導(dǎo)交通流量、提高道路通行能力,減少交通事故有明顯效果。 1、單片機(jī)涵義 一臺(tái)能夠工作的計(jì)算機(jī)要有這樣幾個(gè)部份構(gòu)成:CPU(進(jìn)行運(yùn)算、控制)、RAM(數(shù)據(jù)存儲(chǔ))、ROM(程序存儲(chǔ))、輸入,輸出設(shè)備(例如:串行口、并行輸出口等)。在個(gè)人計(jì)算機(jī)上這些部份被分成若干塊芯片,安裝一個(gè)稱之為主板的印刷線路板上。而在單片機(jī)中,這些部份,全部被做到一塊集成電路芯片中了,所以就際=缸單片(單芯片)機(jī),單片機(jī)即微控制器(Microniroller μC)有一些單片機(jī)中除了上述部份外,還集成了其它部份如AID,DIA,定時(shí)計(jì)數(shù)器,RTC,各種串行接口等。 2、MSC-51芯片簡(jiǎn)介 2.1 MSC-51結(jié)構(gòu) 8051是MCS-51系列單片機(jī)的典型產(chǎn)品,8051單片機(jī)包含中央處理器、程序存儲(chǔ)器(ROM)、數(shù)據(jù)存儲(chǔ)器(RAM)、定時(shí),計(jì)數(shù)器、并行接口、串行接口和中斷系統(tǒng)等幾大單元及數(shù)據(jù)總線、地址總線和控制總線等三大總線。 2.2 8255芯片簡(jiǎn)介 8255可編程并行接口芯片有三個(gè)輸入輸出端口,即A口、B口和c口,對(duì)應(yīng)于引腳PAT—PA0、PB7-PB0和PC7-PC0。其內(nèi)部還有一個(gè)控制寄存器,即控制口。通常A口、B口作為輸入輸出的數(shù)據(jù)端口。c口作為控制或狀態(tài)信息的端口,它在方式字的控制下,可以分成4位的端口,每個(gè)端口包含一個(gè)4位鎖存器。它們分別與端口A/B配合使用,可以用作控制信號(hào)輸出或作為狀態(tài)信號(hào)輸入。 8255有兩種控制命令字;一個(gè)是方式選擇控制字;另一個(gè)是c口按位置位/復(fù)位控制字。 2.3 74LS373簡(jiǎn)介 SN74LS373。SN74LS374常用的8d鎖存器。常用作地址鎖存和I/0輸出,可以用74he373代換,74H373是高速CMOS器件,功能與74LS373相同,兩者可以互換。74LS373內(nèi)有8個(gè)相同的D型(三態(tài)同相)鎖存器,由兩個(gè)控制端(11腳c或EN;1腳OUT、CONT、OE)控制。當(dāng)OE接地時(shí),若G為高電平,741Ls373接收由PPU輸出的地址信號(hào);如果G為低電平,則將地址信號(hào)鎖存。 3、系統(tǒng)硬件 3.1 交通管理的方案論證 東西、南北兩干道交于一個(gè)十字路口,各干道有一組紅、黃、綠三色的指示燈,指揮車輛和行人安全通行。紅燈亮禁止通行。綠燈亮允許通行。黃燈亮提示人們注意紅、綠燈的狀態(tài)即將切換,且黃燈燃亮?xí)r間為東西、南北兩千道的公共停車時(shí)問(wèn)。設(shè)東西道比南北道的車流量。 3.2 系統(tǒng)硬件設(shè)計(jì) 選用設(shè)備8031單片機(jī)一片選用設(shè)備:8031彈片機(jī)一片,8255并行通用接口芯片一片,74LS07兩片,MAX692‘看門狗’一片,共陰極的七段數(shù)碼管兩個(gè)雙向晶閘管若干,7805三端穩(wěn)壓電源一個(gè),紅、黃、綠交通燈各兩個(gè)。開(kāi)關(guān)鍵盤、連線若干。 4、控制器的軟件設(shè)計(jì) 4.1 每秒鐘的設(shè)定 延時(shí)方法可以有兩種:一種是利用NCS-51內(nèi)部定時(shí)器才生溢出中斷來(lái)確定1秒的時(shí)間,另一種是采用軟延時(shí)的方法。 4.2 計(jì)數(shù)器硬件延時(shí) 4.2.1 初值計(jì)算 定時(shí)器工作時(shí)必須給計(jì)數(shù)器送計(jì)數(shù)器初值,這個(gè)值是送到TH和TL中的。他是以加法記數(shù)的,并能從全1到全0時(shí)自動(dòng)產(chǎn)生溢出中斷請(qǐng)求。因此,我們可以把計(jì)數(shù)器記滿為零所需的計(jì)數(shù)值設(shè)定為c和計(jì)數(shù)初值設(shè)定為TC。 4.2.2 1秒的方法 我們采用在主程序中設(shè)定一個(gè)初值為20的軟件計(jì)數(shù)器和使TO定時(shí)5O毫秒,這樣每當(dāng)TO到50毫秒時(shí)cPu就響應(yīng)它的溢出中斷請(qǐng)求,進(jìn)入他的中斷服務(wù)子程序。在中斷服務(wù)子程序中,cPu先使軟件計(jì)數(shù)器減1,然后判斷它是否為零。為零表示1秒已到可以返回到輸出時(shí)間顯示程序。 4.3 計(jì)數(shù)器軟件延時(shí) MCS-51的工作頻率為2-12MHZ,我們選用的8031單片機(jī)的工作頻率為6MHZ。機(jī)器周期與主頻有關(guān),機(jī)器周期是主頻的12倍,所以一個(gè)機(jī)器周期的時(shí)間為12*(1/6M)=2us。我們可以知道具體每條指令的周期數(shù),這樣我們就可以通過(guò)指令的執(zhí)行條數(shù)來(lái)確定1秒的時(shí)間。 4.4 時(shí)間及信號(hào)燈的顯示 4.4.1 8051并行口的擴(kuò)展 8051雖然有4個(gè)8位I/0端口,但真正能提供借用的只有Pl口。因?yàn)镻2和P0口通常用于傳送外部傳送地址和數(shù)據(jù),P3口也有它的第二功能。因此,8031通常需要擴(kuò)展。由于我們用外部輸入設(shè)定紅綠燈倒計(jì)時(shí)初值、數(shù)碼管的輸出顯示、紅綠黃信號(hào)燈的顯示都要用到一個(gè)I/0端口,顯然8031的端口是不夠,需要擴(kuò)展。 擴(kuò)展的方法有兩種:(1)借用外部RAM地址來(lái)擴(kuò)展I/0端口;(2)采用I/0接口新片來(lái)擴(kuò)充。我們用8255并行接口信片來(lái)擴(kuò)展I/0端口。 4.4.2 8255與8051的連接 用8051的PO口的pO.7連接8255的片選信號(hào),我們用8031的地址采用全譯碼方式,當(dāng)pO.7:0時(shí)片選有效,其他無(wú)效,pO.1用于選擇8255端口。 5、結(jié) 論 本系統(tǒng)就是充分利用了8051和8255芯片的I/O引腳。系統(tǒng)統(tǒng)采用MSC-51系列單片機(jī)Intel8051和可編程并行I/0接口芯片8255A為中心器件來(lái)設(shè)計(jì)交通燈控制器,實(shí)現(xiàn)了能根據(jù)實(shí)際車流量通過(guò)8031芯片的Pl口設(shè)置紅、綠燈燃亮?xí)r間的功能;紅綠燈循環(huán)點(diǎn)亮,倒計(jì)時(shí)剩5秒時(shí)黃燈閃爍警示(交通燈信號(hào)通過(guò)PA口輸出,顯示時(shí)間直接通過(guò)8255的PC口輸出至雙位數(shù)碼管);車輛闖紅燈報(bào)警;綠燈時(shí)間可檢測(cè)車流量并可通過(guò)雙位數(shù)碼管顯示。 參考文獻(xiàn): [1]張毅剛,新編MCS-51單片機(jī)應(yīng)用系統(tǒng)設(shè)計(jì)[M]哈爾濱:哈爾濱工業(yè)大學(xué)出版社,2006 [2]王義軍,單片機(jī)原理及應(yīng)用習(xí)題與實(shí)驗(yàn)指導(dǎo)書[M],北京:中國(guó)電力出版社,2006 [3]陳明熒8051單片機(jī)課程設(shè)計(jì)實(shí)訓(xùn)教材[M],北京:清華大學(xué)出版社。2004 單片機(jī)原理及系統(tǒng)課程設(shè)計(jì)報(bào)告 基于單片機(jī)的交通燈控制系統(tǒng) 引言 單片機(jī)是一種集成電路芯片,是采用超大規(guī)模集成電路技術(shù)把具有數(shù)據(jù)處理能力的中央處理器CPU隨機(jī)存儲(chǔ)器RAM、只讀存儲(chǔ)器ROM、多種I/O口和中斷系統(tǒng)、定時(shí)器/計(jì)時(shí)器等功能(可能還包括顯示驅(qū)動(dòng)電路、脈寬調(diào)制電路、模擬多路轉(zhuǎn)換器、A/D轉(zhuǎn)換器等電路)集成到一塊硅片上構(gòu)成的一個(gè)小而完善的微型計(jì)算機(jī)系統(tǒng),在工業(yè)控制領(lǐng)域具有廣泛的應(yīng)用。本文設(shè)計(jì)了基于單片機(jī)的交通燈控制系統(tǒng)以AT89C51單片機(jī)為核心芯片,通過(guò)控制三色LED燈的亮滅來(lái)控制各車道的通行。設(shè)計(jì)方案及原理 本系統(tǒng)由AT89C51單片機(jī)、紅、黃、綠LED交通信號(hào)燈、共陰極數(shù)碼管、緊急通車開(kāi)關(guān)等模塊組成該電路具有設(shè)計(jì)簡(jiǎn)單,顯示亮度高,能耗小,可靠性高燈特點(diǎn)。其總體設(shè)計(jì)框圖如圖1所示。 復(fù)位電路七段數(shù)碼管倒計(jì)時(shí)顯示電路AT89C51晶振電路A、B車道LED顯示電路按鍵電路 圖1 系統(tǒng)總體設(shè)計(jì)方框圖 2.1 系統(tǒng)設(shè)計(jì) 交通燈控制系統(tǒng)主要控制A,B兩車道的交通,以AT89C51單片機(jī)為核心芯片,通過(guò)控制三色LED燈的亮滅來(lái)控制各車道的通行;另外通過(guò)3個(gè)按鍵來(lái)模擬各車道有無(wú)車輛的情況和有緊急車輛的情況。根據(jù)設(shè)計(jì)要求,制定總體設(shè)計(jì)思想如下: (1)用AT89C51單片機(jī)控制交通燈電路,晶振采用12MHz。(2)用發(fā)光二極管模擬交通信號(hào)燈,用按鍵開(kāi)關(guān)模擬車輛檢測(cè)信號(hào)。 (3)有緊急車輛通過(guò)時(shí),按下K3開(kāi)關(guān)使A、B車道均為紅燈,禁行20s。此時(shí), 基于C51單片機(jī)的交通燈控制系統(tǒng) 1、實(shí)驗(yàn)方案論證: 進(jìn)行十字路口的交通信號(hào)燈控制電路設(shè)計(jì),畫出電路原理圖及實(shí)驗(yàn)電路圖,進(jìn)行軟件編程、以及使用說(shuō)明文檔的建立等一整套工作任務(wù)。進(jìn)行十字路口的交通信號(hào)燈控制程序設(shè)計(jì),提交一個(gè)符合上述功能要求的十字路口的交通信號(hào)燈控制系統(tǒng)設(shè)計(jì)。 2、控制流程分析: 對(duì)設(shè)計(jì)要求進(jìn)行分析后可得出以下交通工作狀態(tài)表: 3、硬件設(shè)計(jì)概要: 根據(jù)設(shè)計(jì)要求,可用6個(gè)LED燈分別模擬東西、南北的交通燈。具體接法如下: AT89C51的P1口接LED燈,P1.0、P1.1、P1.2分別接?xùn)|西方向紅、綠、黃交通燈,P1.3、P1.4、P1.5分別接南北方向的紅、綠、黃交通燈。P1口和LED燈之間要接限流保護(hù)電阻。兩位數(shù)碼管段選接P2口,位選接P0口低兩位,P0口低兩位接上拉電阻使其可以輸出高電平。緊急情況按鈕一端接地,另一端與外中斷1引腳相連;恢復(fù)正常按鈕一端接地,另一端與外中斷0引腳相連。 三、原理圖設(shè)計(jì) 1、LED顯示部分電路設(shè)計(jì): 把單片機(jī)AT89C51的P1口作為紅黃綠燈顯示部分,用6個(gè)LED燈分別模擬東西、南北的交通燈。P1.0、P1.1、P1.2各通過(guò)一個(gè)300Ω的限流保護(hù)電阻接?xùn)|西方向的紅、綠、黃LED燈;P1.3、P1.4、P1.5各通過(guò)一個(gè)300Ω的限流保護(hù)電阻接南北方向的紅、綠、黃LED燈。LED燈的一端接電源,另一端經(jīng)電阻接P1口,因此當(dāng)P1口引腳輸出低電平時(shí)LED燈發(fā)光,即此方案采取低電平驅(qū)動(dòng)方式。具體電路如下: 2、緊急情況處理電路設(shè)計(jì): 緊急情況按鈕一端接地,另一端與外中斷1引腳相連;恢復(fù)正常按鈕一端接地,另一端與外中斷0引腳相連。在程序設(shè)計(jì)時(shí),我會(huì)將其設(shè)置為下降沿觸發(fā)方式。具體電路如下: 3、數(shù)字顯示電路設(shè)計(jì): 選用共陰極兩位數(shù)碼管。兩位數(shù)碼管A~G引腳各通過(guò)一個(gè)300Ω的限流保護(hù)電阻分別接P2.0~P2.6,位選1引腳和2引腳分別接P0.0口低兩位,P0口低兩位接5kΩ的上拉電阻使其可以輸出高電平。 4、其他部分電路: XTAL1端和XTAL2端之間接一個(gè)12M Hz的晶振,再各接一個(gè)30pF的普通電容后接地;RST復(fù)位端一端經(jīng)10uF的電解電容接+5V電源,一端經(jīng)一個(gè)10K的電阻接地。具體電路如下: 4、系統(tǒng)電路總圖: 四、程序設(shè)計(jì): 1、定時(shí)器初值的計(jì)算: 由于要求定時(shí)時(shí)間相當(dāng)精確,我用定時(shí)器T0進(jìn)行定時(shí)。根據(jù)公式可知若已知要求的定時(shí)時(shí)間為t,則定時(shí)器的初值為x(其中fosc=12M Hz) : 需要定時(shí)器的定時(shí)時(shí)間為50ms,根據(jù)公式計(jì)算得出X=15536,因此定時(shí)器初值的低位TL0=(0B0H),高位TH0=(3CH)。 2、程序流程圖: 2.1主程序流程 主程序主要是對(duì)單片機(jī)進(jìn)行初始化。初始化首先要開(kāi)放總中斷、定時(shí)器T0中斷以及外部中斷0和外部中斷1。其次是設(shè)置中斷優(yōu)先級(jí),把外中斷0設(shè)置為高優(yōu)先級(jí),外中斷1設(shè)置為低優(yōu)先級(jí)。再次是給定時(shí)器T0裝頂初值,然后后是啟動(dòng)定時(shí)器,是使定時(shí)器開(kāi)始定時(shí)。最后是等待中斷。 2.2緊急情況中斷處理流程 緊急情況中斷處理包括兩部分,第一部分是出現(xiàn)緊急情況可以手動(dòng)使東西、南北方向紅燈全亮,而且直到緊急狀況解除后才能恢復(fù)正常通車。這就要求緊急狀況解除前不能退出外中斷1處理程序,因此要在外中斷1處理程序處設(shè)置一無(wú)限循環(huán)。第二部分是緊急狀況解除。為了使外中斷1處理程序退出無(wú)限循環(huán),可用中斷嵌套使機(jī)器轉(zhuǎn)去執(zhí)行外中斷0處理程序,而外中斷0處理程序修改了寄存器R2的值,中斷返回后由于寄存器R2的值的改變使外中斷1處理程序跳循環(huán)。2.2.1外中斷1處理程序(低優(yōu)先級(jí))2.2.2外中斷0處理程序(高優(yōu)先級(jí)) 1.3定時(shí)器中斷處理流程 Y Y 3、程序源代碼: ORG 0000H AJMP START ORG 0003H;外中斷0入口 AJMP SERV0 ORG 000BH AJMP SERV1 ORG 0013H AJMP SERV2 ORG 0030H START:MOV IE,#87H MOV IP,#01H MOV TMOD,#01H MOV TCON,#05H MOV TH0,#3CH MOV TL0,#0B0H MOV DPTR,#TAB MOV P1,#0F6H MOV R0,#20 MOV R5,#00H MOV R6,#00H SETB TR0 LOOP1:MOV P0,#02H MOV A,R6 MOVC A,@A+DPTR MOV P2,A ACALL D10MS MOV P0,#01H MOV A,R5 MOVC A,@A+DPTR MOV P2,A ACALL D10MS AJMP LOOP1;外中斷1入口;定時(shí)器中斷入口 設(shè)置中斷優(yōu)先級(jí);裝定時(shí)器初值;裝表首地址;啟動(dòng)定時(shí)器;循環(huán)動(dòng)態(tài)顯示,由10秒開(kāi)始倒計(jì)時(shí) SERV0:MOV R2,#0FFH;正常狀態(tài)恢復(fù)程序,使R0的值不為0 RETI SERV1:DJNZ R0,NEXT;未到1秒,則轉(zhuǎn)到NEXT CJNE R5,#01,DHE0 AJMP DHE3 DHE0: CJNE R5,#00H,DHE1 CJNE R6,#00H,DHE2 MOV R5,#00H MOV R6,#01H MOV P1,#0F5H AJMP OUT0 DHE1: DEC R5 AJMP OUT0 DHE2: MOV R6,#00H MOV R5,#09H OUT0: MOV R0,#20 RETI DHE3: MOV P0,#00H MOV P2,#3FH MOV A,P1 MOV R1,#05H JNB ACC.0,CHE0 YELL0:SETB P1.0 SETB P1.1 CLR P1.2 ACALL DMS SETB P1.2 ACALL DMS DJNZ R1,YELL0 MOV P1,#0EEH SJMP NEXT1 CHE0: JNB ACC.3,CHE1 YELL1:SETB P1.3 SETB P1.4 CLR P1.5;減1秒;顯示為0;東西方向紅燈亮,則轉(zhuǎn)到CHE0;東西方向綠燈滅;東西方向黃燈閃爍5次;東西方向紅燈亮,南北方向綠燈亮;南北方向綠燈滅 ACALL DMS SETB P1.5 ACALL DMS DJNZ R1,YELL1;南北方向黃燈閃爍5次 CHE1: MOV P1,#0F5H;南北方向紅燈亮,東西方向綠燈亮 NEXT1:MOV R0,#20 MOV R5,#00H MOV R6,#01H;重置顯示為10秒 NEXT: MOV TH0,#3CH;重裝定時(shí)器初值 MOV TL0,#0B0H RETI SERV2:MOV P0,#00H MOV P2,#3FH;顯示為0 MOV R5,#00H MOV R6,#00H MOV R2,#00H;緊急狀況服務(wù)程序,使R2的值為0 MOV P1,#0F6H LOOP3:CJNE R2,#00H,OUT1;R2的值為0,則無(wú)限循環(huán),直到執(zhí)行SERV0狀 MOV R3,#02H;態(tài)恢復(fù)程序,使R0的值不為0才返回 DJNZ R3,LOOP3 OUT1: RETI DMS: MOV 32H,#4;延時(shí)子程序,延時(shí)0.4秒 DL0: MOV 31H,#200 DL1: MOV 30H,#250 DL2: DJNZ 30H,DL2 DJNZ 31H,DL1 DJNZ 32H,DL0 RET D10MS:MOV 33H,#50;延時(shí)子程序,延時(shí)10毫秒 DL3: MOV 34H,#100 DL4: DJNZ 34H,DL4 DJNZ 33H,DL3 RET TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END 五、仿真結(jié)果與分析 在PROTEUS軟件仿真中的結(jié)果如下: 1、初始狀態(tài) 2、東西路口的綠燈亮,南北路口的紅燈亮 3、東西路口綠燈滅,黃燈閃爍 4、東西路口紅燈亮,南北路口的綠燈亮 5、南北路口綠燈滅,黃燈閃爍 由以上仿真結(jié)果可以看出,電路圖和源程序設(shè)計(jì)完全滿足設(shè)計(jì)要求。 六、課程設(shè)計(jì)總結(jié)與體會(huì) 通過(guò)這次課程設(shè)計(jì)我鞏固和加深課堂所學(xué)知識(shí);掌握一般軟硬件的設(shè)計(jì)方法和查詢、運(yùn)用資料的能力;掌握通過(guò)定時(shí)器進(jìn)行定時(shí)的基本方法、中斷控制的原理和方法以及LED控制的方法。 這次課程設(shè)計(jì),我將課本上的理論知識(shí)和實(shí)際的應(yīng)用有機(jī)的結(jié)合起來(lái),提高分析和解決問(wèn)題的實(shí)際能力,通過(guò)對(duì)匯編語(yǔ)言程序代碼的設(shè)計(jì)、編寫、修改以提高自己實(shí)際編程能力。 總的來(lái)說(shuō),這次課程設(shè)計(jì)的難度不算大,整個(gè)設(shè)計(jì)、調(diào)試任務(wù)都有我獨(dú)立完成。而在PROTEUS軟件仿真中的結(jié)果可以看到我的設(shè)計(jì)完全符合要求。在設(shè)計(jì)過(guò)程中我還認(rèn)識(shí)到,遇到問(wèn)題時(shí)應(yīng)回到書本,查找實(shí)際問(wèn)題所需的理論知識(shí),將理論和實(shí)際結(jié)合起來(lái)。這樣,在解決問(wèn)題的同時(shí)還能提高我對(duì)理論知識(shí)的理解。第三篇:基于單片機(jī)的交通燈控制系統(tǒng)設(shè)計(jì)
第四篇:基于單片機(jī)的交通燈控制系統(tǒng)
第五篇:基于C51單片機(jī)的交通燈控制系統(tǒng)