C51 单片机学习(二):定时器与中断系统

参考

  • 51单片机入门教程

1. 定时器

1.1 定时器定义

  • 51 单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成
    • C51 单片机学习(一):基础外设 讲的都是单片机的 IO 口控制的外设

1.2 定时器作用

  • 用于计时系统,可实现软件计时,或者使程序每隔一固定时间完成一项操作
  • 替代长时间的 Delay,提高 CPU 的运行效率和处理速度
    • Delay() 时 CPU 干不了其它事,就会白白占用 CPU 的时间

1.3 STC89C52 定时器资源

  • 定时器个数:3个(T0、T1、T2),T0 和 T1 与传统的 51 单片机兼容,T2 是此型号单片机增加的资源

    注意:定时器的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的定时器个数和操作方式,但一般来说,T0 和 T1 的操作方式是所有 51 单片机所共有的(T:Timer,计数器

1.4 定时器框图

  • 定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔 “一秒”,计数单元的数值就增加一,当计数单元数值增加到 “设定的闹钟提醒时间” 时,计数单元就会向中断系统发出中断申请,产生 “响铃提醒”,使程序跳转到中断服务函数中执行
    • 中断系统也是 51 单片机的内部资源,中断系统是为了使 CPU 具有外界紧急事件的实时处理能力而设置
      在这里插入图片描述

1.5 定时器工作模式

  • STC89C52 的 T0 和 T1 均有四种工作模式
    • 模式 0:13 位定时器/计数器
    • 模式 1:16 位定时器/计数器(常用)
    • 模式 2:8 位自动重装模式
    • 模式 3:两个 8 位计数器
      在这里插入图片描述

1.6 定时器时钟

  • SYSclk 系统时钟(下图左上部分):即晶振周期,本开发板上的晶振为 12MHz
    • MCU in 12T mode 进行 1MHZ 的一个分频,每隔 1us 进行一次计数,当它为最大值时就会产生一次中断
    • T0 pin:单片机外部的一个接口,时钟可以由系统时钟提供也可以由外部引脚提供
    • 中间是一个选择开关,C = Count(计数) ,T = Timer(计时器) ,C = 1、T = 0,如果这一位给 1 就链接到 T0 pin ,给 0 就是连接到 SYSclk
  • 计数/定时系统(下图左下部分):TL0(低字节)和 TH0(高字节),0 代表定时器 0,这是一个十六位的计数器,这两个字节计数范围 0~65535
    • 计数系统的左边的时钟给了它提供了一个脉冲(方波),每来一个脉冲它的定时器的值就会加 1,一直这样循环往复的话,当加到 65535 时,那么再下一个脉冲的时候它就会产生一个溢出,溢出时这个计数器就会到 0 的位置
    • 溢出标志位:TF0,负责向中断系统申请中断请求
    • TR0 控制定时器的启动是否暂停,当 TR0 = 1 时开始计数
      在这里插入图片描述

2. 中断系统

2.1 概述

在这里插入图片描述

2.2 中断程序流程

在这里插入图片描述

2.3 STC89C52 中断资源

  • 中断源个数:8 个(外部中断 0、定时器 0 中断、外部中断 1、定时器 1 中断、串口中断、定时器 2 中断、外部中断 2、外部中断 3)
    • 中断优先级个数:4 个
    • 中断号
      在这里插入图片描述

注意:中断的资源和单片机的型号是关联在一起的,不同的型号可能会有不同的中断资源,例如中断源个数不同、中断优先级个数不同等等

3. 定时器和中断系统

3.1 连接框图

  • 中断源:INT0(外部中断 0)、INT1(外部中断 1)、T0(定时器 0)、T1(定时器 1)、RXD 和 TXD(同属串口中断)
    在这里插入图片描述

3.2 相关寄存器

  • 寄存器是连接软硬件的媒介,在单片机中寄存器就是一段特殊的 RAM 存储器

    • 一方面,寄存器可以存储和读取数据
    • 另一方面,每一个寄存器背后都连接了一根导线,控制着电路的连接方式
    • 单片机中两种寄存器:ROM 和 RAM
      在这里插入图片描述
  • 可位寻址/不可位寻址

    • 可位寻址可以单独的对一位寄存器进行赋值:如 P2 = 1; P2_1 = 1; 都可
    • 不可位寻址就是它的寄存器只能进行整体的进行赋值

3.3 寄存器配置

  • TMOD 配置

    • 1.5 小节提到模式 1 最常用,则 M1 = 0,M0 = 1
    • 选用 SYSclk 系统时钟,则 C/T(取反) = 0
    • GATE(门控端),GATE = 0
  • TCON 配置

    • TF0 中断溢出标志位,程序中可直接先给 TF0 = 0,因为一旦 TF0 = 1 就会产生中断
    • TR0 = 1 表示开始计数
    • IE0 和 IT0 用来控制外部中断引脚,但 GATE 门控端 = 0,所以不用配置这两个
    • TH0 = 64536/256; // 取出高 8 位
    • TL0 = 64536%256; // 取出低 8 位

3.4 中断配置

  • 参照 3.1 小节连接框图配置如下参数
    • ET0 = 1
    • EA = 1
    • PT0 = 0

3.3 代码示例

1、按键控制 LED 流水灯模式
  • Delay.h
#ifndef __DELAY_H__
#define __DELAY_H__void Delay(unsigned int xms);#endif
  • Delay.c
void Delay(unsigned int xms) {unsigned char i, j;while (xms--) {i = 2;j = 239;do {while (--j);} while (--i);}
}
  • Key.h
#ifndef __KEY_H__
#define __KEY_H__unsigned char Key();#endif
  • Key.c
#include <REGX52.H>
#include "Delay.h"/*** @brief  获取独立按键键码* @param  无* @retval 按下按键的键码,范围:0~4,无按键按下时返回值为0*/
unsigned char Key() {unsigned char KeyNumber=0;if (P3_1 == 0) {Delay(20); while (P3_1 == 0); Delay(20); KeyNumber = 1;}if (P3_0 == 0) {Delay(20); while (P3_0 == 0); Delay(20); KeyNumber = 2;}if (P3_2 == 0) {Delay(20); while (P3_2 == 0); Delay(20); KeyNumber = 3;}if (P3_3 == 0) {Delay(20); while (P3_3 == 0); Delay(20); KeyNumber = 4;}return KeyNumber;
}
  • Timer0.h
#ifndef __TIMER0_H__
#define __TIMER0_H__void Timer0Init(void);#endif
  • Timer0.c
#include <REGX52.H>/*** @brief  定时器 0 初始化,1 毫秒 @12.000MHz* @param  无* @retval 无*/
void Timer0Init(void) {TMOD &= 0xF0;      // 把 TMOD 低 4 位清零,高四位保持不变TMOD |= 0x01;      // 把 TMOD 最低位置零,高四位保持不变TL0 = 0x18;        // 设置定时初值,低 8 位TH0 = 0xFC;        // 设置定时初值,高 8 位TF0 = 0;           // 清除 TF0 标志TR0 = 1;           // 定时器 0 开始计时ET0 = 1;EA = 1;PT0 = 0;
}/*定时器中断函数模板
void Timer0_Routine() interrupt 1 {static unsigned int T0Count;TL0 = 0x18;  // 设置定时初值TH0 = 0xFC;  // 设置定时初值T0Count++;if (T0Count >= 1000) {T0Count = 0;	}
}
*/
  • main.c
#include <REGX52.H>
#include "Timer0.h"
#include "Key.h"
#include <INTRINS.H>unsigned char KeyNum, LEDMode;void main() {P2 = 0xFE;Timer0Init();while (1) {KeyNum = Key();          // 获取独立按键键码if (KeyNum) {            // 如果按键按下if (KeyNum == 1) {   // 如果 K1 按键按下LEDMode++;       // 模式切换if (LEDMode >= 2)LEDMode = 0;}}}
}void Timer0_Routine() interrupt 1 {static unsigned int T0Count;TL0 = 0x18;    // 设置定时初值TH0 = 0xFC;    // 设置定时初值T0Count++;     // T0Count 计次,对中断频率进行分频if (T0Count >= 500) {    // 分频 500 次,500msT0Count = 0;if (LEDMode == 0)      // 模式判断P2 = _crol_(P2, 1);   // LED 输出if (LEDMode == 1)P2 = _cror_(P2, 1);}
}
2、 定时器时钟
  • main.c
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "Timer0.h"unsigned char Sec=55,Min=59,Hour=23;void main() {LCD_Init();Timer0Init();LCD_ShowString(1, 1, "Clock:");  // 上电显示静态字符串LCD_ShowString(2, 1, "  :  :");while (1) {LCD_ShowNum(2, 1, Hour, 2);	//显示时分秒LCD_ShowNum(2, 4, Min, 2);LCD_ShowNum(2, 7, Sec, 2);}
}void Timer0_Routine() interrupt 1 {static unsigned int T0Count;TL0 = 0x18;    // 设置定时初值TH0 = 0xFC;    // 设置定时初值T0Count++;if (T0Count >= 1000) {  // 定时器分频,1sT0Count = 0;Sec++;          // 1 秒到,Sec 自增if (Sec >= 60) {Sec = 0;      // 60 秒到,Sec 清 0,Min 自增Min++;if (Min >= 60) {Min = 0;    // 60 分钟到,Min 清 0,Hour 自增Hour++;if (Hour >= 24) {Hour = 0;  // 24 小时到,Hour 清 0}}}}
}

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

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

