STC15系列单片机:定时器/计数器16位自动重装载模式

2024-01-16 01:52

本文主要是介绍STC15系列单片机:定时器/计数器16位自动重装载模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、定时器与计数器的理解

STC15系列单片机内部有5个16位定时器/计数器,分别是T0、T1、T2、T3、T4。

定时器与计数器,东西还是同一个东西,只是用法和功效不一样,就好比黄瓜,既可以内服也可以外敷,黄瓜还是那个黄瓜,作用就不一样了。

就拿T0来说,T0用于定时,那T0就是定时器,如果T0用于计数,那T0就是计数器。那么问题来了,什么是定时,什么是计数?

大家应该都知道,单片机的运行需要时钟,这个时钟可以是外部晶振直接产生的,也可以是单片机内置的,反正就是单片机工作的主时钟。对于单片机来说,定时就是数这个主时钟的脉冲。

大家应该还知道,单片机的IO管脚可以用来判断外部输入的电平,那就是读外部脉冲了,统计IO口的脉冲就是计数了。

所以定时与计数的区别就是统计的脉冲来源不同。

二、STC15单片机为什么比传统51单片机快

STC官方的文档里面总是说,他的STC15系列单片机比传动的51(也就是89C51)运行速度快。为什么会快,我们知道单片机的时钟,也可以理解为外面加的晶振,频率越高,单片机自然运行的就快了。但是这个频率也不是相加多少就加多少,给一个垂暮的老人加一个小伙子的心脏,那也是有心无力啊。

学过单片机的人还听说过,什么12个时钟周期就是一个机器周期,相当于安装了一个减速齿轮,外面转12圈,里面才转一圈。STC公司应该是用了某种工艺或者技术,可以实现1个时钟周期就是1个机器周期,这样的话,粗看单片机的速度直接就提升12倍了。

三、STC15系列单片机的计数速率

STC15系列单片机的定时器有两种计数速率:

12T模式:与传统8051单片机相同,每12个时钟周期,定时器计数加1;

1T模式:就是每个时钟周期定时器计数加1。

四、什么是16位自动重装载(模式0)

16位自动重装载,可以分开两部分来看,首先是16位,然后是自动重装载

16位就是那个寄存器,统计数据的寄存器的位数,有16位,

那可以统计的最大数据就是1111 1111 1111 1111 = 0xFFFF = 65535;

自动重装载,就是定时器计数到达最大值65535后,就自动重新开始按照设定的初始值计数。

拿T0来举例吧,这个16位的寄存器其实是两个8位的寄存器拼接起来的,它们就是TL0和TH0,

TL0存放16位数据的低8位,TH0存放16位数据的高8位, 比如一个16位数据0x3A4B,0x3A存在TH0寄存器里面,0x4B。

五、定时器T0实现16位自动重装载功能需要使用的寄存器

1、辅助寄存器AUXR:用于设置定时器T0的计数速率

定时器T0的计数速率有12T模式和1T模式,通过AUXR的T0x12位来设置:

T0x12 = 0;定时器T0工作在1T模式,计数时钟不需要分频;

T0x12 = 1;定时器T0工作在12T模式,计数时钟需要12分频,与传统51单片机一样;

 2、定时器(计数器)工作模式寄存器TMOD:用于设置定时器T0的工作模式

针对定时器T0,只需要用到TMOD寄存器的后4个位:

TMOD.3 (GATE):

        置1:只有在INT0脚为高,且TR0控制位置1是才能打开定时器T0;

        置0:只需要TR0置1就可以打开定时器T0(还是置0简单方便);

TMOD.2(C/T):

        置1:用于计数器;

        置0:用于定时器

TMOD.1(M1)与 TMOD.0(M0):

        M1 = 0, M2 = 0时,T0工作在16位自动重装载模式。

3、定时器计数寄存器TH0、TL0:用于数据累加,没什么好说的。

4、定时器计数器中断控制寄存器TCON:用于控制定时器T0的中断

TF0:T0溢出中断标志位。T0被允许计数后,重设置的初始值开始加1计数,杜宇16位计数,计数到65535后就产生溢出,单片机自动将TF0置1,同时向CPU请求中断,CPU响应了该中断后,单片机就自动将TF0清零。当然也可以软件查询该位,软件清零,但是没有必要,定时器一般用在中断比较好。

