实验四中断预习报告

  • 格式:docx
  • 大小:59.72 KB
  • 文档页数:8

单片机原理与接口技术实验 实验报告

一、任务分析

1、正常情况下设置东西-南北交替放行的四种状态,先是南北交通灯由绿变黄、再由黄变红,东西交通灯由绿变黄再由黄变红,四种状态循环出现。三种灯亮的时间使用定时器定时。定时的时间,用倒计时方式在 2 个数码管上显示。

2、有救护车或警车到达时(使用单次脉冲进行模拟),申请外部中断,中断程序中设置南北东西两个方向交通信号灯全为红色,用延时子程序或定时器定时设定时间,定时的时间也在两个数码管上进行显示之后交通恢复正常。

二、设计思路

1、先进行初始化操作,设置外部中断1的入口地址等;

2、对寄存器TCON进行操作,设置外部中断1 的触发方式,开中断即把EX1、EA位置1;

3、编写中断函数,先清掉中断标志位,保护断点,编写终端服务函数,恢复现场,返回断点;

4、设置正常情况下的四种状态。先进行定时器T0的模式设置,再设置TH0和TH0的初值;取 T0 的定时为 25ms, TF0 溢出 40 次,即能完成定时一秒钟;

4、启动定时器0,通过将TR0置1来启动定时器;

5、TF0溢出40次则记时达到一秒,记时达到一秒后调用数码管显示函数显示记时的时间。

6、当没有警车或救护车(即没有外部脉冲时),将南北、东西交通灯设置成四种状态循环出现。

三、程序流程图 开始有救护车或警车状态一:南北放行南北绿灯东西红灯是否开启外部中断状态二:南北转黄灯,东西红灯状态三:东西放行东西绿灯南北红灯状态四:东西转黄灯南北绿灯设置初始状态外部中断入口保护现场东西、南北都亮红灯延时相应的时间恢复现场中断返回

图一 程序流程图

四、实验程序ORG 0000H

AJMP MAIN

ORG 0013H

AJMP INT1_Prm

ORG 0030H

MAIN:

MOV TCON,#00000100B;外部中断1触发方式

SETB EX1

SETB EA;开中断

;HERE:AJMP HERE;

INT1_Prm:;中断函数

CLR TR1 ;先清掉中断标志位

PUSH 90H

PUSH ACC

PUSH PSW

ACALL DISPLAY

SETB P1.7

SETB P1.5 ;有警车,南北都亮红灯

DELAY10S: ;误差 0us

MOV R7,#0BFH

DL1:

MOV R6,#0BDH

DL0:

MOV R5,#89H

DJNZ R5,$

DJNZ R6,DL0

DJNZ R7,DL1

NOP

RET

POP PSW

POP ACC

POP 90H

SETB TR1

RETI

;设置初始状态

LOOP:

;状态一

SETB P1.0 ; 南北绿灯

SETB P1.5 ; 东西红灯

MOV R0,#40

MOV R1,#4

MOV R2,#5

LOOP1:

MOV TMOD,#00000001B MOV TH0,#(40536/256)

MOV TL0,#(40536%256);定时25ms

SETB TR0

WAIT1:

ACALL DISPLAY

ACALL DISPLAY1

JNB TF0,WAIT1

DJNZ R0,LOOP1 ;自减40次,40*25ms=1秒

DEC R1 ;到了一秒,自减一

;ACALL DISPLAY

;ACALL DISPLAY1

DJNZ R2,LOOP1 ;南北交通灯由绿变黄相隔4秒

;状态二 黄灯

CLR P1.0

SETB P1.2;南北黄灯

SETB P1.5 ;东西红灯

MOV R0,#40

MOV R2,#2

MOV R3,#2

LOOP2:

MOV TH0,#(40536/256)

MOV TL0,#(40536%256);定时25ms

WAIT2:

ACALL DISPLAY

ACALL DISPLAY1

JNB TF0,WAIT2

DJNZ R0,LOOP2 ;自减40次,40*25ms=1秒

DEC R3 ;到了一秒,自减一

DJNZ R2,LOOP2 ; 南北交通灯由黄变红相隔3秒

;状态三

SETB P1.4 ;东西绿灯

SETB P1.1;南北红灯

MOV R0,#40

MOV R2,#3

MOV R3,#4

LOOP3:

MOV TH0,#(40536/256)

MOV TL0,#(40536%256);定时25ms

WAIT3:

ACALL DISPLAY

ACALL DISPLAY1

JNB TF0,WAIT3 DJNZ R0,LOOP3 ;自减40次,40*25ms=1秒

DEC R3 ;到了一秒,自减一

DJNZ R2,LOOP3 ;东西交通灯由绿变黄相隔4秒

;状态四

SETB P1.6

SETB P1.7; 东西黄灯,南北红灯

MOV R0,#40

MOV R2,#3