相关文章

数据湖技术之应用场景篇

数据湖技术有较多的应用场景&#xff0c;本篇文章是针对一些典型的痛点场景做了一些介绍和说明。比如说在线数据抽取场景原有模式对线上库表产生较大压力&#xff0c;flink多流join维护的大状态导致的稳定性问题等等&#xff0c;具体场景如下图所示&#xff1a; 场景1:在线数据…

259:vue+openlayers: 显示海量多边形数据,10ms加载完成

第259个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目中通过WebGLVectorLayerRenderer方式加载海量多边形数据。这里相当于将海量的数据放在同一个层的source中,然后通过webglTile的方式渲染出这一层。 本示例数据为5000个多边形,加载速度超级快。 直接…

抖音弹幕直播玩法汉字找不同文字找不同无人值执守自动玩游戏自带语音播报的开发日志

#找不同# 要解决如下几个问题&#xff1a; 1.声音sprite的录制和调用&#xff0c;解决方案以及解决库如下&#xff1a; howler.min.js://一款不错的音频播放js库。 2.鼠标自动飘浮,使用的库 anime.min.js 3.资源预加载 preload.min.js 4.其它使用到的库 jquery,vue

python-自动化篇-办公-文件-加解密

解说 要使⽤Python进⾏⽂件的加密和解密&#xff0c;可以使⽤第三⽅加密库&#xff0c;如cryptography或pycryptodome。 ⼀个基本的⽰例&#xff0c;演⽰如何使⽤cryptography库对⽂件进⾏加密和解密&#xff1a; 安装cryptography库&#xff1a; pip install cryptography⽂…

