51單片機(jī)模擬交通信號燈_第1頁
51單片機(jī)模擬交通信號燈_第2頁
51單片機(jī)模擬交通信號燈_第3頁
51單片機(jī)模擬交通信號燈_第4頁
51單片機(jī)模擬交通信號燈_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

word文檔可自由復(fù)制編輯《單片機(jī)實(shí)驗(yàn)》設(shè)計(jì)報(bào)告交通信號燈模擬系統(tǒng)設(shè)計(jì)交通信號燈模擬系統(tǒng)設(shè)計(jì)摘要:本系統(tǒng)以單片機(jī)為核心,主要應(yīng)用單片機(jī)中定時(shí)器計(jì)數(shù)器,IO接口,中斷系統(tǒng)等,結(jié)合8279鍵盤控制電路,數(shù)碼管顯示以及LED燈實(shí)現(xiàn)對十字路口交通信號燈的智能控制。成功實(shí)現(xiàn)了利用單片機(jī)的定時(shí)器定時(shí),令十字路口的紅綠燈交替點(diǎn)亮和熄滅,通過按鍵對紅綠燈點(diǎn)亮和熄滅時(shí)間進(jìn)行調(diào)整及設(shè)置以及對紅綠燈點(diǎn)亮和熄滅時(shí)間進(jìn)行倒計(jì)時(shí)時(shí)間顯示等基本功能。并在此基礎(chǔ)上進(jìn)一步擴(kuò)展,實(shí)現(xiàn)了對某些特殊功能的操作,如:突發(fā)緊急情況,所有路線全部紅燈,或南北向(主干道)強(qiáng)制綠燈通行,以及東西向(次干道)強(qiáng)制綠燈等,并且可在交通高峰期(系統(tǒng)默認(rèn)上午7:00-8:00,下午17:00-18:00)自動(dòng)修改綠燈時(shí)間。系統(tǒng)功能完善,可操控性好,代碼通俗易懂。關(guān)鍵字:51單片機(jī)交通信號燈智能控制8279主要功能:分析題目可知,有兩種方案設(shè)計(jì)的方法,也即兩條不同的主干分別對應(yīng)不同的方案,方案一以鍵盤控制為主干,穿插對系統(tǒng)時(shí)鐘的檢測,倒計(jì)時(shí)的檢測等,系統(tǒng)主干為循環(huán)檢測鍵盤是否被按下并作出相應(yīng)操作。方案二以交通信號燈不同的點(diǎn)亮與熄滅狀態(tài)為主干,即系統(tǒng)的主干是交通燈狀態(tài)的循環(huán),在循環(huán)中檢測按鍵并作出相應(yīng)調(diào)整。此次試驗(yàn)選擇的是方案二,因?yàn)閷Ψ桨敢坏拇a實(shí)現(xiàn)比較復(fù)雜。信號燈的狀態(tài)依次為:南北綠燈,東西紅燈->南北黃燈,東西紅燈->南北紅燈,東西綠燈->南北紅燈,東西黃燈。解決這部分問題的關(guān)鍵在于8279鍵盤掃描和相應(yīng)的數(shù)碼管顯示,在實(shí)驗(yàn)幫助里有詳細(xì)代碼,另一個(gè)難點(diǎn)在于內(nèi)置時(shí)鐘和倒計(jì)時(shí)顯示,這一部分內(nèi)容通過使用單片機(jī)內(nèi)的定時(shí)器能很好的解決,實(shí)驗(yàn)幫助五有詳細(xì)的代碼,通過定時(shí)器T1產(chǎn)生中斷來定時(shí),從而完成一秒的時(shí)間。具體詳見附錄代碼。設(shè)計(jì)的主要內(nèi)容:第一部分,系統(tǒng)開機(jī)界面,設(shè)置及人機(jī)互動(dòng)的按鍵控制,流程圖如下:(相應(yīng)的功能流程圖中已給出)第二部分,系統(tǒng)主干部分,即交通信號燈4個(gè)大循環(huán)以及循環(huán)內(nèi)部檢測按鍵完成拓展功能的實(shí)現(xiàn),在循環(huán)內(nèi)檢測按鍵,實(shí)現(xiàn)相應(yīng)功能,流程如下:具體細(xì)節(jié),例如定時(shí)器的設(shè)計(jì)等在紙質(zhì)檔報(bào)告中有詳細(xì)分析,在這里就不贅述總結(jié):總的來說這次試驗(yàn)比較成功,題目要求的功能基本都實(shí)現(xiàn)了,對于單片機(jī)匯編程序語言的理解也更深刻了,課本上的知識比較分散,每部分之間都沒有什么聯(lián)系,通過實(shí)驗(yàn)很好的把各部分之間聯(lián)系起來,加深記憶,更便于理解。唯一不足的是對于題目的考慮不周,特殊功能采用鍵盤掃描子程序解決了,而沒有采用終端,使得程序應(yīng)激性不好,沒有很好的應(yīng)變性。在以后的編程中會(huì)注意這方面的內(nèi)容。附錄:(詳細(xì)代碼);-------------------------------------------------------Z8279EQU0FF82H;8279狀態(tài)/命令口地址D8279EQU0FF80H;8279數(shù)據(jù)口地址LEDMODEQU00H;左邊輸入八位字符顯示;外部譯碼鍵掃描方式,雙鍵互鎖LEDFEQEQU2FH;掃描速率LEDCLSEQU0C1H;清除顯示RAMLEDWR0EQU80H;設(shè)定的將要寫入的顯示RAM地址READKBEQU40H;讀FIFORAM地址0的命令字;-------------------------------------------------------ORG0000HAJMPSTARTORG001BH;INTT1入口地址AJMPINT_T1ORG0040HSTART:MOVSP,#60HLCALLINIT8279;初始化8279MOVR3,#0H;時(shí)MOVR2,#0H;分MOVR1,#0H;秒MOVR7,#0H;倒計(jì)時(shí)時(shí)間MOVR0,#20;50毫秒MOV40H,#0;用于改變主次干道時(shí)長比MOVR6,#0FFH;標(biāo)志MOVTMOD,#10HMOVTL1,#00H;50毫秒的時(shí)間常數(shù)MOVTH1,#4CHSETBEX0SETBET1SETBEA;允許中斷;初始狀態(tài),全紅燈MOVDPTR,#8300HMOVA,#0FHMOVX@DPTR,A;鍵盤操作WAIT:LCALLGETKEY;讀鍵盤CJNEA,#0FFH,CONT;判斷是否有鍵輸入MOVA,BCJNEA,#3CH,KEY_C;輸入鍵是'C',轉(zhuǎn)CLEAR_TLCALLCLEAR_TKEY_C:CJNEA,#3AH,KEY_A;輸入鍵是'A',轉(zhuǎn)START_TLCALLSTART_TKEY_A:CJNEA,#3DH,KEY_D;輸入鍵是'D',轉(zhuǎn)STOP_TLCALLSTOP_TKEY_D:CJNEA,#3BH,KEY_E;輸入鍵是'B',轉(zhuǎn)SET_TLCALLSET_T;設(shè)置系統(tǒng)時(shí)間KEY_E: CJNEA,#3FH,KEY_B;輸入鍵是'F',轉(zhuǎn)SET_COUTLCALLSET_COUT;設(shè)置倒計(jì)時(shí)間KEY_B: CJNEA,#3EH,CONT;輸入鍵是'E',轉(zhuǎn)MONITORAJMPMONITORCONT:CJNER6,#0FFH,WAIT;若無秒標(biāo)志則循環(huán)LCALLDISPLAY;顯示時(shí)間MOVR6,#0;清標(biāo)志SJMPWAIT;循環(huán)MONITOR:NOPSJMP$;等待回到監(jiān)控;按鍵對應(yīng)的功能CLEAR_T:;時(shí)間清零子程序CLRTR1;關(guān)計(jì)數(shù)器MOVR3,#0H;小時(shí)清零MOVR2,#0H;分鐘清零MOVR1,#0H;秒清零MOVR0,#20;10毫秒清零MOVR7,#0H;倒計(jì)時(shí)時(shí)間清零MOVR6,#0FFH;置秒標(biāo)志RETSTART_T:;電子鐘計(jì)時(shí)子程序;程序主要部分;程序開始執(zhí)行后將循環(huán)在這部分CIRCLE:LCALLSTATION1;南北綠燈,東西紅燈LCALLSTATION2;南北綠燈閃轉(zhuǎn)黃燈,東西紅燈LCALLSTATION3;南北紅燈,東西綠燈LCALLSTATION4;南北紅燈,東西綠燈閃轉(zhuǎn)黃燈LJMPCIRCLERET;STATION1STATION1:;南北綠燈,東西紅燈MOVR7,30HMOVA,R7ADDA,40HMOVR7,AMOVDPTR,#8300HMOVA,#96H;南北綠燈,東西紅燈MOVX@DPTR,ASETBTR1;掃描鍵盤WO1:LCALLGETKEY;讀鍵盤CJNEA,#0FFH,JB1;判斷是否有鍵輸入MOVA,BCJNEA,#3FH,PUSHB1;若是按下F,則清零并且返回MOVR4,#1LCALLGETWORD;讀倒計(jì)時(shí)時(shí)間數(shù)MOVA,BMOVB,#10DIVABSWAPAADDA,BMOVR7,A;保存輸入的值INCAMOV30H,ALCALLDISPLAY;顯示時(shí)間PUSHB1:CJNEA,#3BH,PUSHC1;若是按下B,則清零并且返回WAITCLRTR1;關(guān)計(jì)數(shù)器MOVR3,#0H;小時(shí)清零MOVR2,#0H;分鐘清零MOVR1,#0H;秒清零MOVR0,#20;10毫秒清零MOVR7,#0H;倒計(jì)時(shí)時(shí)間清零MOVR6,#0FFH;置秒標(biāo)志AJMPWAITPUSHC1:CJNEA,#3CH,PUSHD1MOVR7,#3;若按下C,輸出3秒紅燈MOVDPTR,#8300HMOVA,#0FHMOVX@DPTR,APUSHD1: CJNEA,#3DH,PUSHE1;若按下D,南北綠燈5秒MOVR7,#5MOVA,#96HMOVX@DPTR,APUSHE1: CJNEA,#3EH,JB1MOVR7,#5MOVA,#69HMOVX@DPTR,AJB1:CJNER7,#0H,WO1RET;STATION2STATION2:MOVR7,#3MOVDPTR,#8300HMOVA,#06HMOVX@DPTR,ASETBTR1WO2:LCALLGETKEY;讀鍵盤CJNEA,#0FFH,JB2;判斷是否有鍵輸入MOVA,BCJNEA,#3FH,PUSHB2;若是按下F,則清零并且返回 MOVR4,#1LCALLGETWORD;讀倒計(jì)時(shí)時(shí)間數(shù)MOVA,BMOVB,#10DIVABSWAPAADDA,BMOVR7,A;保存輸入的值INCAMOV30H,ALCALLDISPLAY;顯示時(shí)間PUSHB2:CJNEA,#3BH,PUSHC2;若是按下B,則清零并且返回WAITCLRTR1;關(guān)計(jì)數(shù)器MOVR3,#0H;小時(shí)清零MOVR2,#0H;分鐘清零MOVR1,#0H;秒清零MOVR0,#20;10毫秒清零MOVR7,#0H;倒計(jì)時(shí)時(shí)間清零MOVR6,#0FFH;置秒標(biāo)志AJMPWAITPUSHC2:CJNEA,#3CH,PUSHD2MOVR7,#3;若按下C,輸出3秒紅燈MOVDPTR,#8300HMOVA,#0FHMOVX@DPTR,APUSHD2:CJNEA,#3DH,PUSHE2;若按下D,南北綠燈5秒MOVR7,#5MOVA,#96HMOVX@DPTR,APUSHE2:CJNEA,#3EH,JB2MOVR7,#5MOVA,#69HMOVX@DPTR,AJB2:CJNER7,#0H,WO2RET;STATION3STATION3:;南北紅燈,東西綠燈MOVR7,30HMOVDPTR,#8300HMOVA,#69HMOVX@DPTR,ASETBTR1WO3:LCALLGETKEY;讀鍵盤CJNEA,#0FFH,JB3;判斷是否有鍵輸入MOVA,BCJNEA,#3FH,PUSHB3;若是按下F,則清零并且返回MOVR4,#1LCALLGETWORD;讀倒計(jì)時(shí)時(shí)間數(shù)MOVA,BMOVB,#10DIVABSWAPAADDA,BMOVR7,A;保存輸入的值INCAMOV30H,ALCALLDISPLAY;顯示時(shí)間PUSHB3:CJNEA,#3BH,PUSHC3;若是按下B,則清零并且返回WAITCLRTR1;關(guān)計(jì)數(shù)器MOVR3,#0H;小時(shí)清零MOVR2,#0H;分鐘清零MOVR1,#0H;秒清零MOVR0,#20;10毫秒清零MOVR7,#0H;倒計(jì)時(shí)時(shí)間清零MOVR6,#0FFH;置秒標(biāo)志AJMPWAITPUSHC3:CJNEA,#3CH,PUSHD3MOVR7,#3;若按下C,輸出3秒紅燈MOVDPTR,#8300HMOVA,#0FHMOVX@DPTR,APUSHD3:CJNEA,#3DH,PUSHE3;若按下D,南北綠燈5秒MOVR7,#5MOVA,#96HMOVX@DPTR,APUSHE3:CJNEA,#3EH,JB3MOVR7,#5MOVA,#69HMOVX@DPTR,AJB3:CJNER7,#0H,WO3RET;STATION4STATION4:MOVR7,#3MOVDPTR,#8300HMOVA,#09HMOVX@DPTR,ASETBTR1WO4:LCALLGETKEY;讀鍵盤CJNEA,#0FFH,JB4;判斷是否有鍵輸入MOVA,BCJNEA,#3FH,PUSHB4;若是按下F,則清零并且返回 MOVR4,#1LCALLGETWORD;讀倒計(jì)時(shí)時(shí)間數(shù)MOVA,BMOVB,#10DIVABSWAPAADDA,BMOVR7,A;保存輸入的值INCAMOV30H,ALCALLDISPLAY;顯示時(shí)間PUSHB4:CJNEA,#3BH,PUSHC4;若是按下B,則清零并且返回WAITCLRTR1;關(guān)計(jì)數(shù)器MOVR3,#0H;小時(shí)清零MOVR2,#0H;分鐘清零MOVR1,#0H;秒清零MOVR0,#20;10毫秒清零MOVR7,#0H;倒計(jì)時(shí)時(shí)間清零MOVR6,#0FFH;置秒標(biāo)志AJMPWAITPUSHC4:CJNEA,#3CH,PUSHD4MOVR7,#3;若按下C,輸出3秒紅燈MOVDPTR,#8300HMOVA,#0FHMOVX@DPTR,APUSHD4:CJNEA,#3DH,PUSHE4;若按下D,南北綠燈5秒MOVR7,#5MOVA,#96HMOVX@DPTR,APUSHE4:CJNEA,#3EH,JB4MOVR7,#5MOVA,#69HMOVX@DPTR,AJB4:CJNER7,#0H,WO4RET;電子鐘停止的部分STOP_T:;電子鐘停止計(jì)時(shí)子程序CLRTR1RET;時(shí)鐘設(shè)置部分SET_T:;設(shè)置初值子程序CLRTR1;關(guān)計(jì)數(shù)器MOVR4,#7LCALLGETWORD;讀小時(shí)數(shù)CJNEA,#0FFH,INVALID;判斷輸入合法性MOVA,BADDA,#232JCINVALID;判斷輸入小時(shí)值<24MOVA,BMOVB,#10DIVABSWAPAADDA,BMOVR3,A;保存輸入的值MOVR4,#5LCALLGETWORD;讀分鐘數(shù)CJNEA,#0FFH,INVALID;判斷輸入合法性MOVA,BADDA,#196JCINVALID;判斷輸入分鐘數(shù)<60MOVA,BMOVB,#10DIVABSWAPAADDA,BMOVR2,A;保存輸入的值MOVR4,#3LCALLGETWORD;讀秒鐘數(shù)CJNEA,#0FFH,INVALID;判斷輸入合法性MOVA,BADDA,#196JCINVALID;判斷輸入分鐘值<60MOVA,BMOVB,#10DIVABSWAPAADDA,BMOVR1,A;保存輸入的值A(chǔ)JMPSET_TOKSET_COUT:MOVR4,#1LCALLGETWORD;讀倒計(jì)時(shí)時(shí)間數(shù)CJNEA,#0FFH,INVALID;判斷輸入合法性MOVA,BMOVB,#10DIVABSWAPAADDA,BMOVR7,A;保存輸入的值INCAMOV30H,AAJMPSET_TOKINVALID:LCALLCLEAR_T;時(shí)間清零SET_TOK:LCALLDISPLAY;顯示時(shí)間RET;讀取輸入按鍵的部分GETWORD:;讀數(shù)子程序WKEY1:LCALLGETKEY;讀鍵盤CJNEA,#0FFH,WKEY1;無鍵輸入,則再讀MOVA,BADDA,#0C6HJCERROR1;判斷輸入是否大于9MOVA,BSUBBA,#30HJCERROR1;判斷輸入是否小于0MOVR5,ALCALLDISLED;顯示輸入的字符MOVB,#10MULABPUSHACC;保存輸入的值WKEY2:LCALLGETKEY;讀鍵盤CJNEA,#0FFH,WKEY2;無鍵輸入則再讀MOVA,BADDA,#0C6H;判斷輸入是否大于9JCERROR2MOVA,BSUBBA,#30H;判斷輸入是否小于0JCERROR2DECR4MOVR5,ALCALLDISLED;顯示輸入的字符MOVB,APOPACCADDA,BMOVB,A;把得到的值存在BMOVA,#0FFH;置合法輸入標(biāo)志AJMPKEYOKERROR2:POPACCERROR1:MOVA,#0;置非法輸入標(biāo)志KEYOK:RET;8279初始化INIT8279:;8279初始化子程序PUSHDPH;保存現(xiàn)場PUSHDPLPUSHACCLCALLDELAY;延時(shí)MOVDPTR,#Z8279MOVA,#LEDMOD;置8279工作方式MOVX@DPTR,AMOVA,#LEDFEQ;置鍵盤掃描速率MOVX@DPTR,AMOVA,#LEDCLS;清除LED顯示MOVX@DPTR,APOPACC;恢復(fù)現(xiàn)場POPDPLPOPDPHRET;讀取鍵盤子程序GETKEY:;輸入:無;輸出:B:讀到的鍵碼A:按鍵的標(biāo)志PUSHDPH;保存現(xiàn)場PUSHDPLPUSHPSWMOVDPTR,#Z8279MOVXA,@DPTR;讀8279狀態(tài)ANLA,#07H;屏蔽D7-D3JNZGETVAL;判斷是否有鍵輸入MOVA,#0H;置標(biāo)志(無鍵輸入)SJMPNKBHITGETVAL:MOVA,#READKB;讀FIFORAM命令MOVX@DPTR,AMOVDPTR,#D8279MOVXA,@DPTR;讀鍵ANLA,#3FH;屏蔽SHIFT和CTRL鍵MOVDPTR,#KEYCODE;鍵碼表起始地址MOVCA,@A+DPTR;查表MOVB,A;置返回鍵值MOVA,#0FFH;置標(biāo)志(有鍵輸入)NKBHIT:POPPSW;恢復(fù)現(xiàn)場POPDPLPOPDPHRET;T1定時(shí)器中斷控制部分,INT_T1:;INT_T1中斷服務(wù)子程序PUSHDPH;保護(hù)現(xiàn)場PUSHDPLPUSHACCPUSHPSWMOVTL1,#00H;50毫秒定時(shí)常數(shù)MOVTH1,#4CHDJNZR0,EXIT;判斷毫秒=0MOVR0,#20;DELAY1SECONDMOVR6,#0FFH;置秒標(biāo)志COUNT1:MOVA,R7ADDA,#99HDAAMOVR7,A;減1CJNER1,#59H,SECOND;判斷秒=59MOVR1,#99HCJNER2,#59H,MINUTE;判斷分=59MOVR2,#99HCJNER3,#23H,HOUR;判斷時(shí)=23MOVR3,#99HHOUR:MOVA,R3ADDA,#1;時(shí)加1DAAMOVR3,AMINUTE:MOVA,R2ADDA,#1;分加1DAAMOVR2,ASECOND:MOVA,R1ADDA,#1;秒加1DAAMOVR1,A;判斷是否到了特定時(shí)間7~8,17~18點(diǎn)CJNER3,#7,EXIT1MOV40H,#5SJMPSHOWT CJNER3,#00010111B,EXIT1MOV40H,#5SJMPSHOWTEXIT1:MOV40H,#0SHOWT:CJNER6,#0FFH,EXIT;若無秒標(biāo)志則循環(huán)LCALLDISPLAY;顯示時(shí)間MOVR6,#0;清標(biāo)志EXIT:POPPSW;恢復(fù)現(xiàn)場POPACCPOPDPLPOPDPHRETI;中斷返回;實(shí)驗(yàn)幫助11延時(shí)部分,不太清楚具體功能是什么,可能是鍵盤消抖DELAY:;延時(shí)子程序PUSH0;保存現(xiàn)場PUSH1MOV0,#0HDELAY1:MOV1,#0HDJNZ1,$DJNZ0,DELAY1POP1;恢復(fù)現(xiàn)場POP0RET;顯示控制部分,但不是具體顯示部分DISPLAY:MOVA,R3ANLA,#0FHADDA,#10HMOVR5,AMOVR4,#6LCALLDISLED;顯示小時(shí)低位MOVA,R3SWAPAANLA,#0FHMOVR5,AMOVR4,#7LCALLDISLED;顯示小時(shí)高位MOVA,R2ANLA,#0FHADDA,#10HMOVR5,AMOVR4,#4LCALLDISLED;顯示分鐘低位MOVA,R2SWAPAANLA,#0F

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論