(六)定时器/计数器

2023-05-16

(六)定时器/计数器

一、简介

定时器和计数器是两个名字,但是原理上来说是一样的,都是对脉冲进行计数,区别在于时钟来源,如果来自内部时钟信号,由于内部时钟通常是比较准确的,所以是定时器,如果来自外部引脚,而外部引脚的信号并一定准确,则只对其进行计数,所以是计数器。接下来主要以定时器为主进行简单介绍,计数器类同。

二、时间计算

顾名思义,定时器肯定是和时间有关系的,那么时间是怎么计算的呢,我们以普通51内核为例。如下图(图片来自百度,我觉得他和51不符,所以改了下),通常一个指令周期=2X机器周期=12X时钟周期。而时钟周期又来自晶振。因此晶振频率确定后,那么各个时间也就确定了。
image.png

1. 计算内部指令周期

假设晶振频率是12MHz,那么机器周期=1/12MHz=1/12us,指令周期=12*机器周期=1us,也就是说单片机每执行一条指令,最小时间是1us。

2. 计算定时器初值

大多数定时器都可以工作在两种模式,一种是8位(最大计数256次)自动重装模式,一种是16位(最大计数65536次)自动重装模式,由于16位很显然计数或定时的范围是要远远大于8位的,因此,我们以16位模式应用为例,讲解计算方法。
定时器在进行计数时是采用向上的方式,也就是说每一个系统信号过来以后,定时器设置的值进行+1,这里就有两个方式:

  1. 给定时器设置结束的值,从0开始不断+1,直到达到设置值溢出结束
  2. 给定时器设置初始值,从初始值不断+1,直到达到65536溢出结束

我们的51单片机采用了第二种方式,所以给定时器设置值时,我们说设置的是初值。计算公式如下:

初值=65536-定时时长指令周期=65536-定时时长(12*机器周期)

当晶振取值12MHz时,指令周期最小时间就是1us,因此上式也可以写成
初值=65536-定时时长
定时时长取值范围:165536us或165.536ms

3. STC-12T系列单片机初值

STC单片机很多系列现在都做到了12T,也就是说指令周期最小可以做到等于机器周期,不需要再除以12。因此除了单片机运行速度加快以外,定时精度也更高,计算公式如下:

初值=65536-定时时长指令周期=65536-定时时长机器周期

当晶振取值12MHz时,指令周期最小时间就是1/12us
初值=65536-定时时长/12
定时时长取值范围:1/1265536/12us或1/1265.536/12ms

由于12不能整除,所以计算时会有小数点,精度上比普通51会高一个数量级

三、寄存器设置

举个例子,以定时器016位自动重装实现1秒定时,STC的C51定时器,需要使用到的寄存器有如下几个:
AUXR:辅助就寄存器

76543210
T0x12T1x12UART_M0x6T2RT2_C/TT2x12EXTRAMSIST2
0定时器0工作在传统8051速度,12分频
1定时器0工作在高速8051速度(1T),不分频

TCON:定时器/计数器中断控制寄存器,很多中断的控制寄存器都在这里,定时器中断允许等操作在这里

76543210
TF1TR1TF0TR0IE1IT1IE0IT0
定时器0溢出中断,硬件置位定时0运行控制位,软件置1后开始运行,置0后结束运行

TMOD:定时器/计数器工作设置寄存器

76543210
GATEC/TM1M0GATEC/TM1M0
0定时器模式00十六位自动重装
1计时器模式01十六位不可重装
108位自动重装
11不可屏蔽中断16位自动重装

TL0:定时器初值低8位
TH0:定时器初值高8位
除以上寄存器以外,还有两个隐藏寄存器RL_TH0和RL_TL0,这两个寄存器和TL0、TH0两个寄存器使用同一个地址,设置初值时会自动给这两个寄存器设置值,也就是溢出后,会将这两个隐藏值重新装入TL0、TH0。

四、代码示例

/*---------------------------------------------------------------------*/
/* --- STC MCU Limited ------------------------------------------------*/
/* --- STC15F4K60S4 系列 定时器0的16位自动重装载模式举例---------------*/
/* --- Mobile: (86)13922805190 -------------- -------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966-------------------------*/
/* --- Web: www.STCMCU.com --------------------------------------------*/
/* --- Web: www.GXWMCU.com --------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
/* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
/*---------------------------------------------------------------------*/

//本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
//若无特别说明,工作频率一般为11.0592MHz


#include "reg51.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

//-----------------------------------------------

#define FOSC 11059200L

#define T1MS (65536-FOSC/1000)      //1T模式
//#define T1MS (65536-FOSC/12/1000) //12T模式