备战蓝桥杯----数据结构及STL应用(基础2)

上次我们讲了vector的大致内容&#xff0c;接下来让我们讲一下栈&#xff0c;队列吧&#xff01; 什么是栈呢&#xff1f; 很简单&#xff0c;我们用的羽毛球桶就是&#xff0c;我们取的球&#xff0c;是最后放的&#xff0c;栈是一种先进后出的数据结构。 方法函数 s.push(…

2024/1/27 备战蓝桥杯 1-1

目录 求和 0求和 - 蓝桥云课 (lanqiao.cn) 成绩分析 0成绩分析 - 蓝桥云课 (lanqiao.cn) 合法日期 0合法日期 - 蓝桥云课 (lanqiao.cn) 时间加法 0时间加法 - 蓝桥云课 (lanqiao.cn) 扫雷 0扫雷 - 蓝桥云课 (lanqiao.cn) 大写 0大写 - 蓝桥云课 (lanqiao.cn) 标题…

(2024,预训练扩散模型,参考 UNet,创建引导数据集)BootPIG:在预训练扩散模型中引导零样本个性化图像生成

BootPIG: Bootstrapping Zero-shot Personalized Image Generation Capabilities in Pretrained Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3…

Future模式先给您提货单

Future模式是一种设计模式&#xff0c;用于在处理耗时操作时提高程序的响应性。 角色介绍: Main类: 负责向Host发出请求并获取数据的类。 Host类: 负责向请求返回FutureData的实例的类&#xff0c;起到调度的作用。 Data接口: 表示访问数据的方法的接口&#xff0c;由FutureD…

