用8051单片机设计一交通信号灯模拟控制系统,晶振采用12MHz,具体要求:正常情况下,A、B道(A、B道交叉组成十字路口,A是主道,B是支道)轮流放行:
1:A道放行10s: (1)用定时器实现0.5s延时()
(2)用8段数码管来显示10s延时,如用4个数码管显示开始为“A10B10”,延时一秒后,下一个显示为“A9B9”。
(3)同时用16*16点阵来显示通行的图标“A->”,用2个8*8点阵显示禁止图标“B●”;
2:B道放行8秒: (1)用定时器实现0.5s延时
(2)用8段数码管来显示8s倒计时,开始为“A8B8”,延时一秒后,下一个显示为“A7B7”。
(3)同时用16*16点阵来显示通行的图标“A●”,“B->”。
3:A道有车,B道无车时,使有车车道放行(不需要实现A道无车,B道有车的情况):
(1) A放行6秒
(2) 数码管显示计时6秒,即“A6B6”
(3) 点阵显示“A->”“B●”
4:有紧急车辆通过时,A、B都是红灯。
(1) 延时5秒
(2) 数码管显示计时5秒,即“A5B5”
(3) 点阵显示“A->”“B●”
5:思考:怎样实现点阵图形可以从左到右滚动。
各位高手帮帮我,怎么样实现几个模块的连接,我的程序不能加进去,还有数码管的程序没有,请帮忙补,实现上面的效果,请帮忙改正 谢谢谢谢]
显示点阵
ROW EQU 30H
DOT EQU 31H
DOT1 equ 32h
ROW1 EQU 33H
DOT2 EQU 34H
DOT3 equ 35h
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV DPTR,#TAB
MOV ROW,#01H
MOV ROW1,#01H
MOV DOT,#00H
MOV DOT1,#00H
mov DOT2,#00h
MOV DOT3,#00H
MOV R7,#08H
; MOV R6,#10H
NEXT_COL: MOV A,ROW
mov DPTR,#0FFE2H
MOVX @DPTR,A
;MOV P2,A
RL A
MOV ROW,A
MOV A,DOT
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0FFE0H
MOVX @DPTR,A
MOV A,DOT1
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV DPTR,#0FFE3H
MOVX @DPTR,A
;MOV P0,A
LCALL DELAY_1MS
INC DOT
inc DOT1
DJNZ R7,NEXT_COL
CLR A
mov DPTR,#0FFE2H
MOVX @DPTR,A
;LCALL DELAY_1MS
MOV R7,#08H
NEXT_COL1: MOV A,ROW1
mov DPTR,#0FFE1H
MOVX @DPTR,A
MOV P2,A
RL A
MOV ROW1,A
MOV A,DOT2
MOV DPTR,#TAB3
MOVC A,@A+DPTR
MOV DPTR,#0FFE0H
MOVX @DPTR,A
MOV A,DOT3
MOV DPTR,#TAB2
MOVC A,@A+DPTR
MOV DPTR,#0FFE3H
MOVX @DPTR,A
MOV P0,A
LCALL DELAY_1MS
INC DOT2
inc DOT3
DJNZ R7,NEXT_COL1
CLR A
mov DPTR,#0FFE1H
MOVX @DPTR,A
SJMP MAIN
TAB: DB 08H,0cH,0eH,0ffH,0ffH,0eH,0cH,08H
TAB1: db 18h,24h,42h,81h,0ffh,81h,81h,81h
TAB2: db 7Ch,42h,42h,7Ch,7Ch,42h,42h,7Ch
TAB3: db 3Ch,7Eh,0FFh,0FFh,0FFh,0FFh,7Eh,3Ch
DELAY_1MS: MOV R4,#250
D0: NOP
NOP
DJNZ R4,D0
RET
END
交通灯控制程序
ORG 0000H
AJMP MAIN ;指向主程序
ORG 0003H
AJMP INTT0 ;指向紧急车辆出现中断程序
ORG 0013H
AJMP INTT1 ;指向一道有车另一道无车中断程序
ORG 0100H
MAIN: SETB PX0 ;置外部中断0为高优先级中断
MOV TCON,#00H ;置外部中断0、1为电平触发
MOV TMOD,#10H ;置定时器1为方式1
MOV IE,#85H ;开CPU中断,开外中断0、1中断
DISP: MOV P1,#0F3H ;A绿灯放行,B红灯禁止
MOV R2,#6EH ;置0.5秒循环次数
DISP1: ACALL DELAY ;调用0.5秒延时子程序
DJNZ R2,DISP1 ;55秒不到继续循环
MOV R2,#06 ;置A绿灯闪烁循环次数
WARN1: CPL P1.2 ;A绿灯闪烁
ACALL DELAY
DJNZ R2,WARN1 ;闪烁次数未到继续循环
MOV P1,#0F5H ;A黄灯警告,B红灯禁止
MOV R2,#04H
YEL1: ACALL DELAY
DJNZ R2,YEL1 ;2秒未到继续循环
MOV P1,#0DEH ;A红灯,B绿灯
MOV R2,#32H
DISP2: ACALL DELAY
DJNZ R2,DISP2 ;25秒未到继续循环
MOV R2,#06H
WARN2: CPL P1.5 ;B绿灯闪烁
ACALL DELAY
DJNZ R2,WARN2
MOV P1,#0EEH ;A红灯,B黄灯
MOV R2,#04H
YEL2: ACALL DELAY
DJNZ R2,YEL2
AJMP DISP ;循环执行主程序
INTT0: PUSH P1 ;P1口数据压栈保护
PUSH 03H ;R3寄存器压栈保护
PUSH TH1 ;TH1压栈保护
PUSH TL1 ;TL1压栈保护
MOV P1,#0F6H ;A、B道均为红灯
MOV R5,#28H ;置0.5秒循环初值
DELAY0: ACALL DELAY
DJNZ R5,DELAY0 ;20秒未到继续循环
POP TL1 ;弹栈恢复现场
POP TH1
POP 03H
POP P1
RETI ;返回主程序
INTT1: CLR EA ;关中断
PUSH P1 ;压栈保护现场
PUSH 03H
PUSH TH1
PUSH TL1
SETB EA ;开中断
JNB P3.0,BP ;A道无车转向
MOV P1,#0F3H ;A绿灯,B红灯
SJMP DELAY1 ;转向5秒延时
BP: JNB P3.1,EXIT ;B道无车退出中断
MOV P1,#0DEH ;A红灯,B绿灯
DELAY1: MOV R6,#0AH ;置0.5秒循环初值
NEXT: ACALL DELAY
DJNZ R6,NEXT ;5秒未到继续循环
EXIT: CLR EA
POP TL1 ;弹栈恢复现场
POP TH1
POP 03H
POP P1
SETB EA
RETI
DELAY: MOV R3,#0AH
MOV TH1,#3CH
MOV TL1,#0B0H
SETB TR1
LP1: JBC TF1,LP2
SJMP LP1
LP2: MOV TH1,#3CH
MOV TL1,#0B0H
DJNZ R3,LP1
RET
END