51单片机外部中断的使用以及优先级设置

本文详细介绍了51单片机中断和定时器的使用,包括TMOD寄存器设置工作方式、IP寄存器配置中断优先级,以及通过Protues仿真和Keil编程实现中断和定时器功能。在示例中,设置了定时器每两秒点亮LED灯,按键1中断熄灭LED并延时,按键2中断使LED闪烁。通过代码演示,阐述了中断嵌套和优先级设置的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

51单片机中断的使用及优先级设置
51单片机有两个外部中断,两个定时器/计数器,两个外部中断分别是int0,int1。定时器/计数器分别是t0,t1,还有一个串口中断TI/RI,加起来有五个中断。它们在硬件上的排列顺序是INT0,T0,INT1,T1,TI/RI,这5个中断源的中断顺序号依次就是interrupt 后面的0,1,2,3,4。其中定时器可以选择工作方式,因为我们使用定时器的方式不一而足,有的程序会用来计时,有的程序用来计数,根据程序要求设置工作方式各取所需。
下图显示了51单片机中的4个寄存器,分别是TCON,SCON,IE,IP,还有我们常用的定时器模式控制寄存器TMOD。

在这里插入图片描述

一、TMOD:定时器/计数器工作方式控制寄存器
TMOD中存放两个定时器/计数器,每个定时器都可以设置它们的工作方式,如定时器0的工作方式1设置就是TMOD=0x01,定时器1设置方法同定时器0,不过设置位数变到前4位TMOD=0x10。如果两个都用方式1的话就是TMOD=0x11了吧。
TMOD寄存器结构TMOD工作方式
二、IP:优先级寄存器
IP寄存器是控制中断优先级的寄存器,在51单片机中可以设置中断为高优先级或低优先级,以达到嵌套的目的。想要嵌套中断,必须使用到我们前面说过一嘴的IP寄存器,否则int0的优先级只是查询优先级最高,而不是中断优先级最高。IP寄存器结构如下图,通过设置IP寄存器可以设定由哪个中断最先运行,51单片机可以设置二级中断服务嵌套。通过IP寄存器结构我们可以明显看到下面5个中断所处的位置,因此可以轻易的设置想要的中断优先级,例如设置PX0,即外部中断int0优先级最高,就是IP=0x01;或者PX0=1;效果相同。举一反三,其他中断也是如此设置。
IP寄存器结构在这里插入图片描述

三、protues仿真
了解了中断和定时器的基本使用方式就可以画仿真图以及写程序了,先画一个简单的仿真图。

四、编写代码
图中52单片机有两个按键和两个LED灯,我们设置他们的功能。
1.使用定时器定时2秒,两秒后点亮两个LED灯,点亮LED灯后重置定时器,如果LED灯被熄灭后间隔两秒又会被重新点亮。
2.按键1按下后,通过中断int0把两个LED熄灭一段时间,int0优先级设置为最高(优先级必须设置,设置后才能嵌套,否则即使它是int0,也不能嵌套进int1中)。
3.按键2被按下后,LED1闪烁5次。
4.最后效果是,当定时器点亮两个LED灯,我们按下按键2,LED1闪烁。此时,按下按键1,LED1和LED2全部熄灭并保持一段时间后,LED1继续未完成的闪烁,直至完成后两个LED灯依旧点亮。通过简单的功能实现,我们可以充分的了解外部中断和定时器的具体应用。
代码如下:

#include"reg52.h"
#define uchar unsigned char  //定义字符类型
#define uint unsigned int
sbit led=P2^0;   //定义IO口P2.0为led
sbit led1=P2^1;
uchar flag;	//定义flag类型