Unity中URP下逐顶点光照

文章目录 前言一、之前额外灯逐像素光照的数据准备好后&#xff0c;还有最后的处理二、额外灯的逐顶点光照1、逐顶点额外灯的光照颜色2、inputData.vertexLighting3、surfaceData.albedo 前言 在上篇文章中&#xff0c;我们分析了Unity中URP下额外灯&#xff0c;逐像素光照中聚…

视频汇聚/云存储平台EasyCVR级联上级播放后一直发流是什么原因?

可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时…

iOS_Xcode_LLDB调试常用命令

文章目录 结构常用命令&#xff1a;1、流程控制&#xff1a;2、常用命令3、进程信息&#xff1a;4、寄存器&#xff1a;register5、镜像&#xff1a;image6、内存&#xff1a;memory7、符号断点&#xff1a;breakpoint8、内存断点&#xff1a;watchpoint9、Tips&#xff1a; 结…

常用软件安装

1.yum下载提速 1.wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 2. yum clean all 3.yum makecache 2.jdk yum install java-1.8.0-openjdk* -y yum update 时自动更新jdk版本 1.yum -y install yum-versionlock&#xff08;如果…

C#实现带光标的截图

1&#xff0c;目的&#xff1a; 可通过热键实现带光标与不带光标两种模式的截图。 2&#xff0c;知识点&#xff1a; 快捷键的注册与注销。 [DllImport("user32.dll", SetLastError true)] public static extern bool RegisterHotKey(IntPtr hWnd, int id, KeyMo…

2023年春秋杯网络安全联赛冬季赛 Writeup

文章目录 Webezezez_phppicup Misc谁偷吃了外卖modules明文混淆 Pwnnmanagerbook Reupx2023 CryptoCF is Crypto Faker 挑战题勒索流量Ezdede 可信计算 Web ezezez_php 反序列化打redis主从复制RCE&#xff1a;https://www.cnblogs.com/xiaozi/p/13089906.html <?php c…

编码神仙插件Machinet AI GPT-4 Chat and Unit Tests

最近发现一个神仙插件Machinet AI GPT-4 Chat and Unit Tests&#xff0c;支持多个编译器安装使用。 我下载安装到Android Studio上&#xff0c;不需要登录直接可以使用。 可以直接提问&#xff0c;支持中文。

pyinstaller—PuLP投标价格预算项目打包过程踩坑

Python—pyinstaller打包PuLP踩坑 引言 在昨天的文章中&#xff0c;我们提到已经实现了相关代码的编写&#xff0c;即&#xff1a;通过Python环境和编辑器实现代码的运行&#xff0c;最终实现对数据的处理&#xff0c;得到想要的修改过后的项目结果。但是我们又面临着这样一个…

RK3588平台开发系列讲解(视频篇)RKMedia框架

文章目录 一、 RKMedia框架介绍二、 RKMedia框架API三、 视频处理流程四、venc 测试案例沉淀、分享、成长,让自己和他人都能有所收获!😄 📢RKMedia是RK提供的一种多媒体处理方案,可实现音视频捕获、音视频输出、音视频编解码等功能。 一、 RKMedia框架介绍 功能: VI(输…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-3 getBoundingClientRect()

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>getBoundingClientRect()</title> </head> <script>function getRect(){var obj document.getElementById(example); //获取元素对象var objR…

什么是数据库的三级模式两级映象?

三级模式两级映象结构图 概念 三级模式 内模式&#xff1a;也称为存储模式&#xff0c;是数据物理结构和存储方式的描述&#xff0c;是数据在数据库内部的表示方式。定义所有的内部记录类型、索引和文件组织方式&#xff0c;以及数据控制方面的细节。模式&#xff1a;又称概念…

第十八讲_HarmonyOS应用开发实战(实现电商首页)

HarmonyOS应用开发实战&#xff08;实现电商首页&#xff09; 1. 项目涉及知识点罗列2. 项目目录结构介绍3. 最终的效果图4. 部分源码展示 1. 项目涉及知识点罗列 掌握HUAWEI DevEco Studio开发工具掌握创建HarmonyOS应用工程掌握ArkUI自定义组件掌握Entry、Component、Builde…