标题: AT89C51单片机中断实验 汇编语言程序 [打印本页]

作者: ddddd呃呃呃呃    时间: 2021-7-4 12:53
标题: AT89C51单片机中断实验 汇编语言程序
(1)基于8051内核单片机(如at89C51等)进行实验
(2)模拟有急救车通过的交通灯控制实验:允许急救车优先通过。当有急救车到达时,两个方向上的红灯亮(可以发光二极管模拟),以便让急救车通过,假定急救车通过路口的时间为10秒,急救车通过后,交通灯恢复中断前的状态。实验以按键开关为中断申请,表示有急救车通过。
(3)uvision2/4软件平台上编写、调试程序。
(4)Proteus软件平台上仿真。
本实验中断处理程序的应用,最主要的地方是如何保护进入中断前的状态,使得中断程序执行完毕后能回到交通灯中断前的状态。要保护的地方,除了累加器ACC、标志寄存器PSW外,还要注意:第一是主程序中的延时程序和中断处理程序中的延时程序不能混用,本实验给出的程序中,主程序延时用的是R5、R6、R7,中断延时用的是R3、R4和新的R5。第二,主程序中每执行一步经74LS273的端口输出数据的操作时,应先将所输出的数据保存到一个单元中。因为进入中断程序后也要执行往74LS273端口输出数据的操作,中断返回时如果没有恢复中断前74LS273端口锁存器的数据,则显示往往出错,回不到中断前的状态。还要注意一点,主程序中往端口输出数据操作要先保存再输出,例如有如下操作:
    MOV  A,#0F0H     (0)
    MOVX @R1,A       (1)
    MOV  SAVE,A      (2)
程序如果正好执行到(1)时发生中断,则转入中断程序,假设中断程序返回主程序前需要执行一句MOV  A,SAVE指令,由于主程序中没有执行(2),故SAVE中的内容实际上是前一次放入的而不是(0)语句中给出的0F0H,显示出错,将(1)、(2)两句顺序颠倒一下则没有问题。发生中断时两方向的红灯一起亮10秒,然后返回中断前的状态。
     
图3.1  主程序框图     
图3.2 中断程序框图
    实验步骤
74LS273的输出O0~O7接发光二极管L1~L8,74LS273的片选CS273\接片选信号CS2,此时74LS273的片选地址为CFB0H~CFB7H之间任选。单脉冲输出端P-接CPU板上的INT0。
    实验数据分析及处理
烧录
程序运行结果
仿真结果
NAME    T5                    //中断控制实验
OUTPORT EQU    0CFB0H         //端口地址
SAVE    EQU    55H            //保存从端口cfa0输出的数据
CSEG    AT     0000H
        LJMP   START
CSEG AT 0003H
        LJMP   INT
CSEG AT 0100H
START:  SETB   IT0
        SETB   EX0
        SETB   EA
        MOV    A,#11H        //置首显示码
        MOV    SAVE,A        //保存
        ACALL  DISP          //显示输出
        ACALL  DE3S          //延时3秒
LLL:    MOV    A,#12H        //东西路口绿灯亮,南北路口红灯亮
        MOV    SAVE,A
        ACALL  DISP  
        ACALL  DE10S         //延时10秒
        MOV    A,#10H        //东西路口绿灯灭
        MOV    SAVE,A
        ACALL  DISP  
        MOV    R2,#05H       //东西路口黄灯闪烁5次
TTT:    MOV    A,#14H
        MOV    SAVE,A
        ACALL  DISP  
        ACALL  DE02S
        MOV    A,#10H
        MOV    SAVE,A
        ACALL  DISP  
        ACALL  DE02S
        DJNZ   R2,TTT
        MOV    A,#11H       //红灯全亮
        MOV    SAVE,A
        ACALL  DISP  
        ACALL  DE02S        //延时0.2秒
        MOV    A,#21H       //东西路口红灯亮,南北路口绿灯亮
        MOV    SAVE, A
        ACALL  DISP  
        ACALL  DE10S        //延时10秒
        MOV    A,#01H       //南北路口绿灯灭
        MOV    SAVE,A
        ACALL  DISP  
        MOV    R2,#05H      //南北路口黄灯闪烁5次
GGG:    MOV    A,#41H
        MOV    SAVE,A
        ACALL  DISP  
        ACALL  DE02S
        MOV    A,#01H
        MOV    SAVE,A
        ACALL  DISP  
        ACALL  DE02S
        DJNZ   R2,GGG
        MOV    A,#11H      //红灯全亮
        MOV    SAVE,A
        ACALL  DISP  
        ACALL  DE02S       //延时0.2秒
        JMP    LLL         //转LLL循环
DE10S:  MOV    R5,#100     //延时10秒
        JMP    DE1
DE3S:   MOV    R5,#30      //延时3秒
        JMP    DE1
DE02S:  MOV    R5,#02      //延时0.2秒
DE1:    MOV    R6,#200
DE2:    MOV    R7,#126
DE3:    DJNZ   R7,DE3
        DJNZ   R6,DE2
        DJNZ   R5,DE1
        RET
INT:    CLR    EA
PUSH   ACC         //中断处理
        PUSH   PSW
        MOV    A,R5
        PUSH   ACC
        MOV    A,#11H     //红灯全亮,绿、黄灯全灭
        ACALL  DISP  
DEL10S: MOV    R3,#100     //延时10秒
DEL1:   MOV    R2,#200
DEL2:   MOV    R5,#126
DEL3:   DJNZ   R5,DEL3
        DJNZ   R4,DEL2
        DJNZ   R3,DEL1
        MOV    A,SAVE     //取SAVE中保存数据输出到cfa0端口
        ACALL  DISP  
        POP    ACC        //出栈
        MOV    R5,A
        POP    PSW
        POP    ACC
        SETB   EA        //允许外部中断
        RETI
DISP:   MOV    DPTR,#OUTPORT
CPL    A
        MOV   P1,A
        RET
END
以上的Word格式文档51黑下载地址:
实验4(1).docx (348.11 KB, 下载次数: 4)





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1