void delay(){  //延时程序
int i,j;
	for(i=500;i>0;i--)
	 for(j=100;j>0;j--);
}
void init()//初始化,即打开各中断开关
{
	 TMOD=0x01;
	 TH0=(65536-50000)/256; //定时器0装初值
     TL0=(65536-50000)%256; //同上
     IT0=1;//外部中断0为跳变沿触发方式
     IT1=1;//外部中断1为跳变沿触发方式
     EA=1;//开总中断
     EX0=1;//打开外部中断0
     EX1=1;//打开外部中断1
	 ET0=1;//打开定时器0中断开关
	 TR0=1;//打开定时器0运行开关
	 IP=0x01;//设置int0优先级为高,与PX0=1;等效
}
/*按键1*/
void int0() interrupt 0 using 0//外部中断0的执行程序。
{ 							   //interrupt 0指外部中断0 using 0指第0组寄存器			  			
	led=0;  //熄灭LED灯
	led1=0;
	delay();//延时
	delay();
	delay();
}
void t0() interrupt 1 using 1 //定时器
{   
   TH0=(65536-50000)/256; //定时器0装初值
   TL0=(65536-50000)%256; //同上
   flag++; //记录定时器经过的时间
   if(flag==40){	 //定时2秒后执行,flag=40时约两秒
	 led=1;   //点亮LED灯
     led1=1;
	 flag=0; //重置定时,达到每两秒点亮一次的目的
   }
}
/*按键2*/
void int1() interrupt 2 using 2//外部中断1的执行程序。
{
	unsigned char i;	
	for(i=0;i<10;i++)//实现led闪烁五次。
    	{
		   led=~led;
		   delay();
		}	
}
void main()//主函数
{
	init();	  //初始化
	led=0;   //指定LED灯开始的时候是熄灭状态
	led1=0;
	while(1);
}

proteus仿真加keil4代码文件下载链接:
https://download.csdn.net/download/CenJuLong/18281185

`

### 如何在51单片机设置外部中断优先级 在MCS-51系列单片机中,中断系统的优先级管理通过 **中断优先级寄存器 (IP)** 实现。该寄存器用于定义各个中断源优先级别。对于外部中断而言,其优先级可以通过配置 IP 寄存器中的对应位完成。 #### 中断优先级寄存器 (IP) 结构 中断优先级寄存器是一个8位特殊功能寄存器(SFR),其中每一位分别对应一种中断源优先级控制。如果某一位被设置为 `1`,则对应的中断具有高优先级;反之,若该位置为 `0`,则对应的中断属于低优先级[^1]。 具体到外部中断: - 对于外部中断 0(INT0),其优先级由 IP 的第 0 位 (`IP^0`) 控制。 - 对于外部中断 1(INT1),其优先级由 IP 的第 2 位 (`IP^2`) 控制。 因此,在程序初始化阶段,可以按照如下方式设置外部中断优先级: ```c #include <reg51.h> void init_interrupt_priority() { // 设置外部中断0高优先级 IP |= 0x01; // 将IP的第0位置1 // 或者设置外部中断1为高优先级 IP |= 0x04; // 将IP的第2位置1 } ``` 需要注意的是,上述代码仅适用于标准的 MCS-51 单片机架构。而对于一些增强型单片机(如 STC 系列),可能支持多级优先级机制。例如,在某些型号下,除了高低两级外还存在更多细分层次[^2]。 #### 测试与验证 当实际运行时发现预期行为未达成时,应仔细检查以下几个方面: 1. 是否正确启用了全局中断标志 EA; 2. 各个独立中断使能位是否已打开; 3. 高优先级中断确实能够打断当前正在执行的低优先级中断服务程序(ISR)。 以下是完整的初始化函数模板供参考: ```c void interrupt_init() { EA = 1; // 开启总中断 EX0 = 1; // 允许外部中断0 IT0 = 1; // 边沿触发模式(可选) // 设定外部中断0高优先级 IP |= 0x01; // 如果需要设定其他中断优先级,则继续添加相应语句... } ``` #### 注意事项 尽管理论上高优先级中断应该总是能够抢占低优先级 ISR 的资源并立即得到响应,但在实际应用过程中可能会受到硬件延迟或其他因素的影响而表现出异常现象。此时建议查阅具体的芯片手册确认是否存在额外约束条件或者特定实现细节上的差异。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值