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

【笔记】重学单片机(51)(下)

中断系统

正常运行过程中,被打断进行另外工作,结束后回到原有进程。
5个中断源

外部中断源(2个):INT0——由P3.2端口线引入,低电平或下降沿引起。INT1——由P3.3端口线引入,低电平或下降沿引起。这两个外部中断源标志和它们的触发方式控制位由特殊功能寄存器TCON的低4位控制。
内部中断源(3个):T0——定时器/计数器0中断,由T0回零溢出引起。T1——定时器/计数器1中断,由T1回零溢出引起。TI/RI——串行I/O中断,串行端口完成一帧字符发送/接收后引起。这3个内部中断源的控制位分别锁存在特殊功能寄存器TCON和SCON中。

在这里插入图片描述

1、中断请求标志TCON(88H)可位寻址 【2.配置中断方式】

TCON:Timer控制寄存器,低4位管理外部中断
作用:设置外部中断触发方式,标注外部中断请求。
在这里插入图片描述

IE0/IE1:外部中断申请标志位:=0:没有外部中断申请;=1:有外部中断申请。
IT0/IT1:外部中断请求的触发方式选择位:=0:在INT0/INT1端申请中断的信号 低电平 有效;注意:低电平触发 引脚上的低电平须持续到中断发生。若中断返回前仍未及时撤除低电平,将再次中断。=1:在INT0/INT1端申请中断的信号 负跳变 有效。注意:负脉冲触发 CPU在前一机器周期采到INT0/INT1引脚为高,后一机器周期采到为低才认为是一次中断请求。CPU 可记忆申请、可自动撤除中断申请。

2、中断允许控制寄存器IE(A8H)【1.允许中断】

作用:CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。
在这里插入图片描述

EA , CPU中断允许(总允许)位; =0 时禁止全部中断;=1 时允许中断。
ES,串行口中断允许位;=0 时禁止中断;  =1 时允许中断。
ET1,定时/计数器T1中断允许位;=0 时禁止中断;  =1 时允许中断。
EX1,外部中断1允许位;=0 时禁止中断;  =1 时允许中断。
ET0,定时/计数器T0中断允许位;=0 时禁止中断;  =1 时允许中断。
EX0,外部中断0允许位; =0 时禁止中断;  =1 时允许中断。

3.中断优先级控制寄存器IP (B8H)可位寻址【3.中断处理-优先级】

在这里插入图片描述

PX0/PX1:INT0/1优先级控制位:=0 时属低优先级; =1 时属高优先级。
PT0/PT1:T0/1中断优先级控制位:=0 时属低优先级; =1 时属高优先级。
PS:串行口中断优先级控制位:=0 时属低优先级; =1 时属高优先级。

对同时发生多个中断申请时:

不同优先级的中断同时申请(很难遇到)——先高后低
相同优先级的中断同时申请(很难遇到)——按序执行
正处理低优先级中断又接到高级别中断——高打断低
正处理高优先级中断又接到低级别中断——高不理低

在这里插入图片描述

编程知识点

中断响应条件:

此中断源的中断允许位为1。
总中断CPU中断打开(EA = 1)。
中断源有中断请求。

中断初始化:

EX0 = 1; //开外部中断0
IT0 = 0; //低电平触发
EA = 1; //开总中断

编程

1.外部中断0低电平触发

实现:外部中断0低电平触发方式,每按下一次S2按键就会进入一次中断,LED灯会发生状态变化。
注意:

按键S2:连接在P3.0引脚(定义为key_s2)
中断触发信号:由P3.7引脚(定义为flag)产生 低电平
外部中断0:实际中断触发引脚为P3.2(固定硬件功能),需确保硬件上P3.7与P3.2物理连接
#include <reg52.h>#define uint unsigned int
#define uchar unsigned charsbit key_s2 = P3^0;//独立按键S2
sbit flag = P3^7; //外部中断信号产生脚/*====================================
函数	: delay(uint z)
参数	:z 延时毫秒设定,取值范围0-65535
返回值	:无
描述	:12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); 		
} 
//外部中断0初始化
void int0Init()
{EA = 1;	//开总中断EX0 = 1;//开外部中断0IT0 = 0;//外部中断0低电平触发	
}void main()//main函数自身会循环
{int0Init();//外部中断0初始化	while(1){if(key_s2 == 0)//判断S2是否被按下{delay(20);//按键消抖if(key_s2 == 0){flag = 0;flag = 0;//产生低电平,CPU会采样2次P3.2的状态,两次都为低才触发flag = 1;//结束低电平while(!key_s2);//松手检测}	}}	
}//外部中断1中断服务程序
void int0() interrupt 0
{P1 = ~P1;//P1的状态按位取反
}  

外部中断1跳变沿

实现:外部中断1下降沿触发方式,每按下一次S2按键就会进入一次中断,LED灯会发生状态变化。

#include <reg52.h>#define uint unsigned int
#define uchar unsigned charsbit key_s2 = P3^0;//独立按键S2
sbit flag = P3^7; //外部中断信号产生脚/*====================================
函数	: delay(uint z)
参数	:z 延时毫秒设定,取值范围0-65535
返回值	:无
描述	:12T/Fosc11.0592M毫秒级延时
====================================*/
void delay(uint z)
{uint x,y;for(x = z; x > 0; x--)for(y = 114; y > 0 ; y--); 		
} 
//外部中断1初始化
void int1Init()
{EA = 1;	//开总中断EX1 = 1;//开外部中断1IT1 = 1;//外部中断1下降沿触发	
}void main()//main函数自身会循环
{int1Init();//外部中断1初始化	while(1){if(key_s2 == 0)//判断S2是否被按下{delay(20);//按键消抖if(key_s2 == 0){flag = 1;flag = 0;//产生下降沿while(!key_s2);//松手检测}	}}	
}//外部中断1中断服务程序
void int1() interrupt 2
{P1 = ~P1;
}  

未完待续……

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

相关文章:

  • ArcGIS的字段计算器生成随机数
  • 数据库提权
  • 并发编程常用工具类(下):CyclicBarrier 与 Phaser 的协同应用
  • (论文速读)RMT:Retentive+ViT的视觉新骨干
  • Hadoop HDFS 3.3.4 讲解~
  • 嵌入式知识篇---闪存
  • mysql 数据库系统坏了,物理拷贝出数据怎么读取
  • Deepoc 赋能送餐机器人:从机械执行到具身智能的革命性跨越
  • JavaScript 中的流程控制语句详解
  • 机器学习实战:逻辑回归深度解析与欺诈检测评估指标详解(二)
  • Redis缓存详解及常见问题解决方案
  • MySQL 基本操作入门指南
  • MCP进阶:工业协议与AI智能体的融合革命
  • 使用 SecureCRT 连接华为 eNSP 模拟器的方法
  • typeof和instanceof区别
  • Linux学习记录(八)文件共享
  • 认识pytorch与pytorch lightning
  • BackgroundTasks 如何巧妙驾驭多任务并发?
  • 我的创作纪念日____在 CSDN一年来的成长历程和收获
  • openvela之内存管理
  • Linux 磁盘管理与分区配置
  • VUE+SPRINGBOOT从0-1打造前后端-前后台系统-注册实现
  • 向量魔法:Embedding如何赋能大模型理解世界
  • Go语言select
  • Git基础玩法简单描述
  • 【LeetCode刷题集】--排序(一)
  • ICCV2025 Tracking相关paper汇总和解读(19篇)
  • ubuntu 20.04 C和C++的标准头文件都放在哪个目录?
  • windows双系统下ubuntu20.04安装教程
  • HTTPS有哪些优点