项目5—中断控制LED下降沿有效与低电平触发

中断概念:中断是指由于接收到来自外围硬件(相对于中央处理器和内存)的异步信号或来自软件的同步信号,而进行相应的硬件/软件处理。发出这样的信号称为进行中断请求(interrupt request,IRQ)。硬件中断导致处理器通过一个上下文切换(context switch)来保存执行状态(以程序计数器和程序状态字等寄存器信息为主);软件中断则通常作为CPU指令集中的一个指令,以可编程的方式直接指示这种上下文切换,并将处理导向一段中断处理代码。中断在计算机多任务处理,尤其是实时系统中尤为有用。这样的系统,包括运行于其上的操作系统,也被称为“中断驱动的”(interrupt-driven)。中断是一种使CPU中止正在执行的程序而转去处理特殊事件的操作,这些引起中断的事件称为中断源,它们可能是来自外设的输入输出请求,也可能是计算机的一些异常事故或其它内部原因。

中断:在运行一个程序的过程中,断续地以“插入”方式执行一些完成特定处理功能的程序段,这种处理方式称为中断。

作用:并行操作,硬件故障报警与处理,支持多道程序并发运行,提高计算机系统的运行效率,支持实时处理功能

单片机的中断是由单片机片内的中断系统来实现的。当中断请求源(简称中断源)发出中断请求时,如果中断请求被允许的话,单片机暂时中止当前正在执行的主程序,转到中断服务程序处理中断服务请求,处理完中断服务请求后,再回到原来被中止的程序之处(断点),继续执行被中断的主程序。

1.中断允许寄存器IE


EX0
外部中断0允许位。EX0=1,允许外部中断0中断;EX0=0,禁止外部中断0中断。当EX0=1( SETB EX0 )时,同时单片机P3.2引脚上出现中断信号时,单片机中断主程序的执行而“飞”往中断服务子程序,执行完后通过中断返回指令RET 动返回主程序。当EX0=0( CLR EX0)时,即使单片机P3.2引脚上出现中断信程序也不会从主程序“飞” 出去执行,因为此时单片机的CPU相当于被“堵上了耳朵”,根本接收不到P3.2引脚上的中断信号,但是这并不表示这个信号不存在。如果单片机的CPU有空查一下TCON中的IE0位,若为1就说明有中断信号出现过。

 

ET0
T0溢出中断允许位。ET0=1,允许T0中断;ET0=0,禁止T0中断。

EX1
外部中断1允许位。EX1=1,允许外部中断1中断;EX1=0,禁止外部中断1中断。当EX1=1( SETB EX1)时,并且外部P3.3引脚上出现中断信号时,单片机CPU会中断主程序而去执行相应的中断服务子程序;当EX1=0( CLR EX1)时使外部P3.3引脚上即使出现中断信号,单片机的CPU也不能中断主程序转而去行中断服务子程序。
因此,可以这样认为,EX0和EX1是决定CPU能否感觉到外部引脚P3.2P3.3上的中断信号的控制位。

ET1
T1溢出中断允许位。ET1=1,允许T1中断;ET1=0,禁止T1中断。

ES
串行中断允许位。ES=1,允许串行口中断;ES=0,禁止串行口中断。

EA
中断总允许位。EA=1,CPU开放中断;EA=0,CPU禁止所有的中断请求。总允许EA好比一个总开关。EA就相当于每家水管的总闸,如果总闸不开,各个龙头即使开了也不会有水;反过来,如果总闸开了而各个分闸没开也不会有水,所当我们想让P3.2和P3.3引脚上的信号能够中断主程序则必须将EA位设置为0(CLR EA)。

下面为中断下降沿有效

程序:

#include<reg51.h>
sbit led = P0^0;
void int0_isr(void) interrupt 0
{
	led = !led;
}
void main()
{
	EA = 1;
	EX0 = 1;
	IT0 = 1;
	while(1)
	{
	
	}
}

仿真:

 按下按键,灯亮起。 

下面为低电平触发

程序:

#include<reg51.h>
sbit led = P0^0;
void int0_isr(void) interrupt 0
{
	led = !led;
	while(P3 == 0xfb);
}
void main(void)
{
	EA = 1;
	EX0 = 1;
	IT0 = 0;
	while(1);
}

 仿真同下降沿有效一样。

 

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
首先需要配置PA5引脚为输入模式,并开启外部中断。然后在中断处理函数中控制PA5引脚输出低电平即可点亮LED灯。 以下是示例代码: ```c #include "stm32f10x.h" void EXTI9_5_IRQHandler(void) // 定义外部中断处理函数 { if(EXTI_GetITStatus(EXTI_Line5) != RESET) // 判断是否为PA5引脚发生中断 { GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 控制PA5引脚输出低电平 EXTI_ClearITPendingBit(EXTI_Line5); // 清除中断标志位 } } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 使能GPIOA时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); // 使能AFIO时钟 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 配置PA5引脚 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; // 配置为输入模式,并开启上拉 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; // 配置PA5引脚 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; // 配置输出速度 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; // 配置为推挽输出 GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_ResetBits(GPIOA, GPIO_Pin_5); // 初始化PA5引脚输出低电平 GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); // 配置中断线路 EXTI_InitStructure.EXTI_Line = EXTI_Line5; // 配置中断线路为PA5引脚 EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; // 配置为中断模式 EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; // 配置下降沿触发 EXTI_InitStructure.EXTI_LineCmd = ENABLE; // 使能中断线路 EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn; // 配置中断通道 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x00; // 配置抢占优先级 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x00; // 配置子优先级 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // 使能中断通道 NVIC_Init(&NVIC_InitStructure); while(1) { // 主循环中可以添加其他代码 } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

单旦羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值