普中51单片机:定时器与计数器详解及应用(七)

在这里插入图片描述

文章目录

  • 引言
  • 定时器工作原理
  • TMOD定时器/计数器工作模式寄存器
  • 定时器工作模式
    • 模式0(13位定时器/计数器)
    • 模式1(16位定时器/计数器)
    • 模式2(8位自动重装模式)
    • 模式3(两个8位计数器)
  • 定时器配置流程
  • 代码演示——LED1间隔1秒闪烁
  • 代码演示——按键1控制LED流水灯状态
  • 代码演示——LCD1602定时器时钟显示

引言

定时器和计数器是用于测量时间间隔或计数事件的硬件模块。它们可以在许多应用中使用,例如生成精确的时间延迟、测量频率、计数外部事件等。51单片机的定时器属于单片机的内部资源,其电路的连接和运转均在单片机内部完成。本文将详细介绍51单片机中的定时器和计数器的工作原理、配置方法及其应用。

本章节将涉及中断相关的知识,具体内容可参考:中断系统讲解

注意:定时器的资源和单片机的型号是关联在一起的,不同型号的单片机可能会有不同的定时器数量和操作方式,但一般来说,T0和T1的操作方式是所有51单片机所共有的。

定时器工作原理

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

定时器/计数器的工作原理基于时钟脉冲。定时器模式下,它们使用内部时钟源来计数;计数器模式下,它们使用外部脉冲源来计数。每个定时器/计数器都有一个寄存器,用于存储当前的计数值。

TMOD定时器/计数器工作模式寄存器

定时和计数功能由特殊功能寄存器TMOD的控制位 C T C\sqrt{T} CT 进行选择,TMOD寄存器的各位信息如下表所列。可以看出,2个定时/计数器有四种操作模式,通过TMOD的M1和M0选择。2个定时/计数器的模式0、1和2都相同,模式3不同,各模式下的功能如下所述:
在这里插入图片描述

定时器工作模式

通过对寄存器TMOD寄存器中的M1、M0的设置,定时器/计数器0和1有四种不同的工作模式。

模式0(13位定时器/计数器)

在这里插入图片描述
工作模式图如下:
在这里插入图片描述

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

模式1除了使用了TH0及TL0全部16位外,其他与模式0完全相同。此模式下,TL0的8位溢出向TH0进位,TH0溢出置位TCON中的溢出标志位TF0。

当GATE=0(TMOD.3)时,如TR0=1,则定时器计数。GATE=1时,允许由外部输入INTO控制定时器0,这样可实现脉宽测量。TRO为TCON寄存器内的控制位,TCON寄存器各位的具体功能描述见上节TCON寄存器的介绍。

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

模式2(8位自动重装模式)

此模式下定时器/计数器可自动重装载8位计数器,TL0的溢出不仅置位TF0,而且将TH0内容重新装入TL0。(TH0可先设置好,重装时TH0内容不变)
在这里插入图片描述

模式3(两个8位计数器)

对定时器0,在此模式中,定时器1停止计数,效果与将TR1设置为0相同。


对定时器0,此模式下定时器0的TL0及TH0作为2个独立的8位计数器。下图为模式3时的定时器0逻辑图。TL0占用定时器0的控制位: C T C\sqrt{T} CT 、GATE、TRO、INTO及TFO。THO限定为定时器功能(计数器周期),占用定时器1的TR1及TF1。此时,TH0控制定时器1中断。

模式3是为了增加一个附加的8位定时器/计数器而提供的,使单片机具有三个定时器/计数器。模式3只适用于定时器/计数器0,定时器T1处于模式3时相当于TR1-0,停止计数,而T0可作为两个定时器用。
在这里插入图片描述

定时器配置流程

  1. 对TMOD赋值,以确定T0和T1的工作方式。
  2. 根据所要定时的时间计算初值,并将其写入TH0、TL0或TH1、TL1。
  3. 如果使用中断,则对EA赋值,开放定时器总中断。
  4. 使TR0或TR1置位,启动定时/计数器定时或计数。

