51单片机学习笔记8 中断系统及定时器

51单片机学习笔记8 中断系统及定时器

  • 一、中断的概念
  • 二、51单片机的中断
    • 1. 51单片机的中断源
    • 2. 中断的优先级
    • 3. 中断结构
    • 4. 外部中断解读
    • 5. 定时器中断
    • 6. 串口中断
  • 三、中断相关寄存器
    • 1. IE 中断允许寄存器
    • 2. TCON 中断请求标志
    • 3. IP 中断优先级
  • 四、中断号
  • 五、代码实现
    • 按键 :
    • LED:
    • 1. 按键事件切换LED亮的状态
      • key_utils.c
      • main.c
  • 六、定时/计数器结构
    • 1. 寄存器介绍
      • TMOD
      • TCON
    • 2. 定时器/计数器工作方式0
      • (1)工作特点
      • (2)门控位说明
      • (3)C/T
    • 3. 工作方式1
    • 4. 工作方式2
    • 5. 工作方式3
  • 七、定时器代码实现
    • 1. 定时器配置步骤
    • 2. 计时器初值计算
    • 3. 示例
      • `timer_utils.c`
      • main.c

在这里插入图片描述

一、中断的概念

中断是一种事件驱动的机制,允许单片机在执行程序的过程中暂时中断当前的任务,转而处理来自外部的优先级更高的事件。
当中断事件发生时,单片机会立即跳转到中断服务程序(ISR),执行相关的处理代码,然后返回到原来的程序继续执行。

二、51单片机的中断

1. 51单片机的中断源

51单片机中的中断源可以是外部硬件引脚的电平变化(外部中断),也可以是单片机内部的定时器/计数器溢出、串口接收等(内部中断)。

不同的51单片机中断源可能有所不同。一般51单片机至少有 5个中断:外部中断0、定时器0中断、外部中断1、定时器1中断、串口中断。

STC89C51RC/RD+ 的系列单片机提供了8个中断请求源,分别是:

  • 外部中断0
  • 定时器0 中断
  • 外部中断1
  • 定时器1 中断
  • 串口中断
  • 定时器2中断
  • 外部中断2
  • 外部中断3

在 中颖的SH79F6442中,提供了27个中断源,其中有5个外部中断、3个定时器中断,另外还有4个PCA中断、4个EUART中断、系统时钟监控中断、1个SPI中断、ADC中断、3路PWM中断、LED中断、TWI中断、CRC中断、LPD中断。

2. 中断的优先级

51单片机中,不同中断源之间存在优先级关系,当多个中断同时发生时,优先级高的中断会先得到响应。
可以通过设置中断优先级和中断允许位来控制不同中断源之间的优先级和允许状态。
下图是来自《STC89Cxx中文参考手册.pdf》 里的中断说明:在这里插入图片描述

3. 中断结构

下图也是摘自《STC89Cxx中文参考手册》,其结构
在这里插入图片描述
上图的解读,整体是以列的方式从左往右看,数据从最左侧是中断源,经过中断允许控制寄存器(开关),到中断优先级控制寄存器,再流向处理程序。

靠上的中断优先级更高。

4. 外部中断解读

  • INT0对应P3.2引脚
  • INT1对应P3.3引脚

中断信号传递流程:

  1. INT0 中断信号通过IT0(TCON控制寄存器第0位)引脚,来选择触发方式(0:低电平触发或 1:下降沿触发);
  2. 触发中断后,将IE0(TCON寄存器第1位,中断标志)置1;
  3. 判断EX0(IE中断允许寄存器第0位)如果是1,就是INT0使能,中断可以继续向后传递;
  4. 如果全局总中断EA(IE中断允许寄存器第7位)打开,中断可以继续传递;
  5. 中断优先级控制寄存器IP判断哪个中断先触发;
  6. 触发CPU的中断服务函数。

从上面的流程可以看出,IE.EX0即使失能状态,也可以通过TCON.IE0读取中断信号。

外部中断INT1对应P3.3引脚,工作流程与INT0类似。

5. 定时器中断

  • T0对应 P3.4引脚
  • T1对应 P3.5 引脚
  1. 有计数信号进入T0;
  2. 计数溢出时,触发 TF0(TCON计数器寄存器,TF0溢出中断标志);
  3. 如果ET0(IE中断第1位,T0的溢出中断允许位),继续传递;
  4. 如果全局总中断EA(IE中断允许寄存器第7位)打开,继续传递;
  5. 中断优先级控制器IP判断优先级;
  6. 触发CPU中断服务函数。

