【51单片机】程序实验1112.外部中断-定时器中断

news2024/12/26 23:06:56

主要参考学习资料:B站【普中官方】51单片机手把手教学视频

前置知识:C语言

单片机套装:普中STC51单片机开发板A4标准版套餐7

码字不易,求点赞收藏加关注(´•ω•̥`)

有问题欢迎评论区讨论~

目录

  • 程序实验11&12.外部中断-定时器中断
    • 中断系统
      • 中断概念
      • 中断结构
      • 中断寄存器
        • IE 寄存器
        • TCON寄存器
        • 中断优先级
        • 中断号
        • 中断响应条件
    • 外部中断
      • 硬件设计
      • 实验11 外部中断
    • 定时器中断
      • 定时器介绍
        • CPU时序
        • 定时器原理
        • 定时器结构
          • 工作方式寄存器TMOD
          • 控制寄存器TCON
        • 定时器工作方式
          • 方式0
          • 方式1
          • 方式2
          • 方式3
      • 定时器配置
      • 实验12 定时器中断

程序实验11&12.外部中断-定时器中断

中断系统

中断概念

中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在很大程度上提高了单片机处理外部或内部事件的能力。引起程序中断的根源称为中断源

单片机处理中断的过程:

引起CPU中断的根源称为中断源

单片机的中断系统允许有多个中断源,当几个中断源同时向CPU发出中断请求时,需要解决中断优先级的问题,CPU会先执行优先级高的中断程序。单片机中对中断源有默认的优先级别,也可以通过对应的寄存器修改优先级。

如果CPU在执行中断源A的中断程序时发生了优先级更高的中断源B,那么CPU将转而执行B的中断程序再回到原来的位置继续执行A的中断程序,称为中断嵌套。中断嵌套在51单片机中应用很少,在STM32、DSP等中断较为复杂的单片机中经常遇到。

中断的优点:分时操作、实时响应、可靠性高。

中断结构

一个增强型51单片机提供了8个中断源,分别为外部中断INT0~3、定时器中断TIME0~2和一个串行口中断UART,而普通系列的51单片机均有的5个中断源为INT0、INT1、T0、T1、UART。

如图是一个中断结构,从上到下中断的优先级从高到低,左侧连接单片机管脚。在中断标志之前,外部中断需要先通过IT0、IT1选择中断触发方式,0为低电平触发,1为下降沿触发。中断标志在接收到中断后自动置为1,其中串行中断的中断标志经过一个或运算。IE寄存器 设置中断在程序中的有效与否,源允许分别控制每个中断的有效性,而总允许控制所有中断的有效性,只有中断对应的源允许和总允许都接通时才能被CPU接收。IP寄存器 部分配置中断优先级,1的优先级高于0,其余遵循默认优先级。

中断寄存器

IE 寄存器
76543210
字节地址:A8HEAESET1EX1ET0EX0

允许接收中断时将相应的位设为1。

TCON寄存器
76543210
字节地址:88HTF1TR1TF0TR0IE1IT1IE0IT0

IT0和IT1控制相应外部中断的触发方式,0为低电平触发,1为下降沿触发。TR0、TR1为定时器控制位,在定时器中断中会讲到。其余中断请求标志位皆由单片机内部自动设置。

中断优先级
中断源中断标志中断服务程序入口优先级顺序
外部中断0(INT0)IE00003H
定时/计数器0(T0)TF0000BH
外部中断1(INT1)IE10013H
定时/计数器1(T1)TF1001BH
串行口R1或T10023H
中断号

中断号在程序中指引CPU定位哪个中断并进入相应的中断服务程序。

中断源符号名称中断引起原因中断号
INT0外部中断0P3.2引脚低电平或下降沿信号0
T0定时器中断0定时/计数器0计数回0溢出1
INT1外部中断1P3.3引脚低电平或下降沿信号2
T1定时器中断1定时/计数器1计数回0溢出3
T1/R1串行口中断串行通信完成一帧数据发送或接收引起中断4
中断响应条件

满足下面三个条件CPU才能触发中断响应:

  • 中断源有中断请求。
  • 中断源的中断允许为1。
  • CPU开中断。
    以外部中断0为例:
EA = 1; //打开总中断开关
EX0 = 1; //打开外部中断0
IT0 = 0; //设置外部中断的触发方式
void int0() interrupt 0 //中断函数需要interrupt跟随中断号
{
	//编写用户所需的功能代码
}

外部中断

硬件设计

外部中断INT0和INT1分别为单片机管脚P32和P33的附加功能,而这两个管脚又与独立按键K3和K4连接。管脚自带上拉电阻默认为高电平,按键按下时管脚接地变为低电平,假如将外部中断配置为下降沿的触发方式则按键按下瞬间触发外部中断。

实验11 外部中断

实现功能:使用独立按键K3控制LED1亮灭。

#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;

//定义按键和LED1的控制管脚
sbit KEY3 = P3^2;
sbit LED1 = P2^0;

//毫秒延时函数
void delay_ms(u16 ms)
{
	u16 i, j;
	for(i = ms;i > 0;i--)
		for(j = 110;j > 0;j--);
}

//外部中断0配置函数
void exti0_init()
{
	//寄存器的每一位在reg52.h头文件里均已定义
	IT0 = 1; //设置外部中断触发方式为下降沿
	EX0 = 1; //打开外部中断0开关
	EA = 1; //打开总中断开关
}

void main()
{
	exti0_init();
	while(1)
	{
		//当检测到中断,CPU会自动跳到主函数外的中断服务函数
	}
}

//外部中断0服务函数
void exti0() interrupt 0
{
	delay_ms(10); //消抖
	if(KEY3 == 0)
	{
		LED1 = !LED1; //切换LED1的亮灭状态
	}
}

定时器中断

定时器介绍

CPU时序
  • 振荡周期:为单片机提供定时信号的振荡源的周期。
  • 状态周期:两个振荡周期。
  • 机器周期:六个状态周期。
  • 指令周期:完成一条指令占用的时间,通常为1~4个机器周期。
    如果单片机的振荡频率为12MHz,则对应的机器周期为 1 μ s 1\mathrm{\mu s} 1μs
定时器原理

定时器的实质是一种加一计数器,随着脉冲的输入自动加一,可存储16位,分为高八位TH和低八位TL。当计数器数位全为1时,下一个脉冲将使计数器溢出,计数器归零的同时会使相应的中断标志置一。定时和计数的次数通过计数器的初值来设定, 次数 = 溢出值 − 初值 次数=溢出值-初值 次数=溢出值初值,对于较大的次数采用分段计数。

定时器结构

51单片机定时器的工作由两个特殊八位寄存器TCON和TMOD来控制。TMOD确定定时器的工作方式和功能,TCON低四位控制外部中断,高四位控制定时器的启停及溢出。

定时器的两个功能分别为定时功能和计数功能。定时功能接收来自CPU振荡器(OSC)的机器周期脉冲,计数功能接收来自单片机管脚P3.4和P3.5的脉冲。

工作方式寄存器TMOD
76543210
字节地址:89HGATEC/ T ˉ \bar{\mathrm{T}} TˉM1M0GATEC/ T ˉ \bar{\mathrm{T}} TˉM1M0

低四位控制T0,高四位控制T1。

  • GATE:门控位,控制定时器启动是否受外部中断影响。当GATE=0,只需通过寄存器TCON的TR0/TR1=1来使对应定时器启动;当GATE=1,在前面的基础上还需要来自外部中断引脚INT0/INT1的高电平才能启动。
  • C/ T ˉ \bar{\mathrm{T}} Tˉ:定时/计数模式选择位,定时器模式设为0,计数器模式设为1。
  • M1&M0:工作方式选择位,见下表:
M1M0工作方式说明
00方式013位定时/计数器
01方式116位定时/计数器
10方式28位自动重装定时/计数器
11方式3T0分成两个独立的8位定时/计数器;T1此方式停止计数
我们常用的为方式1和方式2,方式1用于定时/计数器工作,方式2用于串口通信波特率的生成,将在下一个实验涉及。
控制寄存器TCON
76543210
字节地址:88HTF1TR1TF0TR0
TF0/TF1:定时器溢出中断请求标志,由硬件自动完成,可通过调用查询定时器溢出状态。

TR0/TR1:定时器的运行控制位,设置为1时定时器开始工作,设置为0时定时器停止工作。

定时器工作方式
方式0

13位定时/计数器用到TH的八位和TL的低五位。

GATE控制原理:GATE经过一个非门后和INT引脚进行或门运算,若GATE=0,非门后为1,无论INT引脚为0还是1,或运算结果都为1;若GATE=1,非门后为0,只有INT引脚为1,或运算结果才为1。随后再和TR运行控制位进行与运算,当TR=1且或运算结果为1时定时器启动。

C/ T ˉ \bar{\mathrm{T}} Tˉ控制原理:当C/ T ˉ \bar{\mathrm{T}} Tˉ=1,虚线对应开关打到1,定时器接收T0引脚的脉冲;当C/ T ˉ \bar{\mathrm{T}} Tˉ=0,开关打到0,定时器接收机器周期脉冲。

方式1

方式1与方式0的区别为定时器TH的八位和TL的八位都参与计数。

方式2

方式2中用TL进行计数,TH进行装载。当TL溢出时,TH会自动将设置好的值装载进TL重新开始计数,适用于精确的脉冲信号发生器,例如串口通信。

方式3

方式3只适用于T0,此时T1停止工作。其中TL0可用于定时和计数,与中断标志TF0连接;TH0仅用于定时,与中断标志TF1连接。

定时器配置

  • 对TMOD赋值以确定T0和T1的工作方式。
  • 根据所要定时的时间计算初值并写入TH0、TL0或TH1、TL1。
  • 如果使用中断,则对EA赋值并开放定时器中断。
  • 设置TR0或TR1为1,启动定时/计数器定时或计数。
    对于初值的计算,可使用相关软件。下图中,方式1溢出值为 2 16 = 65536 2^{16}=65536 216=65536,减去1ms对应的机器周期数1000,将结果64536转化为十六进制,FC对应高八位写入TH,18对应低八位写入TL。

//以定时器0的配置为例
void time0_init()
{
	TMOD |= 0x01; //选择为定时器0模式,工作方式1
	TH0 = 0xFC; //给定时器赋初值,定时1ms
	TL0 = 0x18;
	ET0 = 1; //打开定时器0中断允许
	EA = 1; //打开总中断
	TR0 = 1; //打开定时器
}

其中TMOD使用了或运算是为了不干扰高四位对定时器1的配置,赋值符号右侧将高四位都设为0不会改变原有高四位的值,如果配置定时器1则将低四位都设为0。

实验12 定时器中断

实现功能:通过定时器0中断控制D1指示灯隔1秒闪烁。

#include "reg52.h"

typedef unsigned char u8;
typedef unsigned int u16;

//定义LED1的控制管脚
sbit LED1 = P2^0;

//定时器0初始化函数
void time0_init()
{
	TMOD |= 0x01;
	TH0 = 0xFC;
	TL0 = 0x66;
	ET0 = 1;
	EA = 1;
	TR0 = 1;
}

void main()
{
	time0_init();
	while(1)
	{
	}
}

//定时器0中断服务函数
void time0() interrupt 1
{
	//静态变量i累计毫秒值
	static u16 i = 0;
	//触发中断后将定时器重置为初值,使其立即重新计时
	TH0 = 0xFC;
	TL0 = 0x66;
	//毫秒值累加
	i++;
	//如果达到1秒
	if(i == 1000)
	{
		i = 0; //重新累计毫秒值
		LED1 = !LED1; //切换LED1亮灭状态
	}
}

本篇完

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

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

相关文章

驱动---1.DAC8552实现三角波输出

最近开始进行新项目的研发,考虑用DAC做一个前级输出,选择了DAC8552这个器件的一个模块,用了野火的指南者做主控,芯片是STM32F103VET6,主频是72MHz。 一、器件手册重要信息提取 1.DAC8552具有十六位的分辨率、双通道输…

虚幻引擎生存建造系统

先做一个建造预览模式,按下按键B后进入建造预览模式 首先创建自定义事件Preview Loop 用射线追踪摆放物体预览位置,并做一个预览材质 增强输入设置按键 每帧判断是否进入建造模式 预览模式制作成功! 接着做点击左键放置物品&#xff0…

IP研究 | 大数据洞察黄油小熊的爆火之路

一只来自泰国的小熊在国内红成了顶流。 今年,黄油小熊以烘焙店“打工人”的超萌形象迅速走红,2个月内火遍中国的社交媒体,泰国门店挤满飘洋过海求合影的中国粉丝,根据数说故事全网大数据洞察,黄油小熊2024年度的线上声…

深度学习案例:DenseNet + SE-Net

本文为为🔗365天深度学习训练营内部文章 原作者:K同学啊 一 回顾DenseNet算法 DenseNet(Densely Connected Convolutional Networks)是一种深度卷积神经网络架构,提出的核心思想是通过在每一层与前面所有层进行直接连接…

【java学习笔记】Set接口实现类-LinkedHashSet

一、LinkedHashSet的全面说明 (就是把数组不同位置的链表当成一个节点然后相连)

【大模型系列篇】LLaMA-Factory大模型微调实践 - 从零开始

前一次我们使用了NVIDIA TensorRT-LLM 大模型推理框架对智谱chatglm3-6b模型格式进行了转换和量化压缩,并成功部署了推理服务,有兴趣的同学可以翻阅《NVIDIA TensorRT-LLM 大模型推理框架实践》,今天我们来实践如何通过LLaMA-Factory对大模型…

【C++】LeetCode:LCR 078. 合并 K 个升序链表

题干: 给定一个链表数组,每个链表都已经按升序排列。 请将所有链表合并到一个升序链表中,返回合并后的链表。 解法:优先队列 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *ne…

数据结构和算法-04二叉树-04

广度优先的实现力扣中常见的二叉树相关问题及基本解决方案 tips: 在解决问题时,先确保问题能解决,再去考虑效率,这是解题的关键,切不可为追求效率而变成了技巧性解答。 广度优先 广度优先(层序遍历)遍历的方式是按层次…

DMA代码部分

第一个程序的接线图 OLED ShowHexNum(2,1,(uint32_t)&ADC1->DR,8); 这样可以看AD的DR寄存器的的地址(固定的)了 可以跑一下然后和手册对比 先查ADC1的地址 再在外设的总表里面, 查一下DR相对于上面地址的偏移量 所以其地址为4001 244C 研究一下外设寄存器的地址是怎么…

spdlog高性能日志系统

spdlog高性能日志系统 spdlog 是一个快速、简单、功能丰富的 C 日志库,专为现代 C 开发设计。它支持多种日志后端(如控制台、文件、syslog 等),并提供灵活的格式化和线程安全的日志输出。 1. 特点 极高的性能:大量的编…

FPGA在线升级 -- Multiboot

简介 本章节主要描述关于如何从Golden Image转换到Multiboot Image程序。 升级方案 Golden Image转换到Multiboot Image的方法主要又两种 1、使用ICAPE2 原语; 2、在XDC文件中加入升级约束命令; 以上两种方案都可以实现在线升级,第一种升级…

守护进程化

目录 一、进程组 二、会话 (1)什么是会话 (2)如何创建一个会话 三、守护进程 一、进程组 之前我们学习过进程,其实每一个进程除了有一个进程 ID(PID)之外 还属于一个进程组。进程组是一个或者多个进程的集合&…

QML插件扩展

https://note.youdao.com/ynoteshare/index.html?id294f86c78fb006f1b1b78cc430a20d74&typenote&_time1706510764806

RabbitMQ七种工作模式之 RPC通信模式, 发布确认模式

文章目录 六. RPC(RPC通信模式)客户端服务端 七. Publisher Confirms(发布确认模式)1. Publishing Messages Individually(单独确认)2. Publishing Messages in Batches(批量确认)3. Handling Publisher Confirms Asynchronously(异步确认) 六. RPC(RPC通信模式) 客⼾端发送消息…

ArcGIS字符串补零与去零

我们有时候需要 对属性表中字符串的补零与去零操作 我们下面直接视频教学 下面看视频教学 ArcGIS字符串去零与补零 推荐学习 ArcGIS全系列实战视频教程——9个单一课程组合 ArcGIS10.X入门实战视频教程(GIS思维) ArcGIS之模型构建器(Mod…

前端面试如何出彩

1、原型链和作用域链说不太清,主要表现在寄生组合继承和extends继承的区别和new做了什么。2、推荐我的两篇文章:若川:面试官问:能否模拟实现JS的new操作符、若川:面试官问:JS的继承 3、数组构造函数上有哪些…

大模型应用编排工具Dify之构建专属FQA应用

1.前言 ​ 通过 dify可以基于开源大模型的能力,并结合业务知识库、工具API和自定义代码等构建特定场景、行业的专属大模型应用。本文通过 dify工作室的聊天助手-工作流编排构建了一个基于历史工作日志回答问题的助手,相比原始的大模型答复,通…

前端node环境安装:nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

需求:在做前端开发的时候,有的时候 这个项目需要 node 14 那个项目需要 node 16,我们也不能卸载 安装 。这岂不是很麻烦。这个时候 就需要 一个工具 来管理我们的 node 版本和 npm 版本。 下面就分享一个 nvm 工具 用来管理 node 版本。 这个…

c基础加堆练习题

1】思维导图: 2】在堆区空间连续申请5个int类型大小空间,用来存放从终端输入的5个学生成绩,然后显示5个学生成绩,再将学生成绩升序排序,排序后,再次显示学生成绩。显示和排序分别用函数完成 要求&#xff…

嵌入式Linux 设备树 GPIO详解 示例分析 三星 NXP RK

GPIO设备树用于在Linux内核中定义与GPIO相关的硬件资源,它使操作系统可以识别、配置和使用GPIO引脚。设备树中通常会指定GPIO控制器的基地址、GPIO引脚的中断配置、时钟和其他相关信息。 目录 RK相关案例代码 NXP相关案例代码 三星相关案例代码 在设备树中&…