当前位置: 首页 > 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.dtcms.com/a/315353.html

相关文章:

  • 数据结构——并查集及C++实现
  • Javascript面试题及详细答案150道(046-060)
  • 5天从0到1!用阿里Qwen3-Coder开发故障调度指挥室系统,运维也能搞定开发
  • 嵌入式 C 语言入门:函数指针基础笔记 —— 从计算器优化到指针本质
  • 文本转语音(TTS)脚本
  • 【项目实践】在系统接入天气api,根据当前天气提醒,做好plan
  • C语言的控制语句
  • 16day-人工智学习-机器学习-特征工程
  • 【世纪龙科技】虚拟技术助力职教汽车自动变速器拆装虚拟实训软件
  • RFID技术在汽车倍速链中的应用:驱动智能制造的隐形引擎
  • Windows/Linux入侵排查
  • CPP学习之多态
  • Python高频元素分析技术:高效找出序列中出现次数最多的元素
  • 【Unity3D实例-功能-镜头】第三人称视觉
  • FeiQ飞秋安装教程:FeiQ.1060559168 详细安装步骤(附注意事项)​
  • 【QT】常⽤控件详解(三)常用按钮控件PushButton RadioButton CheckButton Tool Button
  • 茗鹤工业低代码可视化技术开发平台
  • 网络相关命令
  • 全国计算机二级C语言二级考试通关笔记
  • 风光储并网协同运行simulink仿真模型实现
  • [找出字符串中第一个匹配项的下标]
  • MiDSS复现
  • Codeforces Round 1010 (Div. 2, Unrated)
  • 8.4IO进程线程——进程
  • MySQL 基本操作入门指南
  • 代码随想录day55图论5
  • 通往L4之路:构建自我进化的智能驾驶决策大脑
  • Dubbo 3.x源码(32)—Dubbo Provider处理服务调用请求源码
  • CSS 安卓应用卸载碎片化动画效果
  • pyqt5-tools/pyqt6-tools 安装失败,解决办法