注意:STC-ISP烧写工具自带计算所要定时的时间计算初值,可根据自己选择的模式,进行复制代码即可
在这里插入图片描述

代码演示——LED1间隔1秒闪烁

通过定时器0中断控制LED1指示灯间隔1秒闪烁,实物图连接:D1连接到P2_0引脚即可,使用的12.000MHz的时钟,每次间隔一毫秒触发中断,在中断触发函数进行计数,当为1000时,就是一秒。

#include <REGX52.H>sbit LED1 = P2^0;void External0_ISR(void) interrupt 1
{static unsigned int count = 0;TL0 = 0x18;	//需要手动复原			TH0 = 0xFC;	//需要手动复原// 中断处理代码if(count == 1000){count = 0;LED1 = !LED1;}count++;
}void Timer0_Init(void)		//1毫秒@12.000MHz
{TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x01;			//设置定时器模式TL0 = 0x18;				//设置定时初始值TH0 = 0xFC;				//设置定时初始值TF0 = 0;				//清除TF0标志ET0 = 1;//打开T0中断EA = 1;//打开总中断TR0 = 1;				//定时器0开始计时
}void main()
{Timer0_Init();while(1){}	
}

代码演示——按键1控制LED流水灯状态

在此演示中,使用了INTRINS.H库中的_crol_左移和_cror_右移函数,当按下KEY1按键时,LED流水灯就会切换方向状态进行闪烁。实物图连接:K1连接P0_0引脚,LED八个灯插入P2引脚。

  • cror(unsigned char val, unsigned char n): 字符循环右移,将 val 循环右移 n 位。
  • crol(unsigned char val, unsigned char n): 字符循环左移,将 val 循环左移 n 位
#include <REGX52.H>
#include <INTRINS.H>sbit KEY1 = P0^0;
sbit KEY2 = P0^1;
unsigned char LEDMode;void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void Timer0_Init(void)		//1毫秒@12.000MHz
{TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x01;			//设置定时器模式TL0 = 0x18;				//设置定时初始值TH0 = 0xFC;				//设置定时初始值TF0 = 0;				//清除TF0标志ET0 = 1;//打开T0中断EA = 1;//打开总中断TR0 = 1;				//定时器0开始计时
}void External0_ISR(void) interrupt 1
{static unsigned int count = 0;TL0 = 0x18;	//需要手动复原			TH0 = 0xFC;	//需要手动复原// 中断处理代码if(count == 1000){count = 0;if(LEDMode == 0)P2 = _crol_(P2,1);if(LEDMode == 1)P2 = _cror_(P2,1);}count++;
}unsigned char Getkey()
{unsigned char keyNumber = 0;if(KEY1 == 0){DelayXms(5);while(KEY1 == 0);DelayXms(5);keyNumber = 1;}if(KEY2 == 0){DelayXms(5);while(KEY2 == 0);DelayXms(5);keyNumber = 2;}return keyNumber;
}void main()
{unsigned char keyNum = 0;P2 = 0xfe;Timer0_Init();while(1){keyNum = Getkey();if(keyNum){if(keyNum == 1){LEDMode++;if(LEDMode>=2){LEDMode = 0;	}}}}
}

代码演示——LCD1602定时器时钟显示

此演示代码使用LCD1602模块作为显示,LCD1602模块不过多讲解,后续会提供专门的章节说明。需要LCD1602库可以私聊我。实物图连接:板子插上LCD1602模块即可。

