新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > 基于51单片机的带时间显示和紧急控制的交通灯的设计

基于51单片机的带时间显示和紧急控制的交通灯的设计

作者:时间:2012-10-26来源:网络收藏

;特别说明,本程序仅供单片机爱好者自己学习使用,


;不得做为其它商业用途


;此程序在硬件上调试通
;晶振频率为11.0592MHZ
;用定时器1延时,外部中断0接
;R0为100MS延时常数,R2为状态延时常数
;8279控制数码管显示时间
;用P1口控制双色灯
;此程序写于2007-7-6,作者:徐学军
Z8279 EQU 0FF82H ;8279 状态/命令口地址
D8279 EQU 0FF80H ;8279 数据口地址
LEDMOD EQU 00H ;左边输入 八位字符显示
;外部译码键扫描方式,双键互锁
LEDFEQ EQU 33H ;扫描速率
LEDCLS EQU 0C1H ;清除显示 RAM
LEDWR0 EQU 80H ;设定的将要写入的显示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 ;延时50mS常数
MOV TH1,#4cH
MOV R0,#2 ;延时100mS常数
SETB TR1 ;启动T1
SETB ET1
setb pt1 ;必须设置定时器1的中断优先级高于外部中断0
LCALL INIT8279 ;初始化8279



LCALL STATUS0 ;初始状态(都是红灯)
CIRCLE:
LCALL STATUS1 ;南北绿灯,东西红灯
LCALL STATUS2 ;南北绿灯闪转黄灯,东西红灯
LCALL STATUS3 ;南北红灯,东西绿灯
LCALL STATUS4 ;南北红灯,东西绿灯闪转黄灯
LJMP CIRCLE
INT_0:
PUSH PSW ;保护现场
PUSH 2
PUSH 90H
clr ex0
MOV P1,#0FH ;南北,东西都亮红灯
MOV R2,#100 ;延时10秒
LCALL DELAY_DISPLAY
setb ex0
POP 90H ;恢复现场
POP 2
POP PSW
RETI
INT_T1:
PUSH ACC
PUSH PSW
CLR TR1
MOV TL1,#00H ;延时 50mS 常数
MOV TH1,#4CH
SETB TR1
DJNZ R0,EXIT
MOV R0,#2 ;延时 100ms常数
DEC R2
EXIT:
POP PSW
POP ACC
RETI

STATUS0: ;南北红灯,东西红灯
MOV P1,#0FH
MOV R2,#10 ;延时1秒
LCALL DELAY_DISPLAY
RET
STATUS1: ;南北绿灯,东西红灯
MOV P1,#96H ;南北绿灯,东西红灯
MOV R2,#200 ;延时20秒
LCALL DELAY_DISPLAY
RET
STATUS2: ;南北绿灯闪转黄灯,东西红灯
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 ;延时1秒
LCALL DELAY_DISPLAY
RET
STATUS3: ;南北红灯,东西绿灯
MOV P1,#69H
MOV R2,#200 ;延时20秒
LCALL DELAY_DISPLAY
RET
STATUS4: ;南北红灯,东西绿灯闪转黄灯
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 ;延时1秒
LCALL DELAY_DISPLAY
NOP
RET
INIT8279: ;8279初始化子程序
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
LCALL DELAY ;延时
MOV DPTR ,#Z8279
MOV A,#LEDMOD ;置8279工作方式
MOVX @DPTR,A
MOV A,#LEDFEQ ;置键盘扫描速率
MOVX @DPTR,A
MOV A,#LEDCLS ;清除 LED 显示
MOVX @DPTR,A
LCALL DELAY ;延时
POP ACC ;恢复现场
POP DPL
POP DPH
RET
;显示字符子程序
;输入: R4,位置 R5,值
DISLED:
PUSH DPH ;保存现场
PUSH DPL
PUSH ACC
MOV A,#LEDWR0 ;置显示起始地址
ADD A,R4 ;加位置偏移量
MOV DPTR,#Z8279
MOVX @DPTR,A ;设定显示位置
MOV DPTR,#LEDSEG ;置显示常数表起始位置
MOV A,R5
MOVC A,@A+DPTR ;查表
MOV DPTR,#D8279
MOVX @DPTR,A ;显示数据
POP ACC ;恢复现场
POP DPL
POP DPH
RET
DELAY: ;延时子程序
PUSH 0 ;保存现场
PUSH 1
MOV 0,#0H
DELAY1:
MOV 1,#0H
DJNZ 1,$
DJNZ 0,DELAY1
POP 1 ;恢复现场
POP 0
RET

DELAY_DISPLAY: ;延时和显示时间子程序
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 ;延时等待
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



评论


相关推荐

技术专区

关闭