sfr AUXR = 0x8e;                    //Auxiliary register
sbit P10 = P1^0;

//-----------------------------------------------

/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
    P10 = ! P10;                    //将测试口取反
}

void main()
{
    AUXR |= 0x80;                   //定时器0为1T模式
//  AUXR &= 0x7f;                   //定时器0为12T模式

    TMOD = 0x00;                    //设置定时器为模式0(16位自动重装载)
    TL0 = T1MS;                     //初始化计时值
    TH0 = T1MS >> 8;
    TR0 = 1;                        //定时器0开始计时
    ET0 = 1;                        //使能定时器0中断
    EA = 1;							//使能全部中断
    while (1);
}

五、Proteus仿真

由于Proteus只能仿真普通51内核的单片机,所以上述代码还需要进行简单修改,改成普通51代码。
示例:led灯隔一秒亮灭一次,GIF录得有问题

//设晶振为12MHz
#include "reg52.h"

sbit P20 = P2^0;
unsigned char count = 0;

void tm0_isr() interrupt 1
{
    //定时器设置为10ms,1s=100*10ms
    //这里使用count进行计数,100次即1s
    count++;
    if(count > 100)
    {
		P20 = ! P20;        //将测试口取反
        count = 0;			//count清零,进行下次计数
    }
}

void main()
{
    TMOD &= 0xF1;	//设置定时器模式,普通51和stc的不一样,模式不同
    TL0 = 0xF0;		//设置定时初值
    TH0 = 0xD8;		//设置定时初值
    TR0 = 1;			//定时器0开始计时
    ET0 = 1;      //使能定时器0中断
    EA = 1;
    while (1);
}

GIF 2020-11-18 14-08-12.gif
引导关注微信二维码2.jpg

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(六)定时器/计数器 的相关文章

  • 我的保研经历——中国科学院计算技术研究所

    忙碌了大半年的保研事情已经尘埃落定了 xff0c 心理也踏实下来了 xff0c 总想着把自己的这段保研经历记录下来 xff0c 希望能对小伙伴们有所帮助 能来到ZZ并且读软件工程这个专业并且阴差阳错的进了卓越班也算是老天注定吧 xff08
  • 无限循环:while True+if...break(打破循环) 用法

    span class token keyword while span True span class token punctuation span p span class token operator 61 span span clas
  • freertos的核心---线程与调度

    一 划重点 划重点 划重点 线程就是freertos运行管理的最小单位 一个线程有自己的生命周期 可以是一段时间也可以是forever 具体看开发人员对于线程的规划 几个线程 每个线程处理什么事情 先来看看线程长啥样 xff1f xff08
  • freertos通信---信号量与队列

    嘿嘿 又见面了 到这里 任务的调度和切换 你已经有了深刻的理解 接下来 自然而然就是任务间的通讯咯 把相关的任务串联起来 就形成了程序的基本架构 一 队列 为什么要先讲解队列了 因为信号量就是利用队列来实现的 走 一起瞅瞅 1 1队列的创建
  • freertos通讯---信号量与队列

    哈喽 又见面了 一 信号量 1 1创建二进制信号量 define xSemaphoreCreateBinary xQueueGenericCreate UBaseType t 1 semSEMAPHORE QUEUE ITEM LENGTH
  • 关于python调用C++

    关于python调用C C 43 43 查了很多相关资料 xff0c 可以通过ctypes模块 SWIG等一些方法 简单的类似单个头文件单个cpp文件都可以实现 xff0c 但是大恒给的C 43 43 包含驱动程序 xff0c 需要在属性里
  • freertos通讯-通知

    通知是什么 xff1f 其实我们之前就见过 它就在任务结构体中 再来回顾下 if configUSE TASK NOTIFICATIONS 61 61 1 volatile uint32 t ulNotifiedValue volatile
  • freertos软件定时器

    哈喽 这篇文章是freertos解析的最后一篇文章 我们将会讲解一个利用任务延时实现的软件定时器 1 创建 timer结构体和创建一目了然 看看初始化函数 是不是有点熟悉 timer的管理有点类似任务的管理 如果是第一次创建则初始化time
  • 蓝牙5.1的ble那些事儿

    既然要说5 1的那些事儿 那么必须的聊聊蓝牙4 0 本文就不在此长篇大论班门弄斧了 要了解4 0的同学请出门左拐直接去参考蜗窝科技大佬的文章 本人觉得对于想入门全面了解4 0的同学 此文章是不二选择的经典 在此只有膜拜的份了 不是广告哈哈
  • 蓝牙5.1的ble那些事儿

    到这里 对于非连接状态应该有一些新的认识了 接下来 顺其自然当然就是连接了 你谈对象 忙活半天 当然是想干点什么事情了 当然也有老司机翻车 连接上后 一端要主动向另一端发起问候 否则长时间不联系 那么就断开好了 主动问候的一端我们称之为ma
  • Http auth认证的两种方式Basic方式和 Digest认证

    Http Basic Auth 方式 当访问一个Http Basic Auth 网站的时候需要提供用户名 xff0c 密码 xff0c 否则会返回401 without authoration Http Basic Authenticati
  • while无限循环

    无限循环写法while 1 循环体内部可以用break语句跳出循环 while 1
  • 不同操作系统下的程序入口点分析

    转自 http hi baidu com liu bin0101 blog item 03e3a9ec4e0fd5d72e2e21b9 html 程序入口与编译器没有什么关系 关键是链接链接器 UNIX的用的ld和WINDOWS下用的LIN
  • rv-player 不靠谱之rvio

    最近忽然发现为动画组写过的一个maya内置工具不能用了 xff0c 工具的作用是使用rvio hw exe转换playblast出的tif序列图 xff0c 生成带watermark的mov文件 之前在Maya2013上一直用的好好地 xf
  • 树莓派 Raspberry Pi SD卡系统备份与还原

    近半年时间用来监控陆龟的树莓派 Raspberry Pi 还算稳定 xff0c 可到了冬天龟箱里的加热灯长时间加热导致树莓派温度很高 xff0c 时不时的自动重启 如果每次都能正常起来也就罢了 xff0c 可偶尔会挂不上SD卡的文件系统直接
  • 2022-12-18 CMakelists指定CMAKE_BUILD_TYPE为Debug或者Release

    今天编译代码的时候遇到古怪的事情 xff0c 在Cmakelists txt中指定了编译版本 xff0c build的时候输出一句 xff1a cpptools The build configurations generated do n
  • 5.FreeRTOS任务切换的简易分析

    FreeRTOS任务切换的简易分析 架构 xff1a Cortex M3版本 xff1a FreeRTOS V9 0 0前言 xff1a 之前分析了创建任务 启动调度器 xff0c 在做完这些工作后 xff0c 就是该完成所有RTOS的最核
  • vue.js:634 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever t

    其实是前两天了解了v mdel的原理 lt v model原理 gt lt div id 61 34 demo 34 gt lt input value 61 34 value 34 64 input 61 34 price 61 even
  • vscode终端加git的方法

    记录一下 xff0c vscode添加git终端的方法 1 先打开首选项 61 gt 设置 xff0c 搜 shell window xff0c 然后找到setting json 2 添加代码 xff08 设置git的位置 xff0c 以及
  • jquery的简单介绍

    jQuery也包含了对ajax的封装 什么是jQuery jQuery是一门轻量的 免费开源的JS函数库 xff0c 主要作用是用于简化JS代码 轻量的 xff1a 代码或项目对该技术的依赖程度 xff0c 依赖程度越低 xff0c 这个技