#include <REGX52.H>
#include "LCD1602.h"unsigned char Sec=55,Min=59,Hour;//秒分时void DelayXms(unsigned int xms)	//@12.000MHz
{unsigned char data i, j;while(xms){i = 2;j = 239;do{while (--j);} while (--i);xms--;}
}void Timer0_Init(void)		//1毫秒@12.000MHz
{TMOD &= 0xF0;			//设置定时器模式TMOD |= 0x01;			//设置定时器模式TL0 = 0x18;				//设置定时初始值TH0 = 0xFC;				//设置定时初始值TF0 = 0;				//清除TF0标志ET0 = 1;//打开T0中断EA = 1;//打开总中断TR0 = 1;				//定时器0开始计时
}void External0_ISR(void) interrupt 1
{static unsigned int count = 0;TL0 = 0x18;	//需要手动复原			TH0 = 0xFC;	//需要手动复原// 中断处理代码if(count == 1000){count = 0;Sec++;if(Sec == 60){Sec = 0;Min++;if(Min == 60){Min = 0;Hour++;if(Hour == 24){Hour = 0;}}}}count++;
}void main()
{Timer0_Init();LCD_Init();LCD_ShowString(1,1,"Time:");LCD_ShowString(2,1,"00:00:00");while(1){LCD_ShowNum(2,1,Hour,2);LCD_ShowNum(2,4,Min,2);LCD_ShowNum(2,7,Sec,2);}	
}

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

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

相关文章

GaussDB DWS 详解

文章目录 GaussDB DWS 详解一、简介二、DWS的分布式架构架构概述关键组件 三、分布式查询数据查询流程SQL执行的示例 批注&#xff1a;本文引鉴了Forlogen博主的一些内容&#xff0c;并加以补充&#xff0c;以供学习了解。 GaussDB DWS 详解 一、简介 DWS(Data Warehouse Ser…

免费分享一套SpringBoot+Vue农产品在线销售(在线商城)管理系统【论文+源码+SQL脚本】,帅呆了~~

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的SpringBootVue农产品在线销售(在线商城)管理系统&#xff0c;分享下哈。 项目介绍 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发…

alike-cpp 编译

1. 源码链接&#xff1a; https://github.com/Shiaoming/ALIKE-cpp 2.已经安装好显卡驱动&#xff0c;cuda&#xff0c;cudnn,没安装的参考&#xff1a; 切记装cuda-11.x的版本&#xff0c;最好cuda11.3的版本 ubuntu重装系统后&#xff0c;安装cuda,cudnn-CSDN博客 3.安装…

C++客户端Qt开发——信号和槽

三、信号和槽 1.信号和槽概述 在Qt中&#xff0c;用户和控件的每次交互过程称为一个事件。比如"用户点击按钮”是一个事件&#xff0c;"用户关闭窗口”也是一个事件。每个事件都会发出一个信号&#xff0c;例如用户点击按钮会发出"按钮被点击"的信号&…

在互联网供应链系统可能是永远不会过时的系统

一、前言 在互联网在到人工智能&#xff0c;从基本的门户网站&#xff0c;社交网站&#xff0c;到移动互联网&#xff0c;视频网站&#xff0c;再到现在比较火爆短视频直播和人工智能AI&#xff0c;大模型。互联网的迭代&#xff0c;出现了无数的系统。但是有些系统一直久经不…

剪画小程序:做自媒体要做哪些准备!

在这个数字化的时代&#xff0c;自媒体成为了许多人展现自我、实现价值的舞台。如果你是一个自媒体小白&#xff0c;怀揣着梦想和热情准备踏上这条充满挑战与机遇的道路&#xff0c;那么在出发之前&#xff0c;有一些关键的准备工作可不能忽视。 一、明确自身定位 首先要思考的…

婚恋交友语音交友小程序APP系统开发

在数字化时代&#xff0c;婚恋交友的方式也日益多样化。传统的相亲、朋友介绍等方式已经无法满足现代人快节毒的生活需求&#xff0c;更多的人开始选择通过线上平台寻找自己的另-婚恋交友语音交友小程序APP应运而生&#xff0c;为单身男女提供了个便捷、高效的交友平台。本文将…

指针!!C语言(第一篇)

指针1 指针变量和地址1.取地址操作符(&)2.指针变量和解引用操作符(*) 指针变量的大小和类型指针的运算特殊指针1.viod*指针2.const修饰指针3.野指针 assert断言指针的使用和传址调用1.strlen的模拟实现2.传值调用和传址调用 指针变量和地址 在认识指针之前&#xff0c;我们…

Iceberg概念和特性

1. 快照 Iceberg会随着时间的推进,跟踪表生命周期中的所有数据集变化,并使用快照(Snapshots)来表示每一次变化后的数据集合,每一次数据操作的事务提交均会产生一个快照,并将其记录在元数据文件(Metadata)中。 基于快照的概念,Iceberg有以下特性: 事务性:写入快照成…

