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

51单片机------中断系统

1.中断系统的基本概念和处理流程

(1)中断

        当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完成以后,再回到原来被中断的地方,继续原来的工作,这样的过程称为中断。

(2)中断源

        实现中断功能的部件称为中断系统,请示CPU中断的请求源称为中断源。微型机的中断系统一般允许多个中断源,当几个中断源同时向CPU请求中断,要求为它服务的时候,这就存在CPU优先响应哪一个中断源请求的问题。通常根据中断源的轻重缓急排队,优先处理最紧急事件的中断请求源,即规定每一个中断源有一个优先级别。CPU总是先响应优先级别最高的中断请求。

(3)中断处理流程

1.中断源发出中断请求:

        中断源通过特定信号,向 CPU 或内核发起 “需要即时处理” 的请求,触发中断流程。

2.内核检查是否响应相应中断以及该中断是否被屏蔽

     内核通过查询中断控制器的配置,判断两要素:一是该中断是否在 “可响应中断列表” 内;二是该中断是否被 “中断屏蔽字” 禁用。

3.内核会检查中断的中断优先级:

        内核读取中断对应的优先级标识,判断其优先级是否高于当前正在执行任务的优先级 —— 仅高优先级中断可 “抢占” 当前任务,低优先级则排队等待。

4.保护现场:

        内核将当前 CPU 寄存器的数值、当前任务的上下文保存至指定存储区,确保后续恢复后能回到中断前的执行状态。

5.执行中断服务函数;

        内核跳转到该中断对应的 “中断服务程序” 入口,执行预设的处理逻辑,这是中断的核心处理环节。

6.恢复现场;

        从存储区中取出步骤 4 保存的寄存器值和任务上下文,恢复 CPU 状态,让系统回到中断发生前的执行点,继续运行被中断的任务

(4)中断嵌套

        当CPU正在处理一个中断源请求的时候(即执行相应的中断服务程序),发生了另外一个优先级比它还高的中断源请求。如果CPU能够暂停对原来中断源的服务程序,转而去处理优先级更高的中断请求源,处理完以后,再回到原低级中断服务程序,这样的过程称为中断嵌套。

(5)中断向量表

        中断向量表是存储于内存固定地址的核心数据结构,其本质是建立 “中断号(唯一中断标识)” 与 “中断服务程序(ISR)入口地址” 的一一映射,为 CPU / 内核提供中断响应时快速定位服务程序的 “索引表”,是中断机制高效寻址的基础。

(6)51单片机的定时器工作原理

原理:

        51 单片机定时器本质是可编程减计数 / 加计数硬件模块,核心基于内部晶振分频后的时钟脉冲驱动,通过预设计数初值、配置工作模式,实现定时(按时间间隔触发)或计数(对外部脉冲计数)功能,溢出时可触发中断或输出信号。

步骤:

  1. 时钟源与分频:定时器时钟来自单片机晶振经分频(如 12 分频)后的脉冲信号,或外部引脚输入的脉冲(计数模式);
  2. 计数与初值配置:通过寄存器设置计数初值(补偿满量程计数差值,实现精准定时 / 计数),模块按时钟脉冲累加 / 累减计数;
  3. 溢出与触发:当计数值达到模块满量程(如 16 位定时器计至 65535)时产生 “溢出”,触发中断请求(需开启中断使能),或置位标志位,完成一次定时 / 计数周期,随后可自动重装初值(部分模式)重复运行 。

(7)PWM

定义:

        PWM(Pulse Width Modulation,脉冲宽度调制)是一种通过周期性输出高低电平脉冲信号,以调节高电平(有效电平)在一个周期内占比,从而等效控制输出 “平均电压 / 功率” 的数字信号调制技术。其核心是利用数字电路的离散电平,模拟出连续的模拟量输出效果,广泛应用于电机调速、灯光调光、电源稳压等场景。

PWM 核心参数

参数名称定义
周期(Period)脉冲信号完成一次 “高电平 + 低电平” 循环的时间,单位通常为 μs、ms,与 “频率” 成反比(频率 = 1 / 周期)。
频率(Frequency)单位时间内脉冲信号的循环次数,单位为 Hz,决定信号切换的快慢,影响负载(如电机)的响应特性。
占空比(Duty Cycle)一个周期内,高电平(有效电平)持续时间与周期的比值,通常用百分比表示,是 PWM 控制 “平均输出量” 的核心参数(如占空比 50% 即高、低电平各占周期一半)。
分辨率(Resolution)占空比可调节的最小精度,由生成 PWM 的硬件(如定时器位数)决定,例如 8 位 PWM 的分辨率为 1/2⁸=0.39%,意味着占空比可按 0.39% 的步长调节。
幅值(Amplitude)脉冲信号的高电平电压值(如 5V、12V),即信号的最大输出电平,决定负载可获得的最大电压 / 功率上限。