6. 串口中断

  • RX 对应 P3.0引脚
  • TX 对应 P3.1 引脚
  1. 当接收到数据或发送完成时,串口硬件会设置RI/TI标志位,表示接收到了数据;
  2. 如果 ES(IE寄存器的第4位,串行口中断允许位)被设置,允许串口中断继续传递;
  3. 如果全局总中断 EA(IE寄存器的第7位,全局中断允许位)被打开,则允许中断继续传递;
  4. 中断优先级控制器IP判断优先级;
  5. 触发中断服务函数;

三、中断相关寄存器

1. IE 中断允许寄存器

IE 地址为 A8H,格式如下:

编号作用
EA7全局中断允许位
6无效位,保留
ET25定时器/计数器2中断允许位
ES4串行口中断允许位
ET13定时器/计数器1中断允许位
EX12外部中断1允许位
ET01定时器/计数器0中断允许位
EX00外部中断0允许位

2. TCON 中断请求标志

编号作用
TF17定时器/计数器1溢出标志位
TR16定时器/计数器1运行控制位
TF05定时器/计数器0溢出标志位
TR04定时器/计数器0运行控制位
IE13外部中断1标志位
IT12外部中断1触发方式选择位
IE01外部中断0标志位
IT00外部中断0触发方式选择位

3. IP 中断优先级

编号作用
7无效位,保留
PT26定时器/计数器2中断优先级位
PS5串行口中断优先级位
PT14定时器/计数器1中断优先级位
PX13外部中断1优先级位
PT02定时器/计数器0中断优先级位
PX01外部中断0优先级位
0无效位,保留

这里对寄存器简单介绍,更详细地说明可以参考本文对应的开源代码里的《STC89Cxx中文参考手册》。

四、中断号

下面是关于中断号的说明:

中断号描述
0外部中断0
1定时器/计数器0 溢出中断
2外部中断1
3定时器/计数器1 溢出中断
4串行口通信中断
5定时器/计数器2 溢出中断
6-7保留

五、代码实现

硬件连接:

按键 :

在这里插入图片描述

LED:

在这里插入图片描述
其中按键3是在P3.2引脚,中断0。

1. 按键事件切换LED亮的状态

key_utils.c

