当前位置: 首页 > news >正文

STC8G 8051内核单片机开发 (中断)

⚙️ ​一、STC8G中断源列表(共22个)​

中断源中断号向量地址触发方式优先级限制标志清除方式
外部中断0 (INT0)​00x0003下降沿/低电平可配置 (0-3)IE0 = 0;(手动清零)
定时器0中断 (T0)​10x000B计数器溢出可配置 (0-3)TF0 = 0;(手动清零)
外部中断1 (INT1)​20x0013下降沿/低电平可配置 (0-3)IE1 = 0;(手动清零)
定时器1中断 (T1)​30x001B计数器溢出可配置 (0-3)TF1 = 0;(手动清零)
串口1中断 (UART1)​40x0023数据发送/接收完成可配置 (0-3)RI = 0; TI = 0;(手动清零)
ADC转换完成中断50x002BADC转换结束可配置 (0-3)ADC_CONTR &= ~0x20;(写1清除)
低电压检测中断 (LVD)​60x0033电压低于阈值可配置 (0-3)`PCON
PCA/CCP/PWM中断70x003B捕获/比较/溢出可配置 (0-3)CCF0 = 0;(手动清零)
串口2中断 (UART2)​80x0043数据发送/接收完成可配置 (0-3)RI2 = 0; TI2 = 0;(手动清零)
SPI中断90x004B数据传输完成可配置 (0-3)SPSTAT = 0xC0;(写1清除)
外部中断2 (INT2)​100x0053仅下降沿固定优先级0(最低)​硬件自动清除
外部中断3 (INT3)​110x005B仅下降沿固定优先级0(最低)​硬件自动清除
定时器2中断 (T2)​120x0063计数器溢出固定优先级0(最低)​TF2 = 0;(手动清零)
外部中断4 (INT4)​130x0083仅下降沿可配置 (0-3)硬件自动清除
串口3中断 (UART3)​140x008B数据发送/接收完成固定优先级0(最低)​RI3 = 0; TI3 = 0;(手动清零)
串口4中断 (UART4)​150x0093数据发送/接收完成固定优先级0(最低)​RI4 = 0; TI4 = 0;(手动清零)
定时器3中断 (T3)​160x009B计数器溢出固定优先级0(最低)​TF3 = 0;(手动清零)
定时器4中断 (T4)​170x00A3计数器溢出固定优先级0(最低)​TF4 = 0;(手动清零)
I²C中断180x00C3传输完成/地址匹配可配置 (0-3)I2CMSST = 0;(手动清零)

​💡​:

  1. 固定优先级0的中断​(如INT2/INT3/T2/UART3等)不可被其他中断打断,且自身无法嵌套。
  2. 电平触发外部中断​(INT0/INT1)需确保信号恢复高电平后再清除标志,否则可能重复触发。

🔧 ​二、中断优先级与嵌套机制

1. 四级优先级配置

STC8G支持4级优先级​(0最低,3最高),通过组合 ​IP​(地址 0xB8)和 ​IPH​(地址 0xB7)实现:

组合值优先级
IP.X=0, IPH.X=00(最低)
IP.X=1, IPH.X=01
IP.X=0, IPH.X=12
IP.X=1, IPH.X=13(最高)
// 设置外部中断0(INT0)为优先级3(最高)
PX0 = 1;   // IP.0 = 1
PX0H = 1;  // IPH.0 = 1 → 二进制11 = 优先级3// 设置定时器0(T0)为优先级2
PT0 = 0;   // IP.2 = 0
PT0H = 1;  // IPH.2 = 1 → 二进制10 = 优先级2// 串口1设为优先级1: IP.4=1, IPH.4=0
PS = 1;    // IP.4 = 1
PSH = 0;   // IPH.4 = 0 → 二进制01 = 优先级1// ADC设为优先级0: IP.5=0, IPH.5=0
PADC = 0;  // IP.5 = 0
PADCH = 0; // IPH.5 = 0 → 二进制00 = 优先级0
 ​2. 使能中断
EA = 1;      // 总中断使能(必须开启!)
EX0 = 1;     // 允许外部中断0
ET0 = 1;     // 允许定时器0中断
 ​3. 配置中断触发方式
IT0 = 1;     // 设置INT0为下降沿触发(0=低电平触发)
4. 中断嵌套规则
  • 高优先级可打断低优先级​:若T0(优先级2)正在执行,INT0(优先级3)可中断其流程。
  • 同级中断按查询顺序执行​:同级中断同时发生时,按中断号从小到大执行(如INT0早于T0)。
  • 最低级中断不可嵌套​:INT2/INT3/INT4执行时不可被任何中断打断。

⚡ ​三、中断服务程序(ISR)编写规范

1. 核心要求
  • 短小精悍​:ISR中只做关键操作(如设标志、清中断),复杂逻辑交由主循环处理。
  • 无返回值/参数​:函数声明为 void func() interrupt n [using m]
  • 避免阻塞操作​:禁止使用 printf、长延时等函数
void ISR_Name() interrupt n [using m]
  • n​:中断号(0~21),不可省略
  • m:寄存器组编号(0~3),用于避免寄存器冲突(可选)
  • 执行原则​:无参数/返回值,使用volatile保护全局变量
2. 关键步骤

以定时器0中断为例:

volatile uint8_t timer_flag = 0;  // 全局标志位,用volatile修饰防优化void Timer0_ISR() interrupt 1 {TF0 = 0;                     // 必须手动清除中断标志TH0 = 0xFC; TL0 = 0x66;      // 重装初值(1ms@11.0592MHz)timer_flag = 1;              // 通知主循环处理任务
}

3.各中断源标志位清除方法

中断源标志位清除方式注意事项C语言示例
定时器0/1/2/3/4TF0/TF1/TF2/TF3/TF4写0清除定时器溢出中断需立即清除,否则持续触发TF0 = 0;
外部中断0/1IE0/IE1写0清除(部分型号需检测下降沿后清除)电平触发时需确保信号已恢复高电平IE0 = 0;
外部中断2/3/4IE2/IE3/IE4自动清除(响应后硬件清零)仅支持下降沿触发,优先级固定为0无需手动清除
串口1/2/3/4RI/TI写0清除接收/发送中断需分别清除RI = 0; TI = 0;
ADC转换完成ADC_FLAG写1清除(ADC_CONTR &= ~0x20;需先读取结果再清除标志ADC_CONTR &= ~0x20;
SPI传输完成SPIF读SPI状态寄存器后写1清除清除前需读取数据寄存器SPSTAT = 0xC0;(清SPIF和WCOL)
I²C中断SI写0清除(I2CMSST = 0;需处理状态码后清除I2CMSST = 0;
PWM/CCP中断CCF0/CCF1写0清除PCA模块捕获/比较中断CCF0 = 0;
低电压检测(LVD)​LVDF写1清除(`PCON= 0x20;`)需在ISR中清除,否则持续唤醒

🛠️ ​四、常用中断应用实例

1. 外部中断(按键控制电机)​
sbit K1 = P3^2;                       // 按键接INT0(P3.2)
void INT0_ISR() interrupt 0 {EX0 = 0;                          // 关闭中断防抖动delay_ms(10);                     // 消抖if(K1 == 0) motor_run(FORWARD);   // 执行正转EX0 = 1;                          // 重启中断
}
2. 定时器中断(5秒自动停电机)​
volatile uint16_t count = 0;
void Timer1_ISR() interrupt 3 {TF1 = 0;if(++count >= 5000) { // 5s(中断周期1ms)motor_stop();count = 0;TR1 = 0;         // 关闭定时器}
}
// 主循环中按键触发:TR1=1, count=0;
3. ADC中断(实时采集光照)​
uint16_t adc_value = 0;
void ADC_ISR() interrupt 5 {ADC_CONTR &= ~0x10; // 清中断标志adc_value = ADC_RES; // 读取结果
}

⚠️ ​五、开发注意事项

  1. 中断初始化流程​:
    • 配置中断触发方式(如IT0=1:下降沿触发)。
    • 使能中断(EX0=1)。
    • 设置优先级(可选)。
    • 开启总中断(EA=1)。
  2. 共享变量保护​:
    • 跨ISR与主循环的全局变量需加 volatile 并关中断操作:
      EA = 0;                 // 关中断
      temp = sensor_data;     // 安全读取
      EA = 1;                 // 开中断
  3. 低功耗设计​:
    • 休眠前启用中断唤醒:
      PCON |= 0x01;           // 进入空闲模式
      while(!timer_flag);     // 等待中断唤醒

📊 ​六、中断优化技巧

场景优化策略
高频中断ISR内仅设标志,主循环处理逻辑
实时性要求高使用最高优先级 + 快速硬件操作(如位操作)
多中断冲突合理分配优先级,避免同级中断阻塞
低功耗应用在ISR中唤醒系统,减少主循环轮询

通过合理配置中断系统,STC8G可胜任电机控制、环境监测、多机通信等复杂场景。建议结合STC-ISP工具的 ​代码生成功能​ 初始化寄存器,避免手动配置错误。

http://www.lryc.cn/news/579314.html

相关文章:

  • 算法学习笔记:4.KMP 算法——从原理到实战,涵盖 LeetCode 与考研 408 例题
  • 家政维修小程序源码php方案解析
  • FASTAPI+VUE3平价商贸管理系统
  • 实际开发如何快速定位和解决死锁?
  • thinkphp中间件
  • 协同过滤推荐算法
  • 动态规划-P1216 [IOI 1994] 数字三角形 Number Triangles
  • RAG实战指南 Day 4:LlamaIndex框架实战指南
  • AutoMedPrompt的技术,自动优化提示词
  • 基于 govaluate 的监控系统中,如何设计灵活可扩展的自定义表达式函数体系
  • 【学习线路】机器学习线路概述与内容关键点说明
  • 解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
  • STC8G 8051内核单片机开发(GPIO)
  • “Payload document size is larger than maximum of 16793600.“问题解决(MongoDB)
  • C++ 网络编程(14) asio多线程模型IOThreadPool
  • PyTorch 安装使用教程
  • EXCEL小妙招——判断A列和B列是否相等
  • AI时代SEO关键词策略
  • cv610将音频chn0配置为g711a,chn1配置为 aac编码,记录
  • Java 大视界 -- Java 大数据机器学习模型在自然语言处理中的跨语言信息检索与知识融合(331)
  • Docker:容器化技术的基石与实践指南
  • 机器学习在智能能源管理中的应用:需求响应与可再生能源整合
  • ECharts 安装使用教程
  • 计算机视觉的新浪潮:扩散模型(Diffusion Models)技术剖析与应用前景
  • 第8章网络协议-NAT
  • 多种方法实现golang中实现对http的响应内容生成图片
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ButtonRippleEffect(按钮涟漪效果)
  • springboot切面编程
  • Softhub软件下载站实战开发(十):实现图片视频上传下载接口
  • 全角半角空格在网页中占位符和编码emsp;ensp;