嵌入式第四十六天(51单片机(中断,定时器))

一.独立按键设置

1.

#include "key.h"void init_key(void)
{P1 |= (0x0F << 4);
}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{ret = 0;}return ret;
}

二.外部中断

1.终端流程

2.代码编写

#include <reg52.h>
#include "delay.h"
#include "digtub.h"void init_enit(void)
{IE |= (1<<7)|(1<<0)|(1<<2);TCON |= (1<<0)|(1<<2);TCON &= ~(1<<0);P3 |= (1<<2)|(1<<3);
}int num = 0;void enit0_hander(void) interrupt 0
{++num;if(num > 9999){num = 0;}
}void enit1_hander(void) interrupt 2
{--num;if(num < 0){num = 9999;}
}int main(void)
{init_enit();while(1){show_number(num);	}
}

三.定时器

51单片机的定时器(如T0、TI)本质是可编程的16位计数器,核心功能是“计数”或“定时”,原理基于“晶休振荡器提供的固定时钟信号”


核心原理拆解:
1.时钟来源
定时器的计数脉冲来自两个选择:


定时模式:脉冲来自单片机内部时钟 (由外部晶振分频得到),如晶振11.0592MHz时,内部时钟频率为11.0592MHz / 12 = 921.6kHz, 即每个计数脉冲的周期约1.08545(定时的最小单位))


计数模式:脉冲来自外部引脚(TO 对应P3.4、TI对应P3.5),引脚每发生一次电平跳变(下降沿),计数器加|(用于统计外部事件次数,如脉冲数),


2.计数器结构
定时器由两个8位寄存器(高8位THx、低8位TLx)组成16位计数器(x=0或1,对应TOTI),计数范围是0000H ~ FFFFH (共65536个计数单位)。


3.工作流程(以定时模式为例)


1.初始化:通过 TMOD寄存器设置定时器模式(如定时模式、16位自动重装),通过THx和TLX设置初始计数value(如要定时Ims,计算初始值后写入);


2.启动:设置TRx=1(TO的TRO、TI 的TRI),定时器开始以固定时钟脉冲计数,每来一个脉冲,TLx加1,TLx溢出时向THx进位,THx溢出时(计数器从初始值到FFFFH);


3.中断触发:计数器溢出后,自动置位“温出标志位”(TFx=1),若此时中断允许(ETx=1、EA=1),则触发定时器中断,CPU暂停主程序执行中断服务函数;


4.重装(可选):若设置为“自动重装模式”(如TMOD的M1 =1,M0=0),溢出后THx和TLx会自动恢复为初始值,无需在中断服务函数中手动重置,可实现周期性定时,


示例:11.0592MHz晶振下定时Ims
内部时钟周期:12 / 11059200Hz 1.085μs;
Ims所需计数次数:1000μs /1.085μS 元921;
16位计数器最大值65536,因此初始值:
65536 - 921 = 64615,转换为十六进制是FC67H,即THO=OxFC、TLO=0x67.


6、什么是PWM?
(1) PWM(脉冲宽度调制,Pulse Width
Modulation)
PWM是一种通过改变“脉冲信号的高电平时间
占比”来模拟模拟信号的技术,
比如:LED调光(高电平占比高则灯亮,占比
低则灯暗)、电机调速(占比高则转速快)
-—核心是“用数字脉冲的‘占比’替代连续的模拟电压”,避免了模拟电路的精度问题,且易于单片机控制,

2.51单片机代码实现

#include <reg52.h>
#include "key.h"#define Hz200 63035
#define Hz400 64285
#define Hz800 64910
#define Hz2000 65285unsigned int n = Hz200;void init_timer0(void)
{TMOD &= ~(3<<2);TMOD &= ~(3<<0);TMOD |= (1<<0);TH0 = n >> 8;TL0 = n;//TCON |= (1<<4);IE |= (1<<7)|(1<<1);
}/*void timer0_hander(void) interrupt 1
{static int t;++t;if(t >= 500){P2 ^= 0xFF;t = 0;}TH0 = 64535 >> 8;TL0 = 64535;
} */void timer1_hander(void) interrupt 1
{P2 ^= (1<<1);TH0 = n >> 8;TL0 = n;
}int main(void)
{init_timer0();init_key();while(1){int ret;ret = key_pressed();if(ret == 0){TCON &= ~(1<<4);		}if(ret == 1){n = Hz200;TCON |= (1<<4);}if(ret == 2){n = Hz400;TCON |= (1<<4);}if(ret == 3){n = Hz800;TCON |= (1<<4);}if(ret == 4){n = Hz2000;TCON |= (1<<4);}}return 0;
}