26.6 Django模型层

1. 模型层 1.1 模型层的作用 模型层(Model Layer)是MVC或MTV架构中的一个核心组成部分, 它主要负责定义和管理应用程序中的数据结构及其行为. 具体职责包括: * 1. 封装数据: 模型层封装了应用程序所需的所有数据, 这些数据以结构化的形式存在, 如数据库表, 对象等. * 2. 数据…

昇思25天学习打卡营第7天 | MindNLP ChatGLM-6B StreamChat

本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。 1 环境配置 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspore版本&#xff0c;可更改下面mindspore的版本号 !pip uninstall mindspore -y !pip install -i https://pypi.mi…

前端:Vue学习-1

前端:Vue学习-1 1. 指令1. 指令修饰符2. v-bind对样式控制的增强3. v-model应用于其他表单元素 2. 计算属性3. watch侦听器&#xff08;监视器&#xff09; 1. 指令 就是带有v-前缀的特殊属性&#xff0c;不同属性对应不同的功能 v-html&#xff1a;动态设置页面的html标签内容…

超时导致SparkContext构造失败的问题探究

文章目录 1.前言2. 基于事故现场对问题进行分析2.1 日志分析2.2 单独测试Topology代码试图重现问题 3. 源码解析3.1 Client模式和Cluster模式下客户端的提交和启动过程客户端提交时在两种模式下的处理逻辑ApplicationMaster启动时在两种模式下的处理逻辑 3.2 两种模式下的下层角…

08-8.4.1 简单选择排序+8.4.2 堆排序

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

Adminer-CVE-2021-21311

在其4.0.0到4.7.9版本之间&#xff0c;连接 ElasticSearch 和 ClickHouse 数据库时存在一处服务端请求伪造漏洞&#xff08;SSRF&#xff09;。 VPS开启HTTP服务 VPS 开启HTTP 再同时跑POC 确保能访问poc里的链接文件 第一是目标地址 第二个是跳转地址 第三个是监听地址 如果…

为什么大学讲授 C 语言比讲授 C++ 的更多?

大学更倾向于讲授C语言而不是C的几个原因可能包括。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕设800套和语言类教学&#xff0c;敲个22就可以免费获得。 基础性质&#xff1a;…

【Linux】进程程序替换 + 模拟实现简易shell

前言 上一节我们介绍了 **进程终止**和 **进程等待**等一系列问题&#xff0c;并做了相应的验证&#xff0c;本章将继续对进程控制进行介绍&#xff0c;重点学习进程程序替换&#xff0c;并进行相应验证&#xff0c;在此基础上&#xff0c;自己模拟实现一个shell&#xff0c;该…

Redis分布式锁-Redisson可重入锁原理的个人见解。

记录Redisson可重入锁的个人见解。 文章目录 前言一、什么叫做锁的重入&#xff1f;二、Redisson可重入锁原理 前言 ⁣⁣⁣⁣ ⁣⁣⁣⁣ 之前在写项目的时候&#xff0c;注意到Redisson可重入锁的一个问题&#xff0c;随即在网上搜索其对应的资料&#xff0c;下面就记录一下个…

昇思25天学习打卡营第14天 | ShuffleNet图像分类

昇思25天学习打卡营第14天 | ShuffleNet图像分类 文章目录 昇思25天学习打卡营第14天 | ShuffleNet图像分类ShuffleNetPointwise Group ConvolutionChannel ShuffleShuffleNet模块网络构建 模型训练与评估数据集训练模型评估模型预测 总结打卡 ShuffleNet ShuffleNetV1是旷世科…

鸿蒙实训笔记

第一天 #初始化一个新的NPM项目(根据提示操作) npm init #安装TSC、TSLint和NodeJS的类型声明 npm install -s typescript tslint types/node 在根目录中新建一个名为tsconfig.json的文件&#xff0c;然后在代码编辑器中打开&#xff0c;写入下述内容&#xff1a; {"co…