51单片机STC89C52RC——6.2 定时器

        

一,定时器介绍

        STC89C51RC/RD+系列单片机的定时器0和定时器1,与传统8051的定时器完全兼容,当在定时器1做波特率发生器时,定时器0可以当两个8位定时器用。
        STC89C51RC/RD+系列单片机内部设置的两个16位定时器/计数器TO和T1都具有计数方式和定时方式两种工作方式。对每个定时器/计数器(TO和T1),在特殊功能寄存器TMOD中都有一控制位―CT来选择TO或T1为定时器还是计数器。定时器/计数器的核心部件是一个加法(也有减法)的计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每6个时钟得到一个计数脉冲,计数值加1;如果计数脉冲来自单片机外部引脚(TO为P3.4,T1为P3.5),则为计数方式,每来一个脉冲加1。
        当定时器/计数器工作在定时模式时,可在烧录用户程序时在STC-ISP编程器中设置(如下图所示)是系统时钟/12还是系统时钟/6后让TO和T1进行计数。当定时器/计数器工作在计数模式时,对外部脉冲计数不分频。

定时器在单片机内部就像一个小闹钟一样,根据时钟的输出信号,每隔“一秒”,计数单元的数值就增加一,当计数单元数值增加到“设定的闹钟提醒时间”时,计数单元就会向中断系统发出中断申请,产生“响铃提醒”,使程序跳转到中断服务函数中执行

二,四种工作模式

STC89C52的T0和T1均有四种工作模式:     

模式0:13位定时器/计数器     

模式1:16位定时器/计数器(常用)     

模式2:8位自动重装模式     

模式3:两个8位计数器

模式1:

此模式下,定时器配置为16位定时器/计数器,由TL0的8位和TH0的8位所构成。TL0的8位溢出向TH0进位,THO计数溢出置位TCON中的溢出标志位TF0。
 

SYSclk:系统时钟,即晶振周期,本开发板上的晶振为12MHz

那么1毫秒 溢出一次的晶振次数怎么计算呢?

STC89C51RC/RD+系列单片机的定时器有两种计数速率:一种是12T模式,每12个时钟加1,与传统8051单片机相同;另外一种是6T模式,每6个时钟加1,速度是传统8051单片机的2倍。TO的速率在烧录用户程序时在STC-ISP编程器中设置。
 

STC89C52RC 的时钟频率是12MHz。

12MHz就是 1秒钟 晶振次数 是 12000000次,

12000000/12/1000(毫秒)=1000  (次/毫秒)

也就是说我们 要让定时器没1毫秒溢出一次,就得让晶振震动1000次后溢出。而溢出的时候TH0和TL0 合并起来的值是65536

所以我们把 定时器的初始值TH0和TL0的合并值设置为TIMS=65536-1000=64536

赋值

TL0=64535%256;(TL0=TIMS; [TL0只有8位,所以高位不会赋值过去,只有地位有效])

