尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

【嵌入式成长3】STC89C51外部中断|中断原理、寄存器、中断服务函数

【嵌入式成长3】STC89C51外部中断|中断原理、寄存器、中断服务函数 一、什么是中断中断是单片机用来实时处理外部/内部随机事件的重要机制。通俗理解CPU正在做A任务突然来了紧急事件BCPU暂停A转去处理BB处理完毕回到A任务断点继续执行。生活类比你正在洗衣服主程序while循环水壶烧开中断事件停下洗衣服关火倒水中断服务函数处理完继续回去洗衣服。轮询按键的痛点如果主循环内部有长时间延时例如delay_ms(20000);延时20秒。在延时期间按下按键程序无法捕捉按键动作按键信号直接丢失。中断可以解决这个痛点无论CPU正在执行什么代码只要中断事件触发立刻跳转到中断服务函数处理。二、硬件接线说明P3.2‑INT0按键开发板硬件INT0 → P3.2外接独立按键KEY1按键电路4.7K上拉松开高电平按下低电平LED指示灯P2.7低电平点亮实验目标按下P3.2按键触发外部中断0翻转LED亮灭状态。三、STC89C52RC中断源STC89C5X一共有8个中断请求源外部中断0 INT0P3.2外部中断1 INT1P3.3外部中断2 INT2P4.2外部中断3 INT3P4.3定时器0中断T0定时器1中断T1定时器2中断T2串口UART中断分类外部中断外部引脚电平变化触发定时器中断单片机内部定时器计数溢出触发串口中断串口完成接收/发送一帧数据触发本章重点讲解外部中断0P3.2/INT0四、中断相关寄存器1.IE 中断允许寄存器A8H位符号功能IE.7EA全局总中断开关EA1开启所有中断总开关IE.0EX0外部中断0使能位EX01开启INT0(P3.2)IE.1ET0定时器0中断使能IE.2EX1外部中断1使能IE.3ET1定时器1中断使能IE.4ES串口中断使能✅开启外部中断0三步设置触发方式IT0打开INT0中断使能EX0 1打开全局总中断EA 12.TCON寄存器88HIT0外部中断0触发方式IT00低电平触发IT01下降沿触发推荐按键首选下降沿含义引脚电平高 → 低跳变正好对应按键按下瞬间。IE0外部中断0中断请求标志中断响应后硬件自动清零。3.XICON辅助中断控制寄存器C0H用于STC扩展的外部中断2、外部中断3INT2、INT3。标准reg52.h头文件没有定义该寄存器。4.IP、IPH中断优先级寄存器IP中断优先级低位IPH中断优先级高位⚠️IPH寄存器不可位寻址不能写PX0H 1只能整体字节赋值IPH 0x01;优先级规则高优先级中断可以打断低优先级中断实现中断嵌套低优先级不能打断高优先级相同优先级同时触发按照硬件查询次序响应。五、中断服务函数语法Keil C51扩展关键字interrupt后面跟中断号代表对应中断源。void函数名(void)interrupt 中断号{//中断处理逻辑}STC89C52RC中断号对照表中断源中断号引脚INT0外部中断00P3.2T0定时器01—INT1外部中断12P3.3T1定时器13—UART串口4—T2定时器25—INT2外部中断26P4.2INT3外部中断37P4.3注意中断服务函数不能有返回值不能带形参。不要在中断里面写长延时、复杂运算。六、完整可编译代码版本1最简版基础功能无消抖#includereg52.h//STC扩展寄存器sfr XICON0xC0;sfr P40xE8;sfr IPH0xB7;sbit led1P2^7;// KEY 直接硬件绑定 P3.2(INT0引脚)不需要额外sbit定义// INT0硬件引脚固定 P3.2//外部中断0初始化voidInt0_Init(void){IT01;//下降沿触发 (高电平变低电平按键按下)EX01;//使能外部中断0(P3.2)EA1;//打开全局总中断}//外部中断0中断服务函数中断号0voidInt0_ISR(void)interrupt0{led1~led1;//翻转LED}voidmain(void){Int0_Init();while(1){//主循环可以运行别的任务不会阻塞按键}}解释INT0是硬件功能P3.2引脚硬件默认绑定外部中断0不需要sbit key P3^2读取电平只要引脚检测到下降沿自动触发中断。缺点机械按键抖动可能一次按下触发多次中断版本2工程可用版中断内部软件消抖#includereg52.hsfr XICON0xC0;sfr P40xE8;sfr IPH0xB7;sbit led1P2^7;sbit key_int0P3^2;//显式定义INT0按键引脚代码可读性更好//12M晶振毫秒延时voiddelay_ms(unsignedintxms){unsignedinti,j;for(ixms;i0;i--)for(j124;j0;j--);}//外部中断0初始化voidInt0_Init(void){IT01;EX01;EA1;}//中断服务函数voidInt0_ISR(void)interrupt0{delay_ms(10);//延时消抖if(key_int00)//再次确认引脚确实是低电平按键按下{led1~led1;while(key_int00);//等待松开按键避免长按反复触发}}voidmain(void){Int0_Init();while(1){}}✅这份代码完整体现P3.2按键sbit key_int0 P3^2显式定义按键引脚IT01配置下降沿触发P3.2由高变低按键按下中断进来之后再次读取P3.2引脚电平做消抖校验七、开发注意事项INT0硬件固定引脚为P3.2INT1固定P3.3不需要IO口手动轮询硬件自动检测电平跳变。机械按键抖动会导致单次按键多次进中断实际项目必须增加软件消抖。中断里面延时函数不宜过长复杂业务逻辑尽量放主循环中断内只做标志位。IPH寄存器不能位操作只能直接字节赋值。下降沿触发适合机械按键电平触发容易重复触发。八、本章小结INT0硬件引脚固定映射P3.2配置好寄存器之后引脚电平跳变自动触发中断。使用外部中断0开启全局中断EA开启EX0配置IT0触发方式。中断函数interrupt 0对应P3.2外部中断0。机械按键必须消抖否则会出现按一次LED翻转多次。
返回列表