单片机 - 图文 联系客服

发布时间 : 星期二 文章单片机 - 图文更新完毕开始阅读69b86228e2bd960590c6775c

3.2.3紧急通道功能的设计:

紧急通道功能使用外部中断子程序来实现,按下紧急按钮,各路口灯全亮,延时5秒,以供急救车通过。急救车通过后,红绿灯恢复为紧急按钮按下之的前状态继续运行。因为在调用中断子程序后,在中断子程序里所使用到的寄存器或者直接地址在中断子程序运行玩之后数据会发生改变,因此需要先将这些数据进行保存,在这个程序里的数据保存我使用了堆栈操作,首先对所有用到的数据进行压栈保存,再将PA口的数据输送到发光管,使个路口灯全亮,再进行5s的延时,中

间用到软件延时,最后对之前所有保存的数据进行出栈。相应的程序代码:

INT_0: PUSH 51H ;保存数据 PUSH 52H PUSH 53H

PUSH 54H PUSH ACC MOV A,R7 PUSH ACC MOV A,R6 PUSH ACC MOV A,R5 PUSH ACC MOV A,R4 PUSH ACC MOV A,R3 PUSH ACC MOV A,R2 PUSH ACC PUSH B

MOV R2,#0C0H ;紧急通道:各路口等全亮,延时5s MOV A,R2

MOV DPTR,#PA_8255 MOVX @DPTR,A MOV R7,#5 LCALL DELAY

POP B MOV DPTR,#PA_8255 MOVX @DPTR,A POP ACC

MOV R2,A

POP ACC

MOV R3,A POP ACC MOV R4,A POP ACC MOV R5,A POP ACC

MOV R6,A POP ACC MOV R7,A POP ACC POP 54H POP 53H POP 52H

POP 51H RETI 相应的流程图:

1

进行压栈,保存之前用到的所有数据将紧急状态送入PA口调用DELAY子程序进行出栈,输出之前保存的数据,进入到中断之前的程序 3.2.4LED显示器模块设计

该LED显示器采用动态显示,因为有东西、南北两个交通通道,而东西和南北方向都有两位LED显示器,因此总体思路为先东西方向的显示,取要显示的数字R7除以B,B为10,将十位存入51H,个位存入52H,8255APC口写入十位的位控制信号,PB口写入十位字符控制信号,调用延时2ms,8255APC口写入十位的位控制信号,PB口写入个位字符控制信号,调用延时2ms,南北方向亦是如此,这样一个循环下来每位LED显示器都延时2ms,如此循环125次,就能延时1s。最后调用该部分程序,再循环R7的次数,就能实现LED显示。相应的程序代码:

DISP: MOV A,R7 MOV R3,#125

DONG0: MOV B,#10 DIV AB MOV 51H,A MOV 52H,B

DONG1: MOV DPTR,#PC_8255 ;东西方向十位LED的显示 MOV A,#07FH MOVX @DPTR,A MOV A,51H MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#PB_8255 MOVX @DPTR,A

LCALL DELAY2

DONG2: MOV DPTR,#PC_8255 ;东西方向个位LED的显示 MOV A,#0BFH

MOVX @DPTR,A MOV A,52H MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#PB_8255 MOVX @DPTR,A LCALL DELAY2

DIS: MOV A,R7

13

DIS1: MOV B,#10 DIV AB MOV 53H,A MOV 54H,B

DIS2: MOV DPTR,#PC_825 ;南北方向十位LED的显示 MOV A,#0F7H MOVX @DPTR,A MOV A,53H MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#PB_8255 MOVX @DPTR,A

LCALL DELAY2

DIS3: MOV DPTR,#PC_8255 ;南北方向个位LED的显示 MOV A,#0FBH MOVX @DPTR,A

MOV A,54H MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#PB_8255 MOVX @DPTR,A

LCALL DELAY2 DJNZ R3,DONG1 RET

DELAY: MOV A,R7

LCALL DISP

LCALL DELAY DJNZ R7,DELAY RET 相应的流程图:

东西方向十位的数字显示调用延时子程序东西方向个位的数字显示调用延时子程序南北方向十位的数字显示调用延时子程序N南北方向个位的数字显示调用延时子程序R3-1==0YRET

14

3.2.5延时子程序设计:

该部分采用软件延时,分别对R4和R6设置初值以控制循环次数, 相应的程序代码: DELAY2:MOV R4,#5 Y4:MOV R6,#200 Y3:DJNZ R6,Y3

DJNZ R4,Y4 RET 相应的流程图:

将5赋给R4将200赋给R6R6-1=0R4-1=0RET3.2.6总程序设计 PA_8255 EQU 0FFFCH PB_8255 EQU 0FFFDH PC_8255 EQU 0FFFEH

CON_8255 EQU 0FFFFH ORG 0000H AJMP START ORG 0003H AJMP INT_0 ORG 0030H START: MOV SP,#30H

SETB IT0 ;外部中断为下降沿触发 SETB EA SETB EX0

MOV DPTR,#CON_8255 MOV A,#80H ;写方式控制字 MOVX @DPTR,A

LOOP0: MOV DPTR, #PA_8255 ;状态一:东西红灯,南北绿灯,延时20s MOV R2, #0F6H MOV A,R2

MOVX @DPTR,A MOV R7,#20 LCALL DELAY

LOOP1: MOV DPTR, #PA_8255 ;状态二:东西红灯,南北黄灯,延时5s MOV R2, #0F5H

15