单片机实验:外部中断按键

这是之前写的,一直没发。

实验内容:

实验大致上就是说:按键不按的时候,灯一直亮,按键按下的时候,灯不亮,报警器响。现在给了汇编语言,要改成c语言,并在proteus里面仿真。

思考与总结:

响应中断请求的条件:
1.总中断允许开关EA=1。
2.中断源的中断允许位为1。
3.中断源发出中断请求。
4.无同级或更高级中断正在被服务。

结合实验,就知道,这里跑到中断子程序的条件,首先总开关打开。然后选择中断请求源,对这个实验来说,也就是选择 I N T 0 \overline{INT0} 外部中断请求0,它的中断允许控制位是 E X 0 EX0 ,我们置1后,就说明允许了外部中断0中断。
我们如果选用跳沿触发,一个机器周期采样到外部中断输入为高,下一个为低,那么中断请求触发器置一,这个时候进入中断子程序。
这个实验是电平触发。
cpu查询到中断请求时,就会进行中断响应(这里假设只是单一中断,如果有不同优先级的中断,那么cpu还要进行判断)。硬件生成一个长调用指令并执行,程序转向中断入口地址,两个中断入口相隔8字节,难以放下中断子程序,此时需要一个跳转指令,转向在其他地址下的子程序中。

实验结果:

汇编语言实现:

	 ORG 0000h
	 LJMP MAIN//主程序
	 ORG 0003h
	 LJMP 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,D2
       DJNZ R0,D1
	   RETI
     END

改成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;//允许外部中断0
	IT0=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仿真:
在这里插入图片描述

发布了218 篇原创文章 · 获赞 131 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/89417769