#include "key_utils.h"
#include <reg52.h>
#include "common_utils.h"sbit KEY3 = P3^2;
sbit LED1 = P2^0;/*** @brief 按键中断初始化*/
void key3_init(void){IT0 = 1; // 下降沿触发EX0 = 1; // 开启外部中断0EA  = 1;  // 开启总中断            }
void exti0() interrupt 0{delay_10us(500);if(KEY3 == 0){LED1 = !LED1;}
}

main.c

#include <reg52.h>
#include "led_utils.h"
#include "common_utils.h"
#include "key_utils.h"
#include "types.h"/**
* @brief 主函数
*/
main()
{// 关闭所有ledled_all_off();key3_init();while(1){}
}

六、定时/计数器结构

在这里插入图片描述

  • T0:P3.4
  • T1:P3.5 引脚
  • TMOD:定时器的工作模式
  • TCON:低4位控制外部中断,高4位用于定时器控制位

1. 寄存器介绍

TMOD

TMOD用于控制定时器/计数器的工作模式和计数方式,寄存器各位功能:

Bit:    7       6       5       4       3       2       1       0┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐│ GATE │ C/T │ M1  │ M0  │ GATE │ C/T │ M1  │ M0  │└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘T1    T1    T0    T0    T1    T1    T0    T0

TMOD 寄存器各位的功能
分成2组,高4位、低4位,分别控制定时器1、定时器0的工作模式。

  • 位7:GATE1(定时器1门控位):当 GATE1 为 1 时,定时器1的计数/定时工作由外部引脚控制。当 GATE1 为 0 时,定时器1的计数/定时工作受到内部控制。
  • 位6:C/T1(定时器1计数/定时选择位):当 C/T1 为 0 时,定时器1为定时器模式;当 C/T1 为 1 时,定时器1为计数器模式。
  • 位5-4:M11 和 M10(定时器1工作模式位):用于设置定时器1的工作模式,共有四种工作模式,分别为:
    • 00:13位定时器模式
    • 01:16位定时器模式
    • 10:8位自动重装载定时器模式
    • 11:两个8位定时器/计数器分开工作
  • 位3:GATE0(定时器0门控位):与位7相似,用于控制定时器0的门控功能。
  • 位2:C/T0(定时器0计数/定时选择位):与位6相似,用于设置定时器0的工作模式。
  • 位1-0:M01 和 M00(定时器0工作模式位):与位5-4相似,用于设置定时器0的工作模式。

TCON

TCON 用于控制定时器/计数器的工作状态和中断标志位,各位功能:

Bit:    7       6       5       4       3       2       1       0┌─────┬─────┬─────┬─────┬─────┬─────┬─────┬─────┐│  TF1 │ TR1 │  TF0 │ TR0 │ IE1 │ IT1 │ IE0 │ IT0 │└─────┴─────┴─────┴─────┴─────┴─────┴─────┴─────┘

TCON 寄存器各位的功能

  • 位7:TF1(定时器1溢出标志位):当定时器1溢出时,TF1 置1,表示定时器1计数达到最大值并溢出。如果不使用中断,也可以通过查询知道是否溢出。
  • 位6:TR1(定时器1运行控制位):当 TR1 置1 时,定时器1开始工作;当 TR1 清0 时,定时器1停止工作。
  • 位5:TF0(定时器0溢出标志位):当定时器0溢出时,TF0 置1,表示定时器0计数达到最大值并溢出。
  • 位4:TR0(定时器0运行控制位):当 TR0 置1 时,定时器0开始工作;当 TR0 清0 时,定时器0停止工作。
  • 位3:IE1(外部中断1标志位):外部中断1的中断标志位,当外部中断1触发时,IE1 置1。
  • 位2:IT1(外部中断1触发方式选择位):外部中断1的触发方式选择位,控制外部中断1的触发方式。
  • 位1:IE0(外部中断0标志位):外部中断0的中断标志位,当外部中断0触发时,IE0 置1。
  • 位0:IT0(外部中断0触发方式选择位):外部中断0的触发方式选择位,控制外部中断0的触发方式。

2. 定时器/计数器工作方式0

(1)工作特点

也称为13位定时器模式,结构图如下:
在这里插入图片描述
其特点是:

  • 定时器/计数器的计数范围为0到8191(2^13-1)。
  • 该模式下,定时器/计数器每计数一次,计数值加1,直到达到最大计数值(8191),然后溢出并重新从0开始计数。

计数由TL0的低5位和TH0的高8位组成,低5位溢出时向TH0进位,TH0 溢出时,TCON.TF0 置位。

(2)门控位说明

  • 门控位GATE是0的时候,经过一个非门、或门、与门,定时器可以由 TR0控制。
  • 当GATE是1的时候,定时器由INT0 引脚控制。

(3)C/T

控制计数还是定时模式,即开关:
在这里插入图片描述

3. 工作方式1

在这里插入图片描述

工作方式1称为16位定时器模式:

  • 定时器/计数器的计数范围为0到65535(2^16-1)。
  • 该模式下,定时器/计数器每计数一次,计数值加1,直到达到最大计数值(65535),然后溢出并重新从0开始计数。

4. 工作方式2

在这里插入图片描述

  • 也称为8位自动重装载定时器模式,定时器/计数器的计数范围为0到255(2^8-1)。
  • 该模式下,定时器/计数器每计数一次,计数值加1,当计数值达到最大值(255)时,自动重新加载初始计数值。
  • 自动重新装载,是将TH0装载到TL0。

5. 工作方式3

工作方式只适应用于T0,也称为两个8位定时器/计数器分开工作模式,其特点:

  • 两个8位定时器/计数器分开工作,分别为定时器0和定时器1,每个定时器/计数器的计数范围为0到255(2^8-1)。
  • 可以独立控制每个定时器/计数器的工作模式、计数方式和中断功能。

七、定时器代码实现

1. 定时器配置步骤

  1. 选择定时器
  2. 选择工作模式
  3. 设置定时器初值
  4. 选择时钟源
  5. 中断使能
  6. TR0或TR1置位,启动定时器
  7. 中断处理

2. 计时器初值计算

使用开源仓库里的51定时器计算工具计算,晶震频率根据开发板实际频率填写。
在这里插入图片描述

3. 示例

本示例每秒LED闪烁一次:

timer_utils.c

#include "timer_utils.h"
#include <reg51.h>
#include "types.h"sbit LED1 = P2^0;/**
* @brief 定时器 0 初始化函数
*/
void timer1_init(void){// 选择为定时器 0 模式,工作方式 1TMOD |= 0X01;// 给定时器赋初值,定时 1msTH0 = 0XFC;TL0 = 0X66;// 打开定时器 0 中断允许ET0 = 1;// 打开总中断EA = 1;// 打开定时器TR0 = 1;
}
// 定义静态变量 i
static u16 i;/**
* @brief 定时器 0 中断函数
*/
void timer1() interrupt 1 
{// 定时器重新赋初值,定时 1msTH0 = 0XFC;     TL0 = 0X66; i++;if(i == 1000){i =0 ;LED1 = !LED1;}
}

main.c

#include <reg52.h>
#include "led_utils.h"
#include "common_utils.h"
#include "types.h"
#include "timer_utils.h"/**
* @brief 主函数
*/
main()
{// 关闭所有ledled_all_off();time0_init();while(1){}
}

本文开源地址:
https://gitee.com/xundh/learn51

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

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

相关文章

html5cssjs代码 029 CSS计数器

html5&css&js代码 029 CSS计数器 一、代码二、解释 该HTML代码定义了一个网页的结构和样式。在头部&#xff0c;通过CSS样式定义了body和h1-h2元素的样式。body元素的样式包括文本居中、计数器重置、字体颜色和背景颜色。h2元素的样式使用了CSS计数器来自动在标题前添加…

Web框架开发-Django模型层(数据库操作)

一、ORM介绍 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动ORM是“对象-关系-映…

stable diffusion webui ubuntu 安装

1.git clone 下来 GitHub - AUTOMATIC1111/stable-diffusion-webui: Stable Diffusion web UIStable Diffusion web UI. Contribute to AUTOMATIC1111/stable-diffusion-webui development by creating an account on GitHub.https://github.com/AUTOMATIC1111/stable-diffus…

RAFT: Adapting Language Model to Domain Specific RAG

预备知识 RAG介绍一文搞懂大模型RAG应用&#xff08;附实践案例&#xff09; - 知乎 (zhihu.com) RAG的核心理解为“检索生成” 检索&#xff1a;者主要是利用向量数据库的高效存储和检索能力&#xff0c;召回目标知识&#xff1b; 生成&#xff1a;利用大模型和Prompt工程…

Redis的分片机制

Redis的分片机制 Redis是一个开源的内存数据结构存储系统&#xff0c;它支持键值对的存储方式。Redis的分片机制允许将数据在多个节点上进行分布式存储和处理&#xff0c;从而提高系统的性能和可扩展性。 Redis的分片机制是通过一致性哈希算法实现的。一致性哈希算法将所有的ke…

解决在命令行中输入py有效,输入python无效,输入python会跳转到microsoft store的问题| Bug

目录 如果你已经尝试过将python添加到系统变量在系统变量里把你自己的路径放到应用商店的路径之前删除windowsapps下的python.exe文件 如果你还未将python添加到系统变量没有python安装包且没有配置系统变量 如果你已经尝试过将python添加到系统变量 打开 运行&#xff0c;输入…

Idea 不能创建JDK1.8的spring boot项目

由于https://start.springboot.io/ 不支持JDK1.8&#xff0c;那么我们需要换idea的springboot创建源&#xff0c;需要换成 https://start.aliyun.com&#xff0c;这也是网上大部分教程说的&#xff0c;但是我这边会报这样的错误&#xff1a; Initialization failed for https:…

【C语言】结构体内存对齐问题

1.结构体内存对齐 我们已经基本掌握了结构体的使用了。那我们现在必须得知道结构体在内存中是如何存储的&#xff1f;内存是如何分配的&#xff1f;所以我们得知道如何计算结构体的大小&#xff1f;这就引出了我们今天所要探讨的内容&#xff1a;结构体内存对齐。 1.1 对齐规…

【数据结构】——线性表(顺序表加链表),万字解读(加链表oj详解)

前言 由于之前存在过对两者的区别考虑&#xff0c;所以把他们放在一起来说&#xff0c;更加容易区别和理解 对于有关线性表的概念这里就不展示了&#xff0c;这里主要是介绍线性表里面的这两个结构的知识点 一.顺序表 1.顺序表介绍 顺序表的存储结构和逻辑结构都是相邻的&a…

爬虫入门系列-HTML基础语法

&#x1f308;个人主页&#xff1a;会编辑的果子君 &#x1f4ab;个人格言:“成为自己未来的主人~” HTML基础语法 bs4解析比较简单&#xff0c;但是呢&#xff0c;首先你需要了解一丢丢的html知识&#xff0c;然后再去使用bs4去提取&#xff0c;逻辑和编写难度就会非常简…

常用负载均衡详解

一、介绍 在互联网场景下&#xff0c;负载均衡&#xff08;Load Balance&#xff09;是分布式系统架构设计中必须考虑的一个环节&#xff0c;它通常是指将负载流量&#xff08;工作任务、访问请求&#xff09;平衡、分摊到多个操作单元&#xff08;服务器、组件&#xff09;上去…

小程序绕过 sign 签名

之前看到了一篇文章【小程序绕过sign签名思路】之前在做小程序渗透时也遇到了这种情况&#xff0c;但是直接放弃测试了&#xff0c;发现这种思路后&#xff0c;又遇到了这种情况&#xff0c;记录下过程。 并没有漏洞分享&#xff0c;仅仅是把小程序也分享出来&#xff0c;方便…

Redis如何设置键的生存时间或过期时间

键的生存时间或过期时间 概述。 通过EXPIRE命令或者PEXIPIRE命令&#xff0c;客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间(Time To Live,TTL)&#xff0c;在经过指定的秒数或者毫秒数之后&#xff0c;服务器就会自动删除生存时间为0的键: 127.0.0.1:6379>…

酷开系统用电视为居家生活打开精彩窗口|酷开科技|酷开会员|

随着互联网的发展&#xff0c;电视也承载了更多的功能。相比于传统的电视&#xff0c;如今的智能电视屏幕更大、分辨率更高、色彩更加鲜艳&#xff0c;能够呈现出更加逼真的画面效果。当观众观看大屏电视时&#xff0c;仿佛置身于电影大幕的场景之中&#xff0c;感受到更为震撼…

神经网络(深度学习,计算机视觉,得分函数,损失函数,前向传播,反向传播,激活函数)

目录 一、神经网络简介 二、深度学习要解决的问题 三、深度学习的应用 四、计算机视觉 五、计算机视觉面临的挑战 六、得分函数 七、损失函数 八、前向传播 九、反向传播 十、神经元的个数对结果的影响 十一、正则化与激活函数 一、神经网络简介 神经网络是一种有监督…

EasyExcel模板填充list时按第一行格式合并单元格(含分页线设置)

前言&#xff1a; 在使用easyExcel填充list时&#xff0c;第一行存在合并单元格的情况下&#xff0c;后面使用forceNewRow()填充的行却没有合并样式。 模板&#xff1a; 填充后&#xff1a; 自定义拦截器&#xff1a; 根据官方文档的提示&#xff0c;我们需要自定义拦截器来…

【Redis】Redis常见原理和数据结构

Redis 什么是redis redis是一款基于内存的k-v数据结构的非关系型数据库&#xff0c;读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 redis的数据类型 string&#xff1a;字符串 缓存对象&#xff0c;分布式ID&#xff0c;token&#xff0c;se…

MySQL分组查询与子查询 + MySQL表的联结操作

目录 1 MySQL分组查询与子查询 1.1 数据分组查询 1.2 过滤分组 1.3 分组结果排序 1.4 select语句中子句的执行顺序 1.5 子查询 2 MySQL表的联结操作 2.1 关系表 2.2 表联结 2.3 笛卡尔积 2.4 内部联结 2.5 外联结 2.6 自联结 2.7 组合查询 1 MySQL分组查询与子查询…

树莓派夜视摄像头拍摄红外LED灯

NoIR相机是一种特殊类型的红外摄像头&#xff0c;其名称来源于"No Infrared"的缩写。与普通的彩色摄像头不同&#xff0c;NoIR相机具备红外摄影和低光条件下摄影的能力。 一般摄像头能够感知可见光&#xff0c;并用于普通摄影和视频拍摄。而NoIR相机则在设计上去除了…

基于BusyBox的imx6ull移植sqlite3到ARM板子上

1.官网下载源码 https://www.sqlite.org/download.html 下载源码解压到本地的linux环境下 2.解压并创建install文件夹 3.使用命令行配置 在解压的文件夹下打开终端&#xff0c;然后输入以下内容&#xff0c;其中arm-linux-gnueabihf是自己的交叉编译器【自己替换】 ./config…