TH0=64536/256;(TH0=TIMS>>8;TH0也只有8位,TIMS右移8位后然低位溢出,高位就自动在低位了

每次中断发生后,都需要重新将TH0和TL0重新初始化。(在中断函数中重新赋值TH0和TL0)

 

三,如何开启定时器/计数器中断

3.1 开启中断 interrupt 1 (定时器Timer0/计数器 触发中断 实现LED闪烁)

如下图。要开启标红的这一路。配置还是比较多。不要嫌麻烦。挨着来。走一遍后,你会觉得像是打开了任督二脉。

按照图,还是从下往从右往左一次配置。

PX0: 优先级系统默认是最高级,不管

EA:全局中断开关合上  EA=1

ET0:允许Timer0/TF0 的中断进入。ET0=1;

我们再单独分析定时器器/计数器,

TR0:定时器开始运行;TR0=1;

TMOD:采用模式1(16位)

#include <REGX52.H> 
/*宏定义定时器的初始值*/
#define TIMS (65536-12000000/12/1000)
unsigned int count=1000;//计数器  默认1000
void main()
{TMOD=0x01;	//设置模式1TL0=TIMS;	//设置定时器的低8位TH0=TIMS>>8;//设置定时器的高8位TR0=1;		//让定时器开始运行ET0=1;		//允许定时器发生中断溢出EA=1;		//打开全局中断while(1);	//主程序停止在此
}/*** 函    数:定时器中断函数* 参    数:无* 返 回 值:无*/
void timer0_interrupt() interrupt 1
{TL0=TIMS;		//重新初始化低位TH0=TIMS>>8;	//重新初始化高位if(count--==0)	//1毫秒*1000=1秒{	count=1000;	//重置计数P2_0=!P2_0;	//第一个LED 每秒熄亮一次}
}

效果 

 

3.2 开启中断 interrupt 3 (定时器Time1/计数器 触发中断 实现LED闪烁)  

还是模式1,同样的,只是几个开关的名字变了

 

PX0: 优先级系统默认是最高级,不管

EA:全局中断开关合上  EA=1

ET1:允许Timer0/TF0 的中断进入。ET1=1;

TR1:定时器开始运行;TR1=1;

TMOD:采用模式1(16位)不过这里和上面有区别,要设置为0x10

#include <REGX52.H> 
/*宏定义定时器的初始值*/
#define TIMS (65536-12000000/12/1000)
unsigned int count=1000;//计数器  默认1000
void main()
{TMOD=0x10;	//设置模式1TL1=TIMS;	//设置定时器的低8位TH1=TIMS>>8;//设置定时器的高8位TR1=1;		//让定时器开始运行ET1=1;		//允许定时器发生中断溢出EA=1;		//打开全局中断while(1);	//主程序停止在此
}/*** 函    数:定时器中断函数* 参    数:无* 返 回 值:无*/
void timer1_interrupt() interrupt 3
{TL1=TIMS;		//重新初始化低位TH1=TIMS>>8;	//重新初始化高位if(count--==0)	//1毫秒*1000=1秒{	count=1000;	//重置计数P2_0=!P2_0;	//第一个LED 每秒熄亮一次}
}

 效果 与上面一样

 

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

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

相关文章

Mysql索引 like篇

Mysql索引 like篇 Mysql在查询中使用like的时候&#xff0c;对应的字段上面的索引是否会生效呢&#xff1f; like ‘张’ 用到了索引like ‘张%’ 前缀匹配 用到了索引like ‘%张%’ 中间匹配 没有用到了索引like ‘%张’ 后缀匹配 没有用到了索引 mysql> CREATE TABLE t…

2024.06.10校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、校招 | 三环集团2025届校园招聘启动&#xff08;内推&#xff09; 校招 | 三环集团2025届校园招聘启动&#xff08;内推&#xff09; 2、实习丨中国汽研第二届检测工程事业部实习生专项…

“论数据访问层设计技术及其应用”必过范文,软考高级,系统架构设计师论文

论文真题 在信息系统的开发与建设中,分层设计是一种常见的架构设计方法,区分层次的目的是为了实现“高内聚低耦合”的思想。分层设计能有效简化系统复杂性,使设计结构清晰,便于提高复用能力和产品维护能力。一种常见的层次划分模型是将信息系统分为表现层、业务逻辑层和数…

HomeController

目录 1、 HomeController 1.1、 Registration 1.2、 BlogDetails 1.3、 Error HomeController using ITM_College.Data;

laravel8框架windows下安装运行

目录 1、安装前如果未安装先安装Composer 2、使用composer安装laravel8 3、使用内置服务器:8000 的命令去访问测试 ​4、使用本地环境运行phpstudy配置到public目录下 Laravel官网 Laravel 中文网 为 Web 工匠创造的 PHP 框架 安装 | 入门指南 |《Laravel 8 中文文档 8.x…

vue3中的$refs 和$parent

$refs 是父可以查看到子的所有数据&#xff0c;假如想要修改的话需要导入 这个意思就是把aaa属性和bbb属性暴漏出去&#xff0c;让父可以修改 definExprop({aaa,bbb}) $parent是子可以查看到父的所有数据&#xff0c;假如想要修改的话需要导入 这个意思就是把aaa属性和bbb属…

[数据集][图像分类]瑜伽动作分类数据集1238张5类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;1238 分类类别数&#xff1a;5 类别名称:["downdog","godde…

聊聊贪心算法

第1部分&#xff1a;引言 贪心算法是一种在每一步选择中都采取当前状态下最优&#xff08;或最有利&#xff09;的选择&#xff0c;从而希望导致结果是全局最优的算法策略。这种算法简单、直观&#xff0c;且在很多情况下能够快速得到一个足够好的解决方案。然而&#xff0c;值…

el-upload 组件上传文件(查询,上传,删除,下载功能)

1.html el-upload中的属性&#xff1a; <el-upload ref"upload" class"upload-demo" // element-ui自带的样式 :headers"headerOdj" // 文件上传的头,带token&#xff08;重要&#xff0c;不然传输大文件会断掉&…

Shell编程规范与变量-01

一、Shell脚本概述 在一些复杂的 Linux 维护工作中&#xff0c;大量重复性的输入和交互操作不仅费时费力&#xff0c;而且容易出错&#xff0c;而编写一个恰到好处的 Shell 脚本程序&#xff0c;可以批量处理、自动化地完成一系列维护任务&#xff0c;大大减轻管理员的负担。 1…

mongosh 和mongo 命令行连接MongoDB

Mongoshell MongoDB的Shell工具mongosh是一个全功能的JavaScript和Node.js的14.x REPL与MongoDB的部署交互环境。我们通过它可以直接对数据库进行查询和操作。这个工具是需要在安装玩MongoDB后单独安装的。 与传统的mongo方式连接MongoDB更加丰富。 官网 https://www.mongodb.…

Java 面试题:如何保证集合是线程安全的? ConcurrentHashMap 如何实现高效地线程安全?

在多线程编程中&#xff0c;保证集合的线程安全是一个常见而又重要的问题。线程安全意味着多个线程可以同时访问集合而不会导致数据不一致或程序崩溃。在 Java 中&#xff0c;确保集合线程安全的方法有多种&#xff0c;包括使用同步包装类、锁机制以及并发集合类。 最简单的方法…

编程语言中的作用域

编程语言中的作用域 作用域&#xff08;Scope&#xff09;是计算机程序设计中的一个核心概念&#xff0c;它主要用于规定程序中变量、函数和对象的可见范围和有效期限。换句话说&#xff0c;作用域决定了在代码的哪些部分可以访问特定的变量、函数或对象。 通过作用域的使用&…

网络编程(八)广播、组播

一、广播 &#xff08;一&#xff09;概念 前面介绍的数据包发送方式只有一个接受方&#xff0c;称为单播 如果同时发给局域网中的所有主机&#xff0c;称为广播 如果同时发给局域网中的部分主机&#xff0c;称为组播 注意&#xff1a; 只有用户数据报(使用UDP协议)套接字才…

AI音乐大模型时代:版权归属与创意产业的新生长点

AI在创造还是毁掉音乐&#xff1f; 简介&#xff1a;最近一个月&#xff0c;轮番上线的音乐大模型&#xff0c;一举将素人生产音乐的门槛降到了最低&#xff0c;并掀起了音乐圈会不会被AI彻底颠覆的讨论。短暂的兴奋后&#xff0c;AI产品的版权归属于谁&#xff0c;创意产业要…

JWT生成令牌

实现步骤 引入JWT包 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.12.3</version> </dependency>定义令牌类型枚举 package com.angel.ocean.token.constant;public enum Toke…

go语言进阶实战学习(逐行注释)(1):两协程并发交替打印数字和字母

要求&#xff1a; 并发两协程交替打印数字和字母。一个协程打印数字&#xff0c;一个协程打印字母。 输出&#xff1a; 12AB34CD56EF78GH910IJ1112KL1314MN1516OP1718QR1920ST2122UV2324WX2526YZ2728 思路&#xff1a; 两个 channel 控制两个协程进行交替打印。sync.WaitG…

PyScada(三)后端应用

PyScada 的后端应用 使用后端 要使用后端&#xff0c;请在浏览器中打开http://127.0.0.1 &#xff08;将 127.0.0.1 替换为 PyScada 服务器的 IP 或主机名&#xff09;&#xff0c;然后使用安装过程 中定义的管理员帐户登录 &#xff08;TODO 链接到创建超级用户文档&#xf…

Java基础的重点知识-01

文章目录 开发前言Java语言开发环境入门程序说明常量变量和数据类型数据类型转换运算符方法解析 开发前言 常用DOS命令 Java语言的初学者&#xff0c;学习一些DOS命令&#xff0c;会非常有帮助。DOS是一个早期的操作系统&#xff0c;现在已经被Windows系统取代&#xff0c;对于…

STL——函数对象,谓词

一、函数对象 1.函数对象概念 概念&#xff1a; 重载函数调用操作符的类&#xff0c;其对象常称为函数对象。 函数对象使用重载的()时&#xff0c;行为类似函数调用&#xff0c;也叫仿函数。 本质&#xff1a; 函数对象(仿函数)是一个类&#xff0c;不是一个函数。 2.函数对象…