|
能不能在這個(gè)交通燈系統(tǒng)里,加上一個(gè)緊急狀態(tài)按鍵,使所有紅燈亮。
單片機(jī)程序在下面:
ORG 0000H ;主函數(shù)地址
LJMP MAIN
ORG 000BH ;中斷定時(shí)器0 地址
LJMP INTERPUT
ORG 0030H ;表的首地址
LJMP TABLE
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
MAIN:
MOV P2, #00H ;給P2 口賦初值,讓數(shù)碼管剛開(kāi)始都不亮
MOV R2, #60 ;給R2 賦60,使東西的數(shù)碼管顯示初值為60
MOV R3, #40 ;給R3 賦40,使南北的數(shù)碼管顯示初值為40
MOV P3, #0 ;使人形道的燈初始都不亮
MOV R5, #0 ;給R5,R6 賦初值0
MOV R6, #0
MOV TMOD, #01H ;定時(shí)器0 工作方式1
MOV TH0, #79 ;給定時(shí)器賦初值
MOV TL0, #0AEH
SETB EA ;允許總中斷
SETB EX0
SETB IT0
SETB ET0 ;開(kāi)啟定時(shí)器0 中斷
SETB TR0 ;開(kāi)啟定時(shí)器計(jì)時(shí)
L2:
LCALL DISPLAY1 ;顯示東西數(shù)碼管
LCALL DISPLAY2 ;顯示南北數(shù)碼管
LCALL CHOOSE1 ;調(diào)用東西判斷函數(shù)
LCALL CHOOSE2 ;調(diào)用南北判斷函數(shù)
SJMP L2 ;一直循環(huán)
INTERPUT:
MOV TH0, #22H ;定時(shí)器中斷里重現(xiàn)給定時(shí)器0 賦初值
MOV TL0, #0D8H
MOV A, R4
INC R4 ;定時(shí)器中斷一次50MS,中斷一次R4+1
CJNE A, #20,L3 ; 判斷是不是加到20 了,即定時(shí)器定時(shí)1S
MOV R4, #0 ;R4 加到20,則清0
DEC R3 ;要是定時(shí)1S 到了,則把R2,和R3 的值都減1
DEC R2
L3:
RETI ;中斷退出
CHOOSE1: ;東西判斷函數(shù)
MOV A, R5 ;R5是一個(gè)標(biāo)志
CJNE A, #1, K1 ;判斷R5 是不是等于1,不等于1 跳到K1
MOV A, R2 ;要是標(biāo)志位等于1
CJNE A, #4, K5 ;而且R2 等于4,則開(kāi)啟黃燈,關(guān)閉車(chē)道綠燈
SETB P3.2
CLR P3.3
SJMP K3
K5: JNC K3 ;要是R2 小于4 則閃爍綠燈
CPL P1.7
MOV A, R2
CJNE A, #0, K3 ;判斷R2 是不是等于0,
INC R5 ;等于0 則讓標(biāo)志位+1
CLR P3.2 ;清黃燈,開(kāi)車(chē)道的左行綠燈,置人行道紅燈
SETB P3.0
MOV R2, #20
SETB P2.6
CLR P2.7
SJMP K3
K1: JNC K2 ;CJNE 這個(gè)指令比較好R5 和1 的值,要是R5 大于1,則C=0,反之C=1,這里判斷C 是否等于0,既判斷是否小于1,小于1 執(zhí)行下行, 大于1 則跳轉(zhuǎn)K2
MOV A, R2
CJNE A, #60, K7 ;初值狀態(tài)R2 是60,判斷R2 是不是60,60 的話開(kāi)車(chē)道的紅燈,開(kāi)人行道的綠燈
SETB P3.1
SETB P2.7
CLR P2.6
SJMP K3 ;退出
K7: CJNE A, #0, K3 ;要是R2 不等于60,判斷R2 是不是等于0,等于0 則把標(biāo)志位R5 加1,讓車(chē)道綠燈亮,紅燈滅,人行道紅燈亮
INC R5
CLR P3.1
SETB P3.3
MOV R2, #40 ;再給數(shù)碼管賦初值
CLR P2.7
SETB P2.6
SJMP K3 ;退出
K2: MOV A, R2 ;標(biāo)志位R5 大于1 則跳到這里
CJNE A, #4, K6 ;判斷R2 和4 的值, 等于4 則開(kāi)啟黃燈, 關(guān)閉車(chē)道的綠燈,要是不等于是,則跳到K6
CLR P3.0
SETB P3.2 SJMP K3
K6: JNC K3 ;判斷R2 是不是小于4,小于4 則閃爍黃燈,大于4 則直接退出
CPL P3.2 ;取反
MOV A, R3
CJNE A, #0, K3 ;判斷R2 是不是等于0
MOV R5, #0 ;等于0 則清標(biāo)志位,因?yàn)槲覀冎辉O(shè)置了0.1.2 這三個(gè)狀態(tài),到2了以后要清0,讓他重新開(kāi)始循環(huán)
MOV R2, #60 ;給R2 賦初值,開(kāi)車(chē)道紅燈,關(guān)車(chē)道左行綠燈,開(kāi)人行道綠燈,關(guān)人行道紅燈
SETB P3.1
CLR P3.2
SETB P2.7
CLR P2.6
K3: RET
CHOOSE2: ;南、北判斷函數(shù),程序和東、西判斷一致
MOV A, R6
CJNE A, #1, H2
MOV A, R3
CJNE A, #4, H6
SETB P3.6
CLR P3.4
SJMP H3
H6: JNC H3
CPL P3.6
CJNE A, #0, H3
INC R6
CLR P3.6
SETB P3.5
MOV R3, #60
SETB P2.4
CLR P2.5
SJMP H3
H2: JNC H4
MOV A, R3
CJNE A, #40,H7
SETB P3.7
SETB P2.5
CLR P2.4
SJMP H3
H7: MOV A, R3
CJNE A, #4, H5
SETB P3.6
CLR P3.7
SJMP H3
H5: JNC H3
CPL P3.6
CJNE A, #0, H3
SETB P3.4
CLR P3.6
INC R6
MOV R3, #20
SETB P2.5
CLR P2.4
SJMP H3
H4:
MOV A, R3
CJNE A, #0, H3
SETB P3.7
CLR P3.5
MOV R6, #0
MOV R3, #40
SETB P2.5
CLR P2.4
H3: RET
DISPLAY1: ;顯示東西數(shù)碼管(動(dòng)態(tài)顯示)
MOV A, R2 ;將R2 放到A 中
MOV B, #10
DIV AB ;將2 位的10 進(jìn)制數(shù)的十位和個(gè)位分開(kāi)
MOV DPTR, #TABLE ; 取TABLE 表的首地址給DPTR
MOVC A, @A+DPTR ;把表的第N 個(gè)數(shù)據(jù)給A
MOV P1, A ;把數(shù)據(jù)送到數(shù)碼管中
SETB P2.0 ;顯示數(shù)碼管
LCALL DELAY ;延時(shí)
CLR P2.0 ;把數(shù)碼管暗掉
MOV A ,B ;把個(gè)位給A
MOVC A, @A+DPTR ;把表的個(gè)位個(gè)數(shù)給A
MOV P1, A ;把數(shù)據(jù)送到數(shù)碼管中
SETB P2.1 ;顯示數(shù)據(jù)
LCALL DELAY ;延時(shí)
CLR P2.1 ;讓數(shù)碼管暗掉
RET
DISPLAY2: ;顯示南北數(shù)碼管(顯示函數(shù)和上面一樣,這里注釋就不寫(xiě)了)
MOV A, R3
MOV B, #10
DIV AB
MOV DPTR, #TABLE
MOVC A, @A+DPTR
MOV P0, A
SETB P2.2
LCALL DELAY
CLR P2.2
MOV A, B
MOVC A, @A+DPTR
MOV P0, A
SETB P2.3
LCALL DELAY
CLR P2.3
RET
DELAY: ;延時(shí)函數(shù)
MOV R0, #20
L1: MOV R1, #25
DJNZ R1, $
DJNZ R0, L1
RET
END
|
-
圖片1.png
(71 KB, 下載次數(shù): 102)
下載附件
2018-12-30 14:43 上傳
|