MOV R3,#4

LOOP4:

MOV TH0,#(40536/256)

MOV TL0,#(40536%256) ;定时25ms

WAIT4:

ACALL DISPLAY

ACALL DISPLAY1

JNB TF0,WAIT4

DJNZ R3,LOOP4 ;自减40次,40*25ms=1秒

DEC R3 ;到了一秒,自减一

DJNZ R2,LOOP4 ;东西交通灯由黄变红相隔3秒

ACALL LOOP

DISPLAY:

MOV DPTR,#TAB

MOV 60H,R3

MOV A,60H;60H为显示数据存储单元,A的地址

MOVC A,@A+DPTR ;取值

MOV DPTR,#8004H ;74374(1)

MOVX @DPTR,A ;赋段选的值

MOV DPTR,#8002H ; 74374(2)

MOV A,#01H ;选中最后一个数码管

MOVX @DPTR,A ;显示十位的值

ACALL DELAY500MS

RET

DELAY500MS: ;误差 0us

MOV R7,#17H

DL5:

MOV R6,#98H

DL4:

MOV R5,#46H

DJNZ R5,$

DJNZ R6,DL4

DJNZ R7,DL5 RET

DISPLAY1:

MOV DPTR,#TAB

MOV 60H,R3

MOV A,60H;60H为显示数据存储单元,A的地址

MOVC A,@A+DPTR ;取值

MOV DPTR,#8004H ;74374(1)

MOVX @DPTR,A ;赋段选的值

MOV DPTR,#8002H ; 74374(2)

MOV A,#01H ;选中最后一个数码管

MOVX @DPTR,A ;显示位的值

ACALL DELAY500MS2

RET

DELAY500MS2: ;误差 0us

MOV R7,#17H

DL3:

MOV R6,#98H

DL2:

MOV R5,#46H

DJNZ R5,$

DJNZ R6,DL2

DJNZ R7,DL3

RET

TAB:

DB 3FH

DB 06H

DB 5BH

DB 4FH

DB 66H

DB 6DH

DB 7DH

DB 07H

DB 7FH

DB 6FH

END

五、 程序分析 1、先进行程序的初始化操作,设置外部中断1的入口地址,即0013H等;

2、对寄存器TCON进行操作,设置外部中断1 的触发方式,开中断即把EX1、EA位置1;IP 是中断优先级寄存器,其中 PX0,PT0,PX1,PT1,PS 位分别对应 5 个中断的优先级设置,置“1”时设为高级中断,为“0”时是低级中断。

3、编写中断函数,先清掉中断标志位,保护断点,PUSH 90H;PUSH ACC;PUSH PSW。恢复现场,返回断点,POP PSW; POP ACC;POP 90H;

4、编写正常情况下的交通路灯南北-东西方向的四种状态;

5、在实验板上将 CS 端连接至系统地址 CS0,则确定段码锁存器地址为

8004H、位选码锁存器地址为8002H。点亮数码管时,先选择数码管的段选,使用查表法给数码管的段选进行赋值,再选择数码管的位选,若从左到右选中第一位数码管即赋值为00000100。

6、使用定时器定时,先要设置定时器的工作方式,即对TMOD寄存器进行操作,根据定时时间给TH0、TL0赋初值,开定时器,定时器定时时间到了以后需要清楚溢出标志位TF0。

六、问题分析

1、当有警车通过(即外部中断1有下降沿信号),程序进入外部中断,南北东西方向均为红灯,当警车通过后,程序应回到原来正常情况下的红绿灯时间,但程序并没有回到原来执行外部中断的执行的地方,后面发现是少了恢复现场,返回断点,POP PSW; POP ACC;POP 90H这部分的程序。

2、本应是在计数过程中两个数码管一直亮,但实际上是两个数码管轮流亮灭亮灭显示,经过检查,应该把display显示函数放在主函数中,使得数码管能一直显示相应的值。

3、当外部中断1有下降沿信号时,即进入外部中断程序,需要延时4秒,因此需要再写一个倒计时5秒的程序。

七、数据分析

1、使用12M晶振,执行一条指令所用的时间是1微秒,使用定时器的工作方式1,16位记时,最大记时时间是2^16=65536,因此要记时一秒钟,可以先通过计时25ms,定时器的溢出标志位溢出40次来达到记时一秒钟的目的。

2、分别设置南北-东西方向的倒计时相应的时间,并调用显示函数显示。

八、结论

1、使用定时器定时精确,但在溢出标志位溢出之后,需要清除中断标志位;

2、使用数码管显示数据时,需要先位选数码管,再给数码管赋段码值。

3、调用子函数用ACALL指令

4、在中断函数中,应先清掉中断标志位并保护断点,PUSH 90H;PUSH ACC;PUSH PSW。中断程序执行完后需要恢复现场,返回断点,POP PSW; POP ACC;POP 90H