这是之前写的,一直没发。
实验内容:
实验大致上就是说:按键不按的时候,灯一直亮,按键按下的时候,灯不亮,报警器响。现在给了汇编语言,要改成c语言,并在proteus里面仿真。
思考与总结:
响应中断请求的条件:
1.总中断允许开关EA=1。
2.中断源的中断允许位为1。
3.中断源发出中断请求。
4.无同级或更高级中断正在被服务。
结合实验,就知道,这里跑到中断子程序的条件,首先总开关打开。然后选择中断请求源,对这个实验来说,也就是选择INT0‾\overline{INT0}INT0外部中断请求0,它的中断允许控制位是EX0EX0EX0,我们置1后,就说明允许了外部中断0中断。
我们如果选用跳沿触发,一个机器周期采样到外部中断输入为高,下一个为低,那么中断请求触发器置一,这个时候进入中断子程序。
这个实验是电平触发。
cpu查询到中断请求时,就会进行中断响应(这里假设只是单一中断,如果有不同优先级的中断,那么cpu还要进行判断)。硬件生成一个长调用指令并执行,程序转向中断入口地址,两个中断入口相隔8字节,难以放下中断子程序,此时需要一个跳转指令,转向在其他地址下的子程序中。
实验结果:
汇编语言实现:
ORG 0000hLJMP MAIN//主程序ORG 0003hLJMP INT0s//中断入口ORG 0100h
MAIN: CLR IT0//外部中断请求0为电平触发SETB EA//总中断允许SETB EX0 //允许外部中断0
LOOP: CLR P0.0//p0.0是低电平,此时灯亮SETB P2.3//p2.3是高电平,此时警报不响SJMP LOOP//短转移指令,程序跳到loop函数循环ORG 0200h//伪指令
INT0s: SETB P0.0 //p0.0是高电平,此时灯灭CLR P2.3 //p2.3是低电平,此时警报响
Delay: MOV R0,#200//延时函数
D1: MOV R1,#254
D2: DJNZ R1,D2DJNZ R0,D1RETIEND
改成c51语言:
#include<reg51.h>
#define uchar unsigned char
sbit key = P3^2;
void delay(unsigned int i)//延时函数
{unsigned int j;for(;i>0;i--)for(j=0;j<333;j++){}
}
void main()//主函数
{EA=1;//总中断允许EX0=1;//允许外部中断0IT0=0;//选择外部中断0为电平触发方式while(1)//循环{P0=0xfe;}//P0.0口的Led亮
}
void key_scan() interrupt 0 //外部中断0的中断服务函数
{if(key==0)//判断是否有按键按下{delay(10);//延时去抖if(key==0){P2=0xf7;P0=0xff;while(!key);//等待按键松开P2=0xff;P0=0xfe;}}
}
proteus仿真: