基于51單片機(jī)的帶時(shí)間顯示和緊急控制的交通燈的設(shè)計(jì)
;特別說(shuō)明,本程序僅供單片機(jī)愛(ài)好者自己學(xué)習(xí)使用,
;不得做為其它商業(yè)用途
;此程序在硬件上調(diào)試通
;晶振頻率為11.0592MHZ
;用定時(shí)器1延時(shí),外部中斷0接緊急控制
;R0為100MS延時(shí)常數(shù),R2為狀態(tài)延時(shí)常數(shù)
;8279控制數(shù)碼管顯示時(shí)間
;用P1口控制雙色燈
;此程序?qū)懹?007-7-6,作者:徐學(xué)軍
Z8279 EQU 0FF82H ;8279 狀態(tài)/命令口地址
D8279 EQU 0FF80H ;8279 數(shù)據(jù)口地址
LEDMOD EQU 00H ;左邊輸入 八位字符顯示
;外部譯碼鍵掃描方式,雙鍵互鎖
LEDFEQ EQU 33H ;掃描速率
LEDCLS EQU 0C1H ;清除顯示 RAM
LEDWR0 EQU 80H ;設(shè)定的將要寫(xiě)入的顯示RAM地址
ORG 0000H
LJMP START
ORG 0003H ;INT 0 中斷入口地址
LJMP INT_0
ORG 001BH ;T1中斷入口地址
LJMP INT_T1
ORG 0040H
START:
MOV SP,#60H
MOV TMOD,#10H ;置T1為方式1
SETB EX0 ;INT 0 中斷有效
SETB IT0
SETB EA
MOV TL1,#00H ;延時(shí)50mS常數(shù)
MOV TH1,#4cH
MOV R0,#2 ;延時(shí)100mS常數(shù)
SETB TR1 ;啟動(dòng)T1
SETB ET1
setb pt1 ;必須設(shè)置定時(shí)器1的中斷優(yōu)先級(jí)高于外部中斷0
LCALL INIT8279 ;初始化8279
LCALL STATUS0 ;初始狀態(tài)(都是紅燈)
CIRCLE:
LCALL STATUS1 ;南北綠燈,東西紅燈
LCALL STATUS2 ;南北綠燈閃轉(zhuǎn)黃燈,東西紅燈
LCALL STATUS3 ;南北紅燈,東西綠燈
LCALL STATUS4 ;南北紅燈,東西綠燈閃轉(zhuǎn)黃燈
LJMP CIRCLE
INT_0:
PUSH PSW ;保護(hù)現(xiàn)場(chǎng)
PUSH 2
PUSH 90H
clr ex0
MOV P1,#0FH ;南北,東西都亮紅燈
MOV R2,#100 ;延時(shí)10秒
LCALL DELAY_DISPLAY
setb ex0
POP 90H ;恢復(fù)現(xiàn)場(chǎng)
POP 2
POP PSW
RETI
INT_T1:
PUSH ACC
PUSH PSW
CLR TR1
MOV TL1,#00H ;延時(shí) 50mS 常數(shù)
MOV TH1,#4CH
SETB TR1
DJNZ R0,EXIT
MOV R0,#2 ;延時(shí) 100ms常數(shù)
DEC R2
EXIT:
POP PSW
POP ACC
RETI
STATUS0: ;南北紅燈,東西紅燈
MOV P1,#0FH
MOV R2,#10 ;延時(shí)1秒
LCALL DELAY_DISPLAY
RET
STATUS1: ;南北綠燈,東西紅燈
MOV P1,#96H ;南北綠燈,東西紅燈
MOV R2,#200 ;延時(shí)20秒
LCALL DELAY_DISPLAY
RET
STATUS2: ;南北綠燈閃轉(zhuǎn)黃燈,東西紅燈
MOV R3,#03H ;綠燈閃3次
FLASH:
MOV P1,#9FH
MOV R2,#03H
LCALL DELAY_DISPLAY
MOV P1,#96H
MOV R2,#03H
LCALL DELAY_DISPLAY
DJNZ R3,FLASH
MOV P1,#06H ;南北黃燈,東西紅燈
MOV R2,#10 ;延時(shí)1秒
LCALL DELAY_DISPLAY
RET
STATUS3: ;南北紅燈,東西綠燈
MOV P1,#69H
MOV R2,#200 ;延時(shí)20秒
LCALL DELAY_DISPLAY
RET
STATUS4: ;南北紅燈,東西綠燈閃轉(zhuǎn)黃燈
MOV R3,#03H ;綠燈閃3次
FLASH1:
MOV P1,#6FH
MOV R2,#03H
LCALL DELAY_DISPLAY
MOV P1,#69H
MOV R2,#03H
LCALL DELAY_DISPLAY
DJNZ R3,FLASH1
MOV P1,#09H ;南北紅燈,東西黃燈
MOV R2,#10 ;延時(shí)1秒
LCALL DELAY_DISPLAY
NOP
RET
INIT8279: ;8279初始化子程序
PUSH DPH ;保存現(xiàn)場(chǎng)
PUSH DPL
PUSH ACC
LCALL DELAY ;延時(shí)
MOV DPTR ,#Z8279
MOV A,#LEDMOD ;置8279工作方式
MOVX @DPTR,A
MOV A,#LEDFEQ ;置鍵盤(pán)掃描速率
MOVX @DPTR,A
MOV A,#LEDCLS ;清除 LED 顯示
MOVX @DPTR,A
LCALL DELAY ;延時(shí)
POP ACC ;恢復(fù)現(xiàn)場(chǎng)
POP DPL
POP DPH
RET
;顯示字符子程序
;輸入: R4,位置 R5,值
DISLED:
PUSH DPH ;保存現(xiàn)場(chǎng)
PUSH DPL
PUSH ACC
MOV A,#LEDWR0 ;置顯示起始地址
ADD A,R4 ;加位置偏移量
MOV DPTR,#Z8279
MOVX @DPTR,A ;設(shè)定顯示位置
MOV DPTR,#LEDSEG ;置顯示常數(shù)表起始位置
MOV A,R5
MOVC A,@A+DPTR ;查表
MOV DPTR,#D8279
MOVX @DPTR,A ;顯示數(shù)據(jù)
POP ACC ;恢復(fù)現(xiàn)場(chǎng)
POP DPL
POP DPH
RET
DELAY: ;延時(shí)子程序
PUSH 0 ;保存現(xiàn)場(chǎng)
PUSH 1
MOV 0,#0H
DELAY1:
MOV 1,#0H
DJNZ 1,$
DJNZ 0,DELAY1
POP 1 ;恢復(fù)現(xiàn)場(chǎng)
POP 0
RET
DELAY_DISPLAY: ;延時(shí)和顯示時(shí)間子程序
PUSH 1
PUSH 0
push acc
loopwait: mov b,#10
mov a,2
div ab
mov b,#10
div ab
mov r4,#1
mov r5,a
LCALL DISLED ;顯示秒高位
mov r4,#0
mov r5,b
LCALL DISLED ;顯示秒低位
mov a,2
jnz loopwait ;延時(shí)等待
pop acc
POP 0
POP 1
RET
LEDSEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;'0,1,2,3,4,5,6,7'
DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H ;'8,9,A,B,C,D,E,F'
END
評(píng)論