51单片机-(定时/计数器)

news2025/1/24 1:35:54

51单片机-(定时/计数器)

了解CPU时序、特殊功能寄存器和定时/计数器工作原理,以定时器0实现每次间隔一秒亮灯一秒的实验为例理解定时/计数器的编程实现。

1.CPU时序

1.1.四个周期

  • 振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期)
  • 状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。
  • 机器周期:1个机器周期含6个状态周期,12个振荡周期。
  • 指令周期:完成1条指令所占用的全部时间,它以机器周期为单位。

例如:外接晶振为12MHz时,51单片机相关周期的具体值为:
振荡周期=1/12us;
状态周期=1/6us;
机器周期=1us;
指令周期=1~4us;

1.2.相关概念

  • 51单片机有两组定时器/计数器,因为既可以定时,又可以计数,故称之为定时器/计数器。
  • 定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。
  • 51单片机中的定时器/计数器是根据机器内部的时钟或者是外部的脉冲信号对寄存器中的数据加1。
  • 有了定时器/计数器之后,可以增加单片机的效率,一些简单的重复加1的工作可以交给定时器/计数器处理。CPU转而处理一些复杂的事情。同时可以实现精确定时作用。

1.3.定时/计数器的工作原理

定时/计数器实质上是一个加1计数器。它随着计数器的输入脉冲进行自加1,也就是每来一个脉冲,计数器就自动加1,,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使相应的中断标志位置1,向CPU发出中断请求(定时/计数器中断允许时)。如果定时/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。
可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

2.定时器

2.1.定时器结构

定时/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器THx和TLx组成。TMOD是定时/计数器的工作方式寄存器,确定工作方式和功能;
TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。
在这里插入图片描述

2.2.特殊功能寄存器

2.2.1.控制寄存器TCON

TCON的低4位用于控制外部中断,已在前面中断系统中介绍。TCON的高4位用于控
制定时/计数器的启动和中断申请。其格式如下:

76543210
字节地址:88HTF1TR1TF0TR0IE1IT1IE0IT0
  • TF1(TCON.7):T1溢出中断请求标志位。T1计数溢出时由硬件自动置TF1为1。CPU响应中断后TF1由硬件自动清0。T1工作时,CPU可随时查询TF1的状态。所以,TF1可用作查询测试的标志。TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。
  • TR1(TCON.6):T1运行控制位。TR1置1时,T1开始工作;TR1置0时,T1停止工作。TR1由软件置1或清0。所以,用软件可控制定时/计数器的启动与停止。
  • TF0(TCON.5):T0溢出中断请求标志位,其功能与TF1类同。
  • TR0(TCON.4):T0运行控制位,其功能与TR1类同。
2.2.2.工作方式寄存器TMOD

工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。其格式如下:

76543210
字节地址:89HGATEC/TM1M0GATEC/TM1M0
  • GATE是门控位:
    GATE=0时,用于控制定时器的启动是否受外部中断源信号的影响。只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;
    GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚INT0/1也为高电平时,才能启动定时/计数器工作。即此时定时器的启动条件,加上了INT0/1引脚为高电平这一条件。

  • C/T :定时/计数模式选择位。
    C/T =0为定时模式;T上面有一杠代表=0时为定时
    C/T =1为计数模式。C上面没有一杠代表=1时为计数

  • M1M0:工作方式设置位。定时/计数器有四种工作方式。

M1M0工作方式说明
00方式 013位定时/计数器
01方式 116位定时/计数器
10方式 28位自动重装定时/计数器
11方式 3T0分成两个独立的 8 位定时/计数器;T1 此方式停止计数
  • 方式0
    方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。
    在这里插入图片描述
    定时器模式时有:N=t/ Tcy
    计数初值计算的公式为:X=213-N。
    定时器的初值还可以采用计数个数直接取补法获得。
    计数模式时,计数脉冲是T0引脚上的外部脉冲。

门控位GATE具有特殊的作用。当GATE=0时,经反相后使或门输出为1,此时仅由TR0控制与门的开启,与门输出1时,控制开关接通,计数开始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0共同控制。当TR0=1时,外中断引脚信号引脚的高电平启动计数,外中断引脚信号引脚的低电平停止计数。这种方式常用来测量外中断引脚上正脉冲的宽度。

  • 方式1
    方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。
    在这里插入图片描述
    计数个数与计数初值的关系为:X=216-N
  • 方式2
    方式2为自动重装初值的8位计数方式。
    在这里插入图片描述
    计数个数与计数初值的关系为:X=28-N
    工作方式2特别适合于用作较精确的脉冲信号发生器。
  • 方式3
    方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。
    在这里插入图片描述
    工作方式3将T0分成为两个独立的8位计数器TL0和TH0 。

2.3.使用定时器步骤

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