TR0:定时器T0的运行控制位 。跟GATE位(TMOD.3)配合使用。

当TMOD.3=0时,TR0=1时就允许定时器T0计数,TR0=0是禁止定时器T0计数;

当TMOD.3=1时,TR0=1且INT0输入高电平是,才允许T0计数,TR0=0是禁止定时器T0计数;

5、中断允许寄存器IE:用于使能定时器T0的中断

EA:CPU的总中断允许控制位

        EA=1,CPU总中断允许;

        EA=0,CPU所有中断禁止;

ET0:定时器T0的溢出中断允许位

        ET0 =1,允许定时器T0溢出中断;

        ET0 =0,禁止定时器T0溢出中断;

6、中断优先级控制寄存器IP:用于设置定时器T0中断的优先级

PT0:定时器T0中断优先级控制位

PT0=0时,定时器T0的中断为最低优先级,也就是优先级0;

PT0=1时,定时器T0的中断为最高优先级,也就是优先级1;

默认情况下PT0=0;

六、STC15系列单片机如何实现自动重载

还是以定时器T0来说,T0有2个隐藏的寄存器RL_TH0、RL_TL0。

寄存器RL_TH0与寄存器TH0共用一个地址;

寄存器RL_TL0与寄存器TL0共用一个地址;

当TR0 = 0、定时器0被禁止工作时:

        对TH0进行写操作时,写入TH0的值也会同时写入RL_TH0中;

        对TL0进行写操作时,写入TL0的值也会同时写入RL_TL0中;

当TR0 =1、定时器0被使能工作时:

         对TH0进行写操作时,其实并没有写入TH0中,而是写入RL_TH0中;

         对TL0进行写操作时,其实并没写入TL0中,而是写入RL_TL0中;

当定时器T0工作在模式0时,计数寄存器[TL0,TH0]计数满之后,也就是溢出的时候,也就是计数到65535的时候,单片机会将溢出标志位TF0置位,同时还会自动将[RL_TL0, RL_TH0]里面的值重新装入计数寄存器[TL0,TH0]中。

有了上面的逻辑,就可以实现定时器的自动重装。

程序实例:定时器0的16位自动重装载模式

#include "STC15.h" #define	FOSC	11059200 //宏定义主时钟频率#define T1MS	(65536-FOSC/1000)
#define T1MS	(65536-FOSC/12/1000)/*一般sfr AUXR	= 0x8E;这条语句在STC15.h中有,在程序中就不用再写了*/
sfr		AUXR	= 0x8E;	//辅助寄存器sbit	P10	= P1^0; //随便定义一个测试引脚,用于检验定时器中断是否发生void main()
{	/*1、设置定时器的计数速率*/AUXR  |= 0x80;  //定时器T0工作在1T模式//AUXR&=0x7F;  //定时器T0工作在12T模式//2、设置定时器的工作模式*/TMOD  = 0x00; //设置定时器T0工作在模式0,也就是16位自动重装载模式///3、初始化计数值*/TL0  = T1MS;  //填充定时器T0计数寄存器低8位的值TH0  = T1MS >> 8; //填充定时器T0计数寄存器高8位的值//4、定时器计数使能TR0  = 1; //使能定时器T0//5、定时器中断使能ET0  = 1; //使能定时器T0的中断EA   = 1; //使能单片机的中断总开关/*至此,只要定时器发生计数溢出,就会触发定时器中断,程序就会跳转到中断服务程序*/while(1);
}/*定时器T0的中断服务程序*/
void TIMER0_Routine(void)        interrupt 1
{P10 = !P10; //将测试引脚电平翻转
}

这篇关于STC15系列单片机:定时器/计数器16位自动重装载模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/610954

相关文章

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

Python使用pynput模拟实现键盘自动输入工具

《Python使用pynput模拟实现键盘自动输入工具》在日常办公和软件开发中,我们经常需要处理大量重复的文本输入工作,所以本文就来和大家介绍一款使用Python的PyQt5库结合pynput键盘控制... 目录概述:当自动化遇上可视化功能全景图核心功能矩阵技术栈深度效果展示使用教程四步操作指南核心代码解析