随机推荐

  • 图像质量评估(2) -- 图像质量相关参数:分辨率

    分辨率 xff08 解析度 xff0c Resolution xff09 分辨率使我们经常听到的一个词 xff0c 它代表了图像的精细程度 xff0c 也代表了图像的大小 分辨率决定了在这种大小下 xff0c 输出信号是否能够包含足够多的信
  • 图像质量评估(5) -- 畸变(Distortion)

    当图像中原本应该是直线的地方看起来发生了不自然的变形或扭曲时 xff0c 我们称为图像畸变 有三种类型的镜头畸变 xff1a 桶形畸变 xff08 后文使用英文barrel xff09 xff0c 枕形畸变 xff08 后文使用pincus
  • FreeCMS视频教程 将FreeCMS导入eclipse

    项目地址 xff1a http www freeteam cn 原文地址http www freeteam cn site FreeCMS videos info 2016 5670 html
  • qsort的使用

    一 了解qsort xff08 1 xff09 编译器函数库万能数组排序函数排序函数 它是基于快速排序算法 xff0c 所以是q sort q 指的是 quick 快速 qsort 的函数原型是 void qsort void base s
  • 【转】粒子滤波简介以及相关技术探讨

    之前一直在做移动机器人定位算法 查来查去 xff0c 发觉粒子滤波算法 xff08 又叫MC算法 xff09 应该算是最流行的了 因此开始学习使用之 入手的是本英文书叫 probalistic robotic 很不错 xff0c 我所见到的
  • 蓝牙技术的基础知识

    1 无线电频谱 蓝牙技术使用2 4 GHz ISM频段 xff08 2400至2483 5 MHz xff09 xff0c ISM频段就是各国挪出某一段频段主要开放给工业 xff0c 科学和医学机构使用 应用这些频段无需许可证或费用 xff
  • Ubuntu下实现串口通信

    在ubuntu下使用cutecom可以接受串口消息也可以给串口发送消息 基本信息 xff1a 库 xff1a Python 的 serial 硬件 xff1a 电脑 Ubuntu18 04系统 USB Jeston AGX Xavier x
  • 4.FreeRTOS调度器的启动简易分析

    FreeRTOS调度器的启动简易分析 架构 xff1a Cortex M3版本 xff1a FreeRTOS V9 0 0前言 xff1a 上一篇我分析了关于一个任务的创建过程 xff0c 既然创建了任务 xff0c 自然是要用 那么Fre
  • ARM40-A5应用——与网络时间的同步1(概述)

    ARM40 A5应用 与网络时间的同步1 xff08 概述 xff09 2018 6 28 版权声明 xff1a 本文为博主原创文章 xff0c 允许转载 本文介绍ARM40 A5本地系统时间 硬件时间 时区 网络时间 ntpdate nt
  • 如何有效阅读《C++ Primer》那么厚的书

    我就是那种正面刚大部头的选手 xff0c 这些年读过的工作相关的 砖头 大概有 c 43 43 primer xff0c Windows核心编程 xff0c 算法导论 xff0c unix网络编程 xff0c STL源码剖析 等等吧 xff
  • 【Arduino 语法——结构体】

    Arduino 语法 结构体 1 0 项目结构 1 1 setup 1 2 loop 1 3 main 2 0 控制语句 2 1 break 2 2 continue 2 3 while 2 4 do while 2 5 for 2 6 i
  • 【MKS_GEN_L 主板使用说明书】

    MKS GEN L 主板使用说明书 1 描述2 特征3 主板封装3 1 尺寸图3 2 接线图3 2 1 MKS GEN L V1 0系统连接图3 2 2 MKSGEN L V2 1系统连接图 4 引脚排列5 GEN LV2 1驱动设置5 1
  • 【基于腾讯云的远程机械臂小车】

    基于腾讯云的远程机械臂小车 1 项目来源 1 1 项目概述 1 2 系统结构 1 3 设计原理 2 硬件搭建 2 1 CH32V307开发板 2 2 Arduino mega2560 2 3 富斯I6遥控器 2 4 机械臂小车 2 5 ES
  • 电脑之间快速传输超大文件(100GB以上)的方法

    引言 假如有这样一个场景 xff0c 你买了一台新的电脑 但是老电脑上存放着多年累积的数据 几百G之多 你要花时间把旧电脑上的数据导到新电脑上去 xff0c 这很费精力 于是你想有没有更快速的方法立马挪过去呢 xff1f 本文提供了五种方法
  • 《软件架构设计》(Yanlz Unity SteamVR 云技术 5G AI=VR云游戏=框架编程 架构设计 设计重构 游戏框架 框架入门 架构师 UML MVC ECS 立钻哥哥 ==)

    软件架构设计 软件架构设计 版本 作者 参与者 完成日期 备注 YanlzFramework 1910 V01 1 0 严立钻 2019 10 19 软件架构设计 发布说明 xff1a 43 43 43 43 软件架构设计 xff1a 是对
  • 进程的切换过程

    切换方式 进程的切换 xff0c 实质上就是被中断运行进程与待运行进程的上下文切换 从主观上来理解 只分为两步 xff1a 1 切换新的页表 xff0c 然后使用新的虚拟地址空间 2 切换内核栈 xff0c 加入新的内容 PCB控制块 xf
  • SLAM之camera(Intel RealSense D435)调试第一弹:Win10平台下getting started

    参见官方的getting started文档 https software intel com en us realsense d400 get started xff0c 这个quick start guide是Intel RealSen
  • Cmake的 debug和release

    Cmake的 debug版本和release版本 xff08 转 xff09 debug版本的项目生成的可执行文件需要有调试信息并且不需要进行优化 xff0c 而release版本的不需要调试信息但是需要优化 这些特性在gcc g 43 4
  • 【Kubernetes】K8s官方文档使用技巧

    学习K8s有很多技巧 其中一个技巧就是要多浏览官方 https kubernetes io zh 的说明文档 对于英语基础不是太好的 K8s官方还提供了中文版的页面 点击 文档 我们就进入了K8s文档的主页 主页上看起来也没多少知识点 别急
  • (六)定时器/计数器

    xff08 六 xff09 定时器 计数器 一 简介 定时器和计数器是两个名字 xff0c 但是原理上来说是一样的 xff0c 都是对脉冲进行计数 xff0c 区别在于时钟来源 xff0c 如果来自内部时钟信号 xff0c 由于内部时钟通常