(六)定时器/计数器

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(使用前将#替换为@)

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

  • LLVM编译collect2: fatal error: ld terminated with signal 9

    报错 xff1a collect2 fatal error ld terminated with signal 9 查了一下这个报错 xff0c 可能是内存不足 xff0c 看到有前人的解决方法 xff0c 创建了20G的交换空间 xff1
  • Rust安装与编写第一个rust程序

    Rust 是 Mozilla 开发的注重安全 性能和并发性的编程语言 下边来演示一下如何安装rust xff0c 并尝试创建第一个rust项目 使用 rustup 脚本安装 xff1a 第一步 xff1a 执行 curl https sh
  • (C语言)栈应用简易计算器实现

    利用栈实现简易计算器 进行包含 43 间的计算 include lt stdio h gt include lt string h gt define MaxSize 100 typedef struct CharStack 字符栈 cha
  • 【实战原创】Centos7下Samba服务器配置(实战)

    这篇文章主要介绍了 Centos7 下 Samba 服务器配置 xff08 实战 xff09 xff0c 文中通过示例代码介绍的非常详细 xff0c 对大家的学习或者工作具有一定的参考学习价值 xff0c 需要的朋友们下面随着小编来一起学习
  • 批量修改word中的公式--mathtype

    1 用word打开一个需要编辑公式的文档 2 编辑公式的格式 xff0c 首先 xff0c 双击一个公式 xff0c 打开数学公式编辑器MathType xff0c 进入编辑状态 xff0c 点击大小菜单中的自定义选项 xff0c 修改字号
  • 免费使用office365和5TOneDrive空间

    免费使用office365和5TOneDrive空间 免费使用office365和OneDrive空间 免费使用office365和OneDrive空间 个人版本的office账号只可以拥有5G的存储空间 xff08 可以通过邀请的方式免费
  • UBUNTU 22.04 使用 SUNSHINE 和 MOONLIGHT 进行串流

    参考 ubuntu22 04 sunshine安装使用总结 xff0c 远程游戏 哔哩哔哩 bilibili sunshine README md at master loki 47 6F 64 sunshine GitHub GitHub
  • 学习LUA,使用IUP进行GUI程序设计

    原创 visualfc 在LUA中进行GUI程序设计 xff0c 可以选择的GUI库一般有wxLua和IupLua wxLua具备典型的面向对象风格 xff0c 功能相对强大 而IUP的LUA绑定则非常简洁易用 本文主要介绍IupLua I
  • poj 细菌实验分组

    include lt cstdio gt include lt cstdlib gt struct my int id double rate int cmp const void a const void b return my a ra
  • 在TreeATE的Python环境中: import paramiko出现问题 ModuleNotFoundError: No module named ‘paramiko‘

    在TreeATE的Python环境中解决import问题 一般在Python环境中没有出现问题 ModuleNotFoundError No module named paramiko xff0c 而在TreeATE的Python调试窗口中
  • 【仙女踩坑实录】Ubuntu20.04系统设置打开后闪退

    时隔数月 xff0c 我又踩坑了 今天打开设置想 我已经忘了当时想干啥了 xff0c 反正是想打开设置 xff0c 然后突然发现 xff0c 设置打不开了 xff0c 或者说打开后界面都看不到就闪退了 于是我看到有人在评论区中说是因为显示在
  • Nginx进程项说明

    说明 xff1a 在Windows中nginx服务每次点击启动之后 xff0c 都会生成2个进程项 注意事项 xff1a 在Windows中nginx只能启动一次 关于与启动2项说明 进程项1 xff1a nginx主要进程信息 进程项2
  • 如何设置go环境变量GOPATH?

    如何设置go环境变量GOPATH xff1f 安装 gin gonic gin 报错 cannot download GOPATH not set For more details see go help gopath go get u g
  • vs2022发生生成错误,但错误列表没有报错的一个解决办法

    如题 xff0c 事件的起因是我在编译程序时 xff0c 遇到了这个问题 我写的是最基本的c 43 43 控制台应用程序 然而观察错误列表 xff0c 没有错误 xff0c 也没有警告 进一步尝试后发现 xff0c 即使是原先可以正常运行的
  • Google开源框架AutoFlip 实现视频智能剪裁

    Photo by Kyle Loftus from Pexels Google宣布开源视频剪裁框架AutoFlip xff0c 实现智能化自动裁剪视频 编译 xff1a 郑云飞 amp Coco Liang 技术审校 xff1a 郑云飞 原
  • 如何使用FFmpeg将AVI转换为MP4(有损转换和无损转换)

    翻译 编辑 xff1a Alex 技术审校 xff1a 刘歧 本文来自OTTVerse xff0c 作者为Krishna Rao Vijayanagar 扫描图中二维码了解音视频技术大会更多信息 Easy Tech 021 在本篇文章中 x
  • Web渗透测试之XSS攻击:反射型XSS

    文章目录 前言反射型XSS最简单的反射型XSS利用反射型XSS获得cookie获得cookie的最简单的方法DNSlog辅助获得cookie 总结 前言 在上一篇文章中我们基本了解了XSS的类型和危害 xff0c 在本篇中我们将通过具体的例
  • Web渗透测试之XSS攻击:基于DOM的XSS

    文章目录 前言基于DOM的XSS什么是DOM基于DOM的XSS产生的原因如何手工挖掘基于DOM的XSS漏洞如何利用基于DOM的XSS漏洞 总结 前言 本篇主要讲解什么是基于DOM的XSS漏洞 xff0c 基于DOM的XSS漏洞产生的原因以及
  • GET、POST、PUT、DELETE的介绍及其安全和幂等性

    先介绍一下安全和幂等的概念 所谓幂等是指不管进行多少次操作 xff0c 结果都一样 比如 xff0c 调用GET方法只是去请求资源 xff0c 自然每次调用结果都是相同的 xff0c 就是幂等的 对于POST请求 xff0c 两次调用POS
  • Debian 10(buster) 更换软件源

    编辑 etc apt sources list文件 etc apt sources list 是包管理工具 apt 所用的记录软件包仓库位置的配置文件 注释原文件所有内容 xff0c 用以下内容替代 deb http mirrors tun

随机推荐