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

【STC89C51单片机】定时器/计数器的理解

目录

  • 定时器/计数器
    • 1. 定时器怎么定时
      • 简单理解(加1经过了多少时间)
      • 什么是时钟周期
      • 什么是机器周期
    • 2.如何设置定时
      • 基本结构
      • 相关寄存器
        • 1. TMOD寄存器
        • 2. TCON寄存器
    • 代码示例

定时器/计数器

STC89C51单片机的定时器和计数器(Timers and Counters)是其重要的外围设备,用于测量时间间隔、产生时间延迟、计数事件等。STC89C51有两个定时器/计数器:Timer 0和Timer 1
理解:定时器与计数器的区别在于触发计数增加的信号源。作为定时器,每经过一个机器周期计数加1;作为计数器,则是外部引脚(P3.4或P3.5)每检测到一次负跳变即加1。通过寄存器设置,单片机可灵活转换这两种功能。
标准C51有2个定时器/计数器:T0和T1。他们的使用方法一致。C52相比C51多了一个T2

1. 定时器怎么定时

定时器的本质原理: 每经过一个机器周期,就加1 :寄存器(存储数据的高速小容量存储单元)

简单理解(加1经过了多少时间)

假设系统时钟频率为12 MHz,时钟周期为:
T c l o c k = 1 f c l o c k = 1 12 MHz ≈ 83.33 ns T_{clock}=\frac1{f_{clock}}=\frac1{12\text{ MHz}}\approx83.33\text{ ns} Tclock=fclock1=12 MHz183.33 ns

一个机器周期包含12个时钟周期:
T m a c h i n e = 12 × T c l o c k = 12 × 83.33 n s ≈ 1 μ s T_{machine}=12\times T_{clock}=12\times83.33\mathrm{~ns}\approx1\mathrm{~μs} Tmachine=12×Tclock=12×83.33 ns1 μs

这样,每秒钟可以执行约1,000,000个机器周期,这对于大多数嵌入式应用来说是一个足够高的速度。
为什么是1us,我粗俗的理解为方便后期的计算
为什么是12个时钟周期,
这是由该单片机内部的硬件设计和工作原理决定的。80C51单片机在执行指令和进行数据处理时,其基本操作被划分为若干个状态周期(State),每个状态周期又进一步细分为两个相位(Phase),即P1和P2,这两个相位各对应一个时钟脉冲。因此,每个状态周期需要2个时钟周期。
一个机器周期由6个这样的状态周期组成,即S1至S6,所以计算下来就是 6×2=12 个时钟周期

什么是时钟周期

时钟周期也称为振荡周期,它的频率由晶振产生,定义为时钟频率的倒数。时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。时钟周期是一个时间的量。更小的时钟周期就意味着更高的工作频率

什么是机器周期

机器周期也称为CPU周期。在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段(如取指、译码、执行等),每一阶段完成一个基本操作。完成一个基本操作所需要的时间称为机器周期。一般情况下,一个机器周期由若干个时钟周期组成

2.如何设置定时

基本结构

计数寄存器(THx和TLx):每个定时器/计数器有两个8位的寄存器,分别是高(THx)和低位(TLx),用于存储计数值。
控制寄存器(TCON和TMOD):用于配置和控制定时器/计数器的工作模式和启动停止等操作。
时钟源选择:可以选择内部时钟源或外部时钟源。

相关寄存器

在这里插入图片描述
控制寄存器
在这里插入图片描述

1. TMOD寄存器

用于设置定时器/计数器的工作模式和计数器的运行方式。它是一个8位寄存器,其中每个定时器/计数器占4位:

GATE:当设置为1时,定时器/计数器的运行受外部引脚INTx控制。
C/T:选择定时器或计数器模式。当为0时,工作在定时器模式;当为1时,工作在计数器模式。
M1和M0:设置定时器/计数器的工作模式

工作模式设置(M1和M0)

模式0(M1=0, M0=0):13位定时器/计数器(TLx的5位和THx的8位组成)。
模式1(M1=0, M0=1):16位定时器/计数器(TLx和THx组成)。
模式2(M1=1, M0=0):8位自动重装载定时器/计数器(THx加载到TLx)。
模式3(M1=1, M0=1):分为两部分,Timer 0的TL0和TH0分别作为两个独立的8位定时器/计数器,Timer 1停止工作。

2. TCON寄存器