2.4.计数器初值的计算

  • 机器周期也就是CPU完成一个基本操作所需要的时间。
  • 机器周期=1/单片机的时钟频率。
  • 51单片机内部时钟频率是外部时钟的12分频。也就是说当外部晶振的频率输入到单片机里面的时候要进行12分频。比如说你用的是12MHZ的晶振,那么单片机内部的时钟频率就是12/12MHZ,当你使用12MHZ的外部晶振的时候。机器周期=1/1M=1us。
  • 我们定时1ms的初值是多少呢,1ms/1us=1000。也就是要计数1000个数,初值=65535-1000+1(因为实际上计数器计数到65536才溢出)=64536=FC18H

3.定时器中断编程样例

3.1.声明和定义

3.2.定时器0来设置1毫秒定时

1.使用定时器0也就是要设置TMOD低八位,GATE=0,C/T=0,工作方式1所以M1M0=01
在这里插入图片描述2.计算初值
方式1对应计算公式 :X=216-N;
也可以通过51初值设定软件快速生成;下载软件,被当成病毒时自行在安全中心允许并找回。
在这里插入图片描述
TH0=0XFC; //给定时器赋初值,定时1ms
TL0=0X18;
加上定时器0中断允许、总中断和开启定时器的函数代码:

void Timer0Init()
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器			
}

想要每隔一秒就亮一秒LED,在定时1ms后还需要继续赋初值再定时,累加1000后刚好1秒。中断函数中断号为1。

void Timer0() interrupt 1
{
	static u16 i;
	TH0=0XFC;	//重新装载初值,定时1ms
	TL0=0X18;
	i++;
	if(i==1000)//累加1000次得到一秒
	{
		i=0;
		led=~led;	
	}	
}

完整代码如下:

#include "reg52.h"			 //此文件中定义了单片机的一些特殊功能寄存器
typedef unsigned int u16;	  //对数据类型进行声明定义
typedef unsigned char u8;

sbit led=P2^0;	 //定义P20口是led
/*
定时器0初始化函数
*/
void Timer0Init()
{
	TMOD|=0X01;//选择为定时器0模式,工作方式1,仅用TR0打开启动。
	TH0=0XFC;	//给定时器赋初值,定时1ms
	TL0=0X18;	
	ET0=1;//打开定时器0中断允许
	EA=1;//打开总中断
	TR0=1;//打开定时器			
}

void main()
{	
	Timer0Init();  //定时器0初始化
	while(1);		
}

void Timer0() interrupt 1
{
	static u16 i;
	TH0=0XFC;	//重新装载初值,定时1ms
	TL0=0X18;
	i++;
	if(i==1000)//累加1000次得到一秒
	{
		i=0;
		led=~led;	
	}	
}

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

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

相关文章

go环境安装-基于vscode的Windows安装

1、vscode安装 官网链接:https://code.visualstudio.com/ 选择相应的版本,这里选择Windows下的 下载得到一个VSCodeUserSetUp-x64的可执行文件,双击执行,选择要安装的路径,下一步。 2、go语言安装 官网链接&#x…

node.js提取excel中的信息填充到word文件,批量生成合同

1.npm下载 npm i pizzip docxtemplater xlsx 2.excel模板 3.word模板 4.代码 // 引入所需模块 var PizZip require(pizzip); var Docxtemplater require(docxtemplater); var fs require(fs); var path require(path); var xl require(xlsx);// 读取并导出Excel文件 …

langChain学习笔记(待续)

目录 IntroductionLLM的限制扩展理解:什么是机器学习扩展阅读:机器学习的流程 LangChain Introduction LLM的限制 大型语言模型,比如ChatGpt4,尽管已经非常强大,但是仍然存在一些限制: 知识更新&#xff…

开源现场总线协议栈(ethercat、ethernet/ip、opc ua、profinet、canopen、modbus)

ecat主站及其相关: 1.soem:GitHub - OpenEtherCATsociety/SOEM: Simple Open Source EtherCAT MasterSimple Open Source EtherCAT Master. Contribute to OpenEtherCATsociety/SOEM development by creating an account on GitHub.https://github.com/…

ARM系列 -- 虚拟化(一)

今天来研究一个有意思的话题,虚拟化(virtualization)。 开始前,先闲扯一下,最近一个词比较火,“元宇宙(Metaverse)”。在维基百科里面是这么定义元宇宙的,“The Metaver…

MSSQL 获取表对应的列明,备注,字段类型

旧系统代码CV多了想解放一下双手写个代码生成器,这时候就需要获取到表的某一些信息了 SELECT a.NAME AS colname,CONCAT(UPPER(SUBSTRING(b.name, 1, 1)), LOWER(SUBSTRING(b.name, 2,LEN(b.name)-1))) AS typename,a.length AS length,a.scale AS scale, a.prec A…

