SERV0:MOV R2,#0FFH ;正常状态恢复程序,使R0的值不为0 RETI
SERV1:DJNZ R0,NEXT ;未到1秒,则转到NEXT CJNE R5,#01,DHE0 AJMP DHE3 DHE0: CJNE R5,#00H,DHE1 CJNE R6,#00H,DHE2 MOV R5,#00H MOV R6,#01H MOV P1,#0F5H AJMP OUT0
DHE1: DEC R5 AJMP OUT0 DHE2: MOV R6,#00H MOV R5,#09H OUT0: MOV R0,#20 RETI
DHE3: MOV P0,#00H MOV P2,#3FH MOV A,P1 MOV R1,#05H
JNB ACC.0,CHE0 YELL0:SETB P1.0
SETB P1.1 CLR P1.2 ACALL DMS SETB P1.2 ACALL DMS
DJNZ R1,YELL0 MOV P1,#0EEH SJMP NEXT1 CHE0: JNB ACC.3,CHE1 YELL1:SETB P1.3 SETB P1.4 CLR P1.5
;减1秒 ;显示为0 ;东西方向红灯亮,则转到CHE0 ;东西方向绿灯灭 ;东西方向黄灯闪烁5次
;东西方向红灯亮,南北方向绿灯亮 ;南北方向绿灯灭 - 9 -
ACALL DMS SETB P1.5 ACALL DMS
DJNZ R1,YELL1 ;南北方向黄灯闪烁5次
CHE1: MOV P1,#0F5H ;南北方向红灯亮,东西方向绿灯亮 NEXT1:MOV R0,#20 MOV R5,#00H
MOV R6,#01H ;重置显示为10秒 NEXT: MOV TH0,#3CH ;重装定时器初值 MOV TL0,#0B0H RETI
SERV2:MOV P0,#00H
MOV P2,#3FH ;显示为0 MOV R5,#00H MOV R6,#00H
MOV R2,#00H ;紧急状况服务程序,使R2的值为0 MOV P1,#0F6H
LOOP3:CJNE R2,#00H,OUT1 ;R2的值为0,则无限循环,直到执行SERV0状 MOV R3,#02H ; 态恢复程序,使R0的值不为0才返回 DJNZ R3,LOOP3 OUT1: RETI
DMS: MOV 32H,#4 ;延时子程序,延时0.4秒 DL0: MOV 31H,#200 DL1: MOV 30H,#250 DL2: DJNZ 30H,DL2 DJNZ 31H,DL1 DJNZ 32H,DL0 RET
D10MS:MOV 33H,#50 ;延时子程序,延时10毫秒 DL3: MOV 34H,#100 DL4: DJNZ 34H,DL4 DJNZ 33H,DL3 RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END
- 10 -
五、仿真结果与分析
在PROTEUS软件仿真中的结果如下: 1、初始状态
2、东西路口的绿灯亮,南北路口的红灯亮
- 11 -
3、东西路口绿灯灭,黄灯闪烁
4、东西路口红灯亮,南北路口的绿灯亮
- 12 -
5、南北路口绿灯灭,黄灯闪烁
由以上仿真结果可以看出,电路图和源程序设计完全满足设计要求。
六、课程设计总结与体会
通过这次课程设计我巩固和加深课堂所学知识;掌握一般软硬件的设计方法和查询、运用资料的能力;掌握通过定时器进行定时的基本方法、中断控制的原理和方法以及LED控制的方法。
这次课程设计,我将课本上的理论知识和实际的应用有机的结合起来,提高分析和解决问题的实际能力,通过对汇编语言程序代码的设计、编写、修改以提高自己实际编程能力。
总的来说,这次课程设计的难度不算大,整个设计、调试任务都有我独立完成。而在PROTEUS软件仿真中的结果可以看到我的设计完全符合要求。在设计过程中我还认识到,遇到问题时应回到书本,查找实际问题所需的理论知识,将理论和实际结合起来。这样,在解决问题的同时还能提高我对理论知识的理解。
- 13 -