2.51单片机定时器与蜂鸣器模块

类型专业定义核心特征(本质区别)
有源蜂鸣器内置音频振荡驱动电路的蜂鸣器,只需接入直流电源(如 DC 3V/5V),即可通过内部电路自激振荡产生固定频率的声音。内置驱动电路,通电即响,发声频率固定。
无源蜂鸣器仅由压电陶瓷片 / 电磁线圈等发声元件构成,无内置驱动电路,需外部输入特定频率的交变方波信号(高低电平交替),才能驱动发声元件振动产生声音。无内置驱动电路,需外部信号驱动,发声频率由外部信号决定。

        由于51单片机中一般为源蜂鸣器,因此可以利用定时器在一定时间内对蜂鸣器进行频繁的通电与断电来控制蜂鸣器的频率

eg:

#include <reg52.h>
#include "key.h"void int_key(void)
{P1 |= 0x0F << 4;P3 |= 1 << 5;
}int key_pressed(void)
{static int ret = 0;if((P1 & (1 << 4)) == 0){ret = 1;}else if((P1 & (1 << 5)) == 0){ret = 2;}else if((P1 & (1 << 6)) == 0){ret = 3;}else if((P1 & (1 << 7)) == 0){ret = 4;}else if((P3 & (1 << 5)) == 0){ret = 5;}return ret;
}
#include <reg52.h>
#include "key.h"#define Hz100 60285
#define Hz200 63035
#define Hz300 63835
#define Hz400 64285
#define Hz500 64535unsigned short n;void init_time0(void)
{TMOD &= ~(3 << 2);TMOD &= ~(3 << 0);TMOD |= (1 << 0);TH0 =  n >> 8;TL0 =  n;IE |= (1 << 7) | (1 << 1);
}void time0_rountine(void) interrupt 1
{
/*static int cont = 0;++cont;if(500 == cont){P2 ^= 0xFF;cont = 0;}
*/P2 ^= (1 << 1);TH0 = n >> 8;TL0 = n;
}int main(void)
{P1 &= ~(0xF << 0);init_time0();int_key();while(1){int key = 0;key = key_pressed();if(1 == key){n = Hz100;TCON |= (1 << 4);	}else if(2 == key){n = Hz200;TCON |= (1 << 4);}else if(2 == key){n = Hz300;TCON |= (1 << 4);}else if(2 == key){n = Hz400;TCON |= (1 << 4);}else if(2 == key){n = Hz500;TCON |= (1 << 4);}else{TCON &= ~(1 << 4);	}}
}

http://www.xdnf.cn/news/20233.html

相关文章:

  • 51单片机基础day3
  • 开源混合专家大语言模型(DBRX)
  • Spring WebFlux 流式数据拉取与推送的实现
  • UIViewController生命周期
  • Word封面对齐技巧(自制)
  • UE4 UAT 的六大流程 build cook stage pacakge archive deploy 与UAT的参数
  • 硬件(二) 中断、定时器、PWM
  • 当电力设计遇上AI:良策金宝AI如何重构行业效率边界?
  • Linux2.6内核进程O(1)调度队列
  • 电机控制(三)-电机控制方法基础
  • Java集合---Collection接口和Map接口
  • C++:类和对象(中)
  • 在线测评系统---第n天
  • 执行select * from a where rownum<1;,数据库子进程崩溃,业务中断。
  • LabVIEW--二维数组、三维数组、四维数组
  • Pydantic模型验证测试:你的API数据真的安全吗?
  • Selenium 页面加载超时pageLoadTimeout与 iframe加载关系解析
  • 静态电流Iq 和 ICONT_MAX
  • GD32入门到实战32--产品配置参数存储方案 (NORFLASH)
  • rabbitmq 入门知识点
  • Go 自建库的使用教程与测试
  • 脑卒中目标检测含完整数据集
  • CSS 优先级详解:理解选择器权重和层叠规则
  • 鸿蒙NEXT动画开发指南:组件与页面典型动画场景解析
  • 【C++练习】06.输出100以内的所有素数
  • Java 攻克 PDF 表格数据提取:从棘手挑战到自动化实践
  • 深度学习——数据增强
  • devcpp 5.11的详细安装步骤
  • 上位机知识篇---conda run
  • 文华财经多空提示指标公式 变色K线多空明确指标 文华wh6赢顺多空买卖提示指标