四、程序设计:
1、定时器初值的计算:
由于要求定时时间相当精确,我用定时器T0进行定时。根据公式可知若已知要求的定时时间为t,则定时器的初值为x(其中fosc=12M Hz) :
需要定时器的定时时间为50ms,根据公式计算得出X=15536,因此定时器初值的低位TL0=(0B0H),高位TH0=(3CH)。
2、程序流程图:
2.1主程序流程
主程序主要是对单片机进行初始化。初始化首先要开放总中断、定时器T0中断以及外部中断0和外部中断1。其次是设置中断优先级,把外中断0设置为高优先级,外中断1设置为低优先级。再次是给定时器T0装顶初值,然后后是启动定时器,是使定时器开始定时。最后是等待中断。
设置中断优先级 开放总中断、定时器T0中断以及外部中断 开始
循环动态显示 装定时器初值,启动定时器 - 5 -
2.2紧急情况中断处理流程
紧急情况中断处理包括两部分,第一部分是出现紧急情况可以手动使东西、南北方向红灯全亮,而且直到紧急状况解除后才能恢复正常通车。这就要求紧急状况解除前不能退出外中断1处理程序,因此要在外中断1处理程序处设置一无限循环。第二部分是紧急状况解除。为了使外中断1处理程序退出无限循环,可用中断嵌套使机器转去执行外中断0处理程序,而外中断0处理程序修改了寄存器R2的值,中断返回后由于寄存器R2的值的改变使外中断1处理程序跳循环。
2.2.1外中断1处理程序(低优先级)
2.2.2外中断0处理程序(高优先级)
中断返回 使R2的值不为0 外中断0入口 N 中断返回 R2的值为0? 东西、南北方向红灯亮 Y 置R2的值为0 外中断1入口 数码管显示为0 - 6 -
1.3定时器中断处理流程
Y
N Y
- 7 -
3、程序源代码:
ORG 0000H AJMP START
ORG 0003H ;外中断0入口 AJMP SERV0
ORG 000BH AJMP SERV1
ORG 0013H AJMP SERV2 ORG 0030H START:MOV IE,#87H
MOV IP,#01H MOV TMOD,#01H MOV TCON,#05H MOV TH0,#3CH
MOV TL0,#0B0H MOV DPTR,#TAB MOV P1,#0F6H MOV R0,#20 MOV R5,#00H MOV R6,#00H
SETB TR0 LOOP1:MOV P0,#02H MOV A,R6
MOVC A,@A+DPTR MOV P2,A ACALL D10MS MOV P0,#01H MOV A,R5
MOVC A,@A+DPTR MOV P2,A ACALL D10MS AJMP LOOP1
;外中断1入口 ;定时器中断入口 设置中断优先级 ;装定时器初值 ;装表首地址 ;启动定时器
;循环动态显示,由10秒开始倒计时- 8 -
;