四.重点概念

1.中断:   

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

中断源:

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

2.

中断处理流程:

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


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


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


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


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


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


(4).保护现场:


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


(5).执行中断服务函数;


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

(6).恢复现场;

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

3.中断嵌套:

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

4.中断向量表:

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

5.51单片机的定时器工作原理:

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

6.PWM:

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

核心参数:

周期、频率、占空比、分辨率、幅值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/98333.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/98333.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Visual Studio Code2024安装包及安装教程

一、软件下载软件名称&#xff1a;Visual Studio Code 2024安装环境&#xff1a;window10及以上系统下载链接&#xff1a;https://pan.quark.cn/s/d9831b28c69a解压软件Bandizip下载链接&#xff1a;https://pan.quark.cn/s/a54e79b5d553二、软件安装1、下载后&#xff0c;先解…

fps:游戏玩法

能帮到你的话&#xff0c;就给个赞吧 &#x1f618; 文章目录游戏玩法倒计时僵尸潮游戏成功&失败计时玩法&#xff1a;玩家在计时内存活&#xff0c;成功&#xff1b;反之失败Game界面&#xff1a;由关卡调用计时系统计时完成&#xff1a;调用结果界面结果界面玩家死亡&…

如何建立针对 .NET Core web 程序的线程池的长期监控

如何建立针对 .NET Core web 程序的线程池的长期监控 建立针对 .NET Core Web 应用程序线程池的长期监控是一个系统性的工程&#xff0c;它涉及代码集成、指标收集、存储、可视化和告警。 核心思路 线程池监控不是孤立的&#xff0c;它必须与应用程序的整体性能指标&#xff08…

前端开发学习路径

前端开发学习路径前端开发基础技能HTML、CSS和JavaScript是前端开发的三大核心技术。HTML用于构建网页结构&#xff0c;CSS负责样式设计&#xff0c;JavaScript实现交互功能。掌握这三项技术是学习前端开发的基础。现代前端开发通常需要了解ES6语法&#xff0c;包括箭头函数、解…

一款没有任何限制的免费远程手机控制手机的软件简介

这是一款没有任何限制的免费远程手机控制手机的软件支持安卓和苹果1.安装1.1被控制端安装airdroid1.2控制端air mirror2.登录同一个账号3.控制使用打开控制端软件选择要控制的机器直接点“远程控制“连接上后就可以任意操作被控手机了

在word中使用lateX公式的方法

非常好的问题&#xff01;这是一个许多科研人员和学生都渴望实现的功能。但需要明确的是&#xff1a; **Microsoft Word 本身并不具备“自动”将 LaTeX 代码实时转换为渲染后公式的功能。** 它不像 Overleaf 或 VS Code 的 Markdown 插件那样&#xff0c;输入 $Emc^2$ 就立刻变…

23种设计模式——代理模式(Proxy Pattern)详解

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。 &#x1f34e;个人主页&#xff1a;Meteors.的博客 &#x1f49e;当前专栏&#xff1a;设计模式 ✨特色专栏&#xff1a;知识分享 &#x…

webpack scope hositing 和tree shaking

Scope Hoisting&#xff08;作用域提升&#xff09; 和 Tree Shaking&#xff08;摇树优化&#xff09; 是现代前端构建中至关重要的概念。它们是构建工具&#xff08;如 Webpack、Rollup、Vite&#xff09;用来优化最终打包产物的核心技术。 核心概念快速理解 Tree Shaking&am…

手写React状态hook

在日常开发中&#xff0c;我们经常用到 React 的状态管理 Hook&#xff1a;useState 和 useReducer。 但你有没有想过&#xff1a;这些 Hook 内部是怎么实现的&#xff1f;为什么调用 setState 之后组件会重新渲染&#xff1f; 今天我们就来从零手写 useState 和 useReducer&am…

力扣hot100:相交链表与反转链表详细思路讲解(160,206)

问题描述核心思路&#xff1a;双指针交替遍历算法思想&#xff1a; 使用两个指针 pa 和 pb 分别从链表A和链表B的头节点出发&#xff0c;同步向后遍历。当任一指针走到链表末尾时&#xff0c;将其重定位到另一链表的头节点继续遍历。若两链表相交&#xff0c;pa 和 pb 最终会在…