TCON寄存器用于控制定时器/计数器的启动和停止,以及外部中断的标志和控制。TCON寄存器的格式如下

在这里插入图片描述
TF1:定时器1溢出标志(当溢出的时候,硬件会修改bit6(TF1)位上面的数据,改成1(置1),如果不用中断,我们代码清零)。
TR1:定时器1运行控制位(开始计时,相当于按下了闹钟)。
TF0:定时器0溢出标志。
TR0:定时器0运行控制位。
IE1:外部中断1标志。
IT1:外部中断1触发类型控制。
IE0:外部中断0标志。
IT0:外部中断0触发类型控制

配置寄存器(用按位操作)
清0与0,置1或1
清零时,对应的需要清零的位与上0,不需要清零的位与上1
置1的时,需要置1的位置或1,不需要置一的位置或0

代码示例

/*通过定时器0,控制LED亮一秒,灭一秒,晶振11059200Hz*/
#include "reg52.h"
sbit led = P3^6;void Timer0Init(void)		//10毫秒@11.0592MHz
{//AUXR &= 0x7F;		//定时器时钟12T模式TMOD &= 0xF0;		//设置定时器模式 清零时需要清零的位与上0(清0与0)TMOD |= 0x01;		//设置定时器模式 置1或1 TL0 = 0x00;		//设置定时初值TH0 = 0xDC;		//设置定时初值TF0 = 0;		//清除TF0标志TR0 = 1;		//定时器0开始计时
}void main()
{int cnt = 0;led = 1;Timer0Init();while(1){if(TF0 == 1)//当爆表的时候,硬件会修改bit5(TF0)位上面的数据,改成1{TF0 = 0;//不用中断,必须软件清零cnt++;  //统计爆表的次数//重新给初值TL0=0x00;TH0=0xDC;if(cnt == 100){//爆表100次,经过了1scnt = 0;  //当100次表示1s,重新让cnt从0开始,计算下一次的1sled = !led;//每经过1s,翻转led的状态}}}
}

本人菜鸟,请大神多多指教

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Lianwei 安全周报|2024.07.15
  • LLM 构建Data Multi-Agents 赋能数据分析平台的实践之④:数据分析之三(数据展示)
  • Jenkins 安装、部署与配置
  • JVM:自动垃圾回收
  • flutter ios打包 xcode报错module ‘xxx‘ not found
  • Python爬虫入门篇学习记录
  • 使用Nginx实现高效负载均衡
  • 零基础STM32单片机编程入门(十五) DHT11温湿度传感器模块实战含源码
  • Guava LocalCache源码分析:LocalCache生成
  • 在组件中显示tuku的照片
  • 记录一次Android推流、录像踩坑过程
  • 解决TypeError: __init__() takes 1 positional argument but 2 were given
  • 使用Python Turtle绘制圣诞树和装饰
  • 使用 exe4j 转换 Java jar 程序为 Windows 平台可执行文件 (.exe)
  • WebSocket实现群聊功能、房间隔离
  • 收藏网友的 源程序下载网
  • AWS实战 - 利用IAM对S3做访问控制
  • CSS3 变换
  • JavaScript DOM 10 - 滚动
  • JavaScript标准库系列——Math对象和Date对象(二)
  • JSDuck 与 AngularJS 融合技巧
  • Laravel 菜鸟晋级之路
  • python 装饰器(一)
  • Python连接Oracle
  • text-decoration与color属性
  • Webpack4 学习笔记 - 01:webpack的安装和简单配置
  • 电商搜索引擎的架构设计和性能优化
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 今年的LC3大会没了?
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 前端代码风格自动化系列(二)之Commitlint
  • 实现菜单下拉伸展折叠效果demo
  • 微服务入门【系列视频课程】
  • 微信公众号开发小记——5.python微信红包
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 再次简单明了总结flex布局,一看就懂...
  • 《码出高效》学习笔记与书中错误记录
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​如何在iOS手机上查看应用日志
  • !$boo在php中什么意思,php前戏
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • #Lua:Lua调用C++生成的DLL库
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • #我与Java虚拟机的故事#连载11: JVM学习之路
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (HAL库版)freeRTOS移植STMF103
  • (k8s中)docker netty OOM问题记录
  • (PWM呼吸灯)合泰开发板HT66F2390-----点灯大师
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (分布式缓存)Redis分片集群