京东数据分析(电商数据分析):2024年1月京东白酒TOP10品牌销量销额排行榜

在公布2024年1月京东白酒品牌排行榜之前,分享一个有点意思的现象:在今年龙年春晚“黄金5分钟”的广告片里,白酒局知名的品牌基本都亮相了(茅台、五粮液、洋河股份、郎酒、古井贡酒、水井坊),但今年汾酒却缺…

Thread多线程(创建,方法,安全,通信,线程池,并发,并行,线程的生命周期)【全详解】

目录 1.多线程概述 2.多线程的创建 3.Thread的常用方法 4.线程安全 5.线程同步 6.线程通信 7.线程池 8.其它细节知识:并发、并行 9.其它细节知识:线程的生命周期 1.多线程概述 线程是什么? 线程(Thread)是一个程序内部的一条执行…

安全运营中心(SOC)综合指南

什么是安全运营中心(SOC) 安全运营中心,也称为信息安全运营中心 (ISOC),是结构良好的网络安全战略的核心。安全运营中心是一个集中式枢纽,无论是在组织内部还是外包,都致力于对整个…

非线性优化资料整理

做课题看了一些非线性优化的资料,整理一下,以方便查看: 优化的中文博客 数值优化|笔记整理(8)——带约束优化:引入,梯度投影法 (附代码)QP求解器对比对于MPC的QP求解器 数值优化| 二次规划的…

Linux命名管道

Linux匿名管道-CSDN博客 目录 1.原理 2.接口实现 3.模拟日志 Linux匿名管道-CSDN博客 这上面叫的是匿名管道,不要将两者搞混,匿名管道说的是两个有血缘关系的进程相互通信,但是命名管道就是两个没有关系的管道相互通信。 1.原理 和匿名…

Mysql的备份还原

模拟环境准备 创建一个名为school的数据库,创建一个名为Stuent的学生信息表 mysql> create database school; Query OK, 1 row affected (0.00 sec)mysql> use school; Database changed mysql> CREATE TABLE Student (-> Sno int(10) NOT NULL COMME…

Leetcode3045. 统计前后缀下标对 II

Every day a Leetcode 题目来源:3045. 统计前后缀下标对 II 解法1:字典树 将这个列表哈希化:idx (s[i] - ‘a’) * 26 (s[j] - ‘a’)。 枚举 twords[j],怎么统计有多少个 swords[i] 是 t 的前缀? 这可以用字典树…

[Flutter]设置应用包名、名称、版本号、最低支持版本、Icon、启动页以及环境判断、平台判断和打包

一、设置应用包名 在Flutter开发中,修改应用程序的包名(也称作Application ID)涉及几个步骤,因为包名是在项目的Android和iOS平台代码中分别配置的。请按照以下步骤操作: 1.Android Flutter工程中全局搜索替换包名 …

[Mac软件]Adobe Substance 3D Stager 2.1.4 3D场景搭建工具

应用介绍 Adobe Substance 3D Stager,您设备齐全的虚拟工作室。在这个直观的舞台工具中构建和组装 3D 场景。设置资产、材质、灯光和相机。导出和共享媒体,从图像到 Web 和 AR 体验。 处理您的最终图像 Substance 3D Stager 可让您在上下文中做出创造性…

Window10安装ruby

最好的方法,使用rubyinstaller,即在Downloads。 这是官方推荐的安装方式 通常来说我们会下载64位的 下载完后执行下载的exe即可。在最后一步会提示让安装gem,选则安装即可。 然后就可以在控制台进行测试了。

axios接口请求超时,重试方法

import axios from "axios"; import { Message } from "element-ui";const service axios.create({baseURL: xxxx,timeout: 2000,//超时时间retry: 3, //设置全局重试请求次数(最多重试几次请求)retryDelay: 1000, //设置全局请求间…

如何在有限的预算里做好服务器的DDOS防护?

在网络安全领域,防御分布式拒绝服务(DDoS)攻击是一项持续且复杂的挑战。尤其对于预算有限的组织来说,如何在不牺牲安全性的前提下进行有效的防护,更是一个需要深思熟虑的问题。以下是一些建议,帮助你在有限…

459. 重复的子字符串(力扣LeetCode)

文章目录 459. 重复的子字符串题目描述暴力移动匹配 459. 重复的子字符串 题目描述 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。 示例 1: 输入: s “abab” 输出: true 解释: 可由子串 “ab” 重复两次构成。 示例 2: 输入: s “ab…

Android 15的新功能介绍

虽然谷歌已经发布了 Android 15 Preview 1,但这并不是完整的更新,因为该公司计划在后续的每月测试版中引入新功能。但这可能会让您思考,“Android 15 带来了哪些新功能?” 为了寻找答案,让我们深入了解 Android 15。 …