跨平台游戏引擎 Axmol-2.8.1 发布

所有使用 axmol-2.8.0 的开发者都应更新至此版本 Axmol 2.8.1 版本是一个以错误修复和功能改进为主的次要 LTS 长期支持版本&#xff0c;发布时间: 2025 年 9 月 5 日 &#x1f64f;感谢所有对 axmol 项目的贡献者&#xff0c;包括财务赞助者&#xff1a;scorewarrior、peter…

通过PXE的方式实现Ubuntu 24.04 自动安装

PXE自动化安装Ubuntu 24.04的配置文件之前都是通过PXE来自动化安装Redhat系列的&#xff0c;例如&#xff1a;Rocky9、Rocky10、CentOS7、银河麒麟 Kylin-V10、Kylin-V11、OpenEuler 24.03等。现在安装Ubuntu系列的跟红帽的不太一样&#xff0c;所以在这里介绍下。创建三个文件…

AOSP Framework开发的一些超方便的快捷命令

在系统源码中发现的一些命令和快捷方式。我们在编译源码之前执行的source build/envsetup.sh,通过cat build/envsetup.sh发现如下命令 - lunch: lunch <product_name>-<build_variant>Selects <product_name> as the product to build, and <build_…

【Protues仿真】基于AT89C52单片机的数码管驱动事例

目录 0案例视频效果展示 1 AT89C52单片机驱动单个数码管 1.1 数码管基础知识 1.1.1外观与引脚 1.1.2 共阴(CC) vs 共阳(CA) 1.1.3段码表(以数字1为例) 1.1.4驱动方式A. 直连IO(最简单,占用IO多)一个段一根线,共阴或共阳公共端固定接GND/VCC。适合单个数码管、…

01-Redis 发展简史与核心定位解析:从诞生到三大产品矩阵

目录引言一、Redis 的起源与发展&#xff1a;从定制工具到开源生态二、Redis 的核心定位&#xff1a;不止是缓存的多面手三、Redis 三大产品矩阵&#xff1a;按需选择的完整解决方案3.1 Redis Open Source&#xff08;社区版&#xff09;&#xff1a;入门与轻量场景首选3.2 Red…

记录jilu~

centos1、安装最小版Linux 安装必要工具yum -install -y epel-releaseyum -install -y net-toolsyum -install -y vim2、修改hostname hostnamectl net-hostname newhostname3、网络配置文件&#xff0c;网关 &#xff0c; 使用ip &#xff0c;dns。。/etc/sysconfig/network-s…

【Linux基础】fdisk命令详解:从入门到精通的磁盘分区管理完全指南

目录 前言 1 fdisk命令概述 1.1 什么是fdisk 1.2 fdisk的应用场景 1.3 fdisk与其他分区工具的比较 2 fdisk命令的安装与基本语法 2.1 在不同Linux发行版中安装fdisk 2.2 fdisk的基本语法 3 fdisk命令参数详解 3.1 主要参数说明 3.2 交互式命令 4 fdisk操作流程详解…

Flowable 工作流引擎

1、核心类 Flowable 引擎通过 ProcessEngine 作为总入口点&#xff0c;提供了多个核心服务接口&#xff0c;每个服务都负责特定的功能领域&#xff1a;服务名称 (Service Name)主要功能 (Main Functionality)关键操作 (Key Operations)RepositoryService管理流程定义和部署&…

(RDFS)随机深度特征选择方法解释:简而言之,RDFS主要针对的是恶意的服务器,它建立在客户端是诚实的前提下。

1. 随机深度特征选择是怎么实现的&#xff1f;随机深度特征选择 是一种在分布式机器学习&#xff08;特别是联邦学习&#xff09;中用于保护客户端数据隐私的技术。它的核心思想是&#xff1a;在每一轮训练中&#xff0c;每个客户端随机选择模型的一个子集&#xff08;即“深度…

C++20格式化字符串:std::format的使用与实践

在C编程中&#xff0c;字符串格式化是一项常见的任务。在C20引入std::format之前&#xff0c;开发者通常依赖于一些传统的解决方案&#xff0c;如printf系列函数、sstream&#xff0c;或者第三方库如boost.format。然而&#xff0c;这些方法在代码可读性、类型安全性和灵活性方…