基于Proteus仿真的交通信號燈設計——利用匯編語言實現(xiàn)
設計要求
基本信息
- 采用AT89C51單片機
- 晶振頻率:12MHZ
- 紅綠燈:發(fā)光二極管
- 數(shù)字顯示:LED數(shù)碼管
- 東西南北四個方向,一次循環(huán)共有六個狀態(tài),且每個狀態(tài)的倒計時時間一樣
交通狀態(tài)
- 東西紅燈22s,南北綠燈22s(數(shù)碼管從0到21);
- 東西紅燈5s,南北綠燈5s且沒0.5s閃爍一次(數(shù)碼管從0到4);
- 東西紅燈4s,南北綠燈4s且沒0.5s閃爍一次(數(shù)碼管從0到3);
- 東西綠燈22s,南北紅燈22s(數(shù)碼管從0到21);
- 東西綠燈5s且沒0.5s閃爍一次,南北紅燈5s(數(shù)碼管從0到4);
- 東西綠燈4s沒0.5s閃爍一次,南北紅燈4s(數(shù)碼管從0到3);
電路仿真原理圖
電路總體布局
復位電路
晶振電路
LED指示燈電路
P1口控制LED燈的亮滅,高電平點亮,低電平熄滅
數(shù)碼管顯示電路
P0與P2口控制數(shù)碼管的顯示,低電平點亮,高電平熄滅;由于P0口不能輸出高電平,故接一個上拉電阻RP1(此處解釋來自網絡——上拉電阻RP1的目的是使P0口可輸出高電平)文章來源:http://www.zghlxwxcb.cn/news/detail-490551.html
匯編語言代碼(注釋很詳細)
;分配內存和IO口
DATE_EW EQU 30H;定義兩個計數(shù)變量
DATE_NS EQU 31H
R_EW BIT P1.0;定義信號燈變量
Y_EW BIT P1.1
G_EW BIT P1.2
G_NS BIT P1.3
Y_NS BIT P1.4
R_NS BIT P1.5
ORG 0000H
;初始化程序
START:MOV P1,#0;控制9個紅綠燈,高電平,高電平點亮,此處清零
MOV P2,#0FFH;控制數(shù)碼管十位,低電平點亮,此處全滅
MOV P0,#0FFH;控制數(shù)碼管個位,低電平點亮,此處全滅
;***************狀態(tài)1**************東西紅燈22s,南北綠燈22s
STATE1:MOV P1,#0;清除上一狀態(tài)的燈況
SETB R_EW;點亮東西紅燈
SETB G_NS;點亮南北綠燈
MOV DATE_EW,#21;賦值
MOV DATE_NS,#21
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP1:LCALL DISPLAY1;調用數(shù)碼管顯示子程序
DEC R7;數(shù)碼管數(shù)字減一,東西南北倒計時一樣
DEC R6
MOV A,R7
CJNE A,#0,LOOP1;A不等于0,則繼續(xù)循環(huán)
LCALL DISPLAY1;再執(zhí)行一遍,0也要顯示
LJMP STATE2;執(zhí)行狀態(tài)2
;***************狀態(tài)2**************東西紅燈5s,南北綠燈5s且?guī)чW爍
STATE2:MOV P1,#0;清除上一狀態(tài)的燈況
MOV DATE_EW,#4;賦值
MOV DATE_NS,#4
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP2:LCALL DISPLAY2;調用數(shù)碼管顯示子程序
SETB R_EW;點亮東西紅燈
SETB G_NS;點亮南北綠燈
LCALL DELAY1
CLR G_NS;熄滅南北綠燈
DEC R7;數(shù)碼管數(shù)字減一,東西南北倒計時一樣
DEC R6
MOV A,R7
CJNE A,#0,LOOP2;A不等于0,則繼續(xù)循環(huán)
LCALL DISPLAY2;再執(zhí)行一遍,0也要顯示
LJMP STATE3;執(zhí)行狀態(tài)3
;***************狀態(tài)3**************東西紅燈5s,南北綠燈5s且?guī)чW爍
STATE3:MOV P1,#0;清除上一狀態(tài)的燈況
MOV DATE_EW,#3;賦值
MOV DATE_NS,#3
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP3:LCALL DISPLAY2;調用數(shù)碼管顯示子程序
SETB R_EW;點亮東西紅燈
SETB Y_NS;點亮南北黃燈
LCALL DELAY1
CLR Y_NS;熄滅南北黃燈
DEC R7;數(shù)碼管數(shù)字減一,東西南北倒計時一樣
DEC R6
MOV A,R7
CJNE A,#0,LOOP3;A不等于0,則繼續(xù)循環(huán)
LCALL DISPLAY2;再執(zhí)行一遍,0也要顯示
LJMP STATE4;執(zhí)行狀態(tài)4
;***************狀態(tài)4**************東西綠燈22s,南北紅燈22s
STATE4:MOV P1,#0;清除上一狀態(tài)的燈況
SETB G_EW;點亮東西綠燈
SETB R_NS;點亮南北紅燈
MOV DATE_EW,#21;賦值
MOV DATE_NS,#21
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP4:LCALL DISPLAY1;調用數(shù)碼管顯示子程序
DEC R7;數(shù)碼管數(shù)字減一,東西南北倒計時一樣
DEC R6
MOV A,R7
CJNE A,#0,LOOP4;A不等于0,則繼續(xù)循環(huán)
LCALL DISPLAY1;再執(zhí)行一遍,0也要顯示
LJMP STATE5;執(zhí)行狀態(tài)5
;***************狀態(tài)5**************東西綠燈5s且?guī)чW爍 ,南北紅燈5s
STATE5:MOV P1,#0;清除上一狀態(tài)的燈況
MOV DATE_EW,#4;賦值
MOV DATE_NS,#4
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP5:LCALL DISPLAY2;調用數(shù)碼管顯示子程序
SETB G_EW;點亮東西綠燈
SETB R_NS;點亮南北紅燈
LCALL DELAY1
CLR G_EW;熄滅東西綠燈
DEC R7;數(shù)碼管數(shù)字減一,東西南北倒計時一樣
DEC R6
MOV A,R7
CJNE A,#0,LOOP5;A不等于0,則繼續(xù)循環(huán)
LCALL DISPLAY2;再執(zhí)行一遍,0也要顯示
LJMP STATE6;執(zhí)行狀態(tài)6
;***************狀態(tài)6**************東西黃燈4s且?guī)чW爍 ,南北紅燈4s
STATE6:MOV P1,#0;清除上一狀態(tài)的燈況
MOV DATE_EW,#3;賦值
MOV DATE_NS,#3
MOV R6,DATE_EW
MOV R7,DATE_NS
LOOP6:LCALL DISPLAY2;調用數(shù)碼管顯示子程序
SETB Y_EW;點亮東西黃燈
SETB R_NS;點亮南北紅燈
LCALL DELAY1
CLR Y_EW;熄滅東西黃燈
DEC R7;數(shù)碼管數(shù)字減一,東西南北倒計時一樣
DEC R6
MOV A,R7
CJNE A,#0,LOOP6;A不等于0,則繼續(xù)循環(huán)
LCALL DISPLAY2;再執(zhí)行一遍,0也要顯示
LJMP STATE1
;不閃爍狀態(tài)調用
DISPLAY1:PUSH ACC;保護現(xiàn)場
MOV A,R6;東西方向數(shù)值進累加器A
MOV B,#10;為寄存器B賦值10
DIV AB;進制轉換,十位給A,個位給B
MOV DPTR,#TABLE;查表指令三劍客,配合TABLE使用
MOVC A,@A+DPTR
MOV P2,A;十位數(shù)碼管點亮
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A;個位數(shù)碼管點亮
MOV A,R7;南北方向數(shù)值進累加器A
MOV B,#10;為寄存器B賦值10
DIV AB;進制轉換,十位給A,個位給B
MOV DPTR,#TABLE;查表指令三劍客,配合TABLE使用
MOVC A,@A+DPTR
MOV P2,A;十位數(shù)碼管點亮
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A;個位數(shù)碼管點亮
LCALL DELAY1;調用延時程序,調用兩次0.5,不用寫1s的延時程序了hhh
LCALL DELAY1
POP ACC;恢復現(xiàn)場
RET
;閃爍的狀態(tài)調用
DISPLAY2:PUSH ACC;保護現(xiàn)場
MOV A,R6;東西方向數(shù)值進累加器A
MOV B,#10;為寄存器B賦值10
DIV AB;進制轉換,十位給A,個位給B
MOV DPTR,#TABLE;查表指令三劍客,配合TABLE使用
MOVC A,@A+DPTR
MOV P2,A;十位數(shù)碼管點亮
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A;個位數(shù)碼管點亮
MOV A,R7;南北方向數(shù)值進累加器A
MOV B,#10;為寄存器B賦值10
DIV AB;進制轉換,十位給A,個位給B
MOV DPTR,#TABLE;查表指令三劍客,配合TABLE使用
MOVC A,@A+DPTR
MOV P2,A;十位數(shù)碼管點亮
MOV A,B
MOV DPTR,#TABLE
MOVC A,@A+DPTR
MOV P0,A;個位數(shù)碼管點亮
LCALL DELAY1;調用延時程序
POP ACC;恢復現(xiàn)場
RET
;********閃爍程序,間隔0.5s************這里不用了,直接寫到主程序內部
SPARKLE:SETB R_EW;點亮東西紅燈
SETB G_NS;點亮南北綠燈
LCALL DELAY1
CLR G_NS;熄滅南北綠燈
LCALL DELAY1
RET
;********延時程序,延時0.5s************
DELAY1:MOV R0,#15
D1:MOV R1,#202
D2:MOV R2,#81
D3:DJNZ R2,$; R2一直減1,直到減為0,執(zhí)行下面語句
DJNZ R1,D2
DJNZ R0,D1
RET
;***********數(shù)碼管共陽極字符表(低電平點亮)*********
TABLE:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H;配合查表指令使用
END
資源鏈接
鏈接:https://pan.baidu.com/s/1FOfYZcAPmIF6ZxGwyE21LQ?pwd=0000
提取碼:0000
–來自百度網盤超級會員V4的分享文章來源地址http://www.zghlxwxcb.cn/news/detail-490551.html
到了這里,關于基于Proteus仿真的交通信號燈設計——利用匯編語言實現(xiàn)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!