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

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;	//给定时器赋初值,定时1msTL0=0X18;	ET0=1;//打开定时器0中断允许EA=1;//打开总中断TR0=1;//打开定时器			
}

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

void Timer0() interrupt 1
{static u16 i;TH0=0XFC;	//重新装载初值,定时1msTL0=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;	//给定时器赋初值,定时1msTL0=0X18;	ET0=1;//打开定时器0中断允许EA=1;//打开总中断TR0=1;//打开定时器			
}void main()
{	Timer0Init();  //定时器0初始化while(1);		
}void Timer0() interrupt 1
{static u16 i;TH0=0XFC;	//重新装载初值,定时1msTL0=0X18;i++;if(i==1000)//累加1000次得到一秒{i=0;led=~led;	}	
}

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

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

相关文章

深度学习PyTorch 之 RNN-中文多分类

关于RNN的理论部分我们已经在前面介绍过,所以这里直接上代码 1、 数据部分 1.1 读取数据 # 加载数据 data_path ./data/news.csv data pd.read_csv(data_path)# 预览数据的前几行 data.head()数据是csv格式,只有两列,第一列是标签&#…

【华为面试基础题】最大括号深度

描述 现有一字符串 仅由 (, ), {, }, [, ]一共六种括号组成。若字符串满足以下条件之一&#xff0c;则为无效字符串。 任意类型的左右括号数量不相等存在未按正确顺序(先左后右)闭合的括号&#xff0c; 输出括号的最大嵌套深度&#xff0c;若字符串无效则输出 0。 0 < 字符…

导览系统厂家|景区电子导览|手绘地图|AR导览|语音导览系统

随着元宇宙、VR、AR等新技术的快速发展&#xff0c;旅游服务也更加多元化、智能化。景区导览系统作为旅游服务的重要组成部分&#xff0c;其形式更加多元化智能化。智能导览系统作为一种新的服务方式&#xff0c;能够为游客提供更加便捷的旅游服务和游览体验&#xff0c;也逐渐…

随机采样一致性识别模型 Ransac

pclpy 随机采样一致性识别模型 Ransac 一、算法原理1.背景2.运行说明1.显示带异常值的平面点云2.显示根据平面模型的随机采样一致性得到的平面点云3.显示带异常值的球形点云4.显示根据球形模型的随机采样一致性得到的球形点云 二、代码三、结果1.显示带异常值的平面点云2.显示根…

linux网络查看配置与docker网络删除

注意&#xff1a;如果设置网络不生效&#xff0c;查看是使用bin下面的route还是sbin下面的&#xff0c;通过如下命令复制一样&#xff0c;在启动的时候可以查看加载网络配置文件 [rootlocalhost ~]# tail -f /var/log/messages Feb 28 11:48:12 localhost systemd: boot-init-…

【C++干货基地】C++:函数重载(深度解析Windows和Linux下函数的修饰规则)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

测试开发(6)软件测试教程——自动化测试selenium(自动化测试介绍、如何实施、Selenium介绍 、Selenium相关的API)

接上次博客&#xff1a;测试开发&#xff08;5&#xff09;测试分类标准 &#xff1a;按测试对像划分、按是否查看代码划分、按开发阶段划分、按测试实施组织、按是否运行划分、按是否手工划分、按测试地域划分-CSDN博客 目录​​​​​​​ 什么是自动化测试 自动化测试介绍…

ES-ES的基本概念

ES的基本概念 一、文档 1.1 文档相关概念 ES是面向文档的&#xff0c;文档是所有可搜索数据的最小单位&#xff0c;可以对比理解为关系型数据库中的一条数据 日志文件中的一条日志信息一本电影的具体信息/一张唱片的详细信息 文档会被序列化成JSON格式保存在ES中 JSON对象由…

【LeetCode】升级打怪之路 Day 08:反转字符串

今日题目&#xff1a; 344. 反转字符串541. 反转字符串 II151. 反转字符串中的单词 目录 LC 344. 反转字符串 【easy】LC 541. 反转字符串 II 【easy】LC 151. 反转字符串中的单词 【better】 ⭐⭐⭐ 今天主要完成了三道与字符串反转有关的题目&#xff0c;整体难度不大&#x…

react-组件进阶

1.目标 能够实用props接收数据 能够实现父子组件之间的通讯 能够实现兄弟组件之间的通讯 能够给组件添加props校验 能够说出生命周期常用的钩子函数 能够知道高阶组件的作用 2.目录 组件通讯介绍 组件的props 组件通讯的三种方式 Context props深入 组件的生命周期 Render-p…

数据结构:循环队列

一、队列的概念 操作受限的线性表&#xff0c;允许在队列的一端执行入队操作&#xff0c;另一端执行出队操作 先进先出(FIFO) 1.顺序队列 物理结构连续&#xff0c;依赖于数组实现 队列中有一个队头指针和队尾指针&#xff0c;队头指针保存每次要出队的元素&#xff0c;队…

SpringCloud--Nacos解析

一、Nacos简介 Spring Cloud Alibaba Nacos是一个用于动态服务发现、配置管理和服务管理的平台&#xff0c;是阿里巴巴开源的一个项目&#xff0c;旨在简化微服务架构中的服务治理。Nacos 提供了一组简单易用的特性集&#xff0c;可以快速的实现动态服务发现、服务配置、服务元…

2024食品工程与智慧农业国际学术会议(ICFESA2024)

2024食品工程与智慧农业国际学术会议(ICFESA2024) 一、【会议简介】 2024食品工程与智慧农业国际学术会议&#xff08;ICFESA2024&#xff09;是一个专注于食品工程和智慧农业领域的国际学术会议。会议将在杭州举行&#xff0c;该会议旨在汇聚全球相关领域的专家学者&#xff…

LiveGBS流媒体平台GB/T28181功能-查看国标设备下通道会话列表直播|回放|对讲|播放|录像|级联UDP|TCP|H264|H265会话

LiveGBS流媒体平台GB/T28181功能-查看直播|回放|对讲|播放|录像|级联UDP|TCP|H264|H265会话 1、会话列表2、会话类型3、搭建GB28181视频直播平台 1、会话列表 LiveGBS-> 国标设备-》点击在线状态 点击会话列表 2、会话类型 下拉会话类型可以看到 直播会话、回放会话、下载…

Windows网络问题:局域网内电脑连接wifi连不上

Windows网络问题&#xff1a;局域网内电脑连接wifi连不上 前提连接的网络没有问题 1、身边是否有人能连接上此网络 2、判断是否是无线网络的问题&#xff0c;寻找有线网络尝试 3、通过手机热点测试是否是电脑本身问题 经过上述的几步判断&#xff0c;如果是电脑本身的问题进行…

pytorch中的setattr和getattr:多层网络堆叠

同一个网络模块的多层叠加是深度学习中常用的操作&#xff0c;如果使用nn.Sequential将这些模块叠加到一起就会显得很呆&#xff1a; self.blocknn.Sequential(capsule_net(),capsule_net(),capsule_net(),capsule_net(),capsule_net(),capsule_net(), )对于这种方法&#xff0…

Qt中tableView控件的使用

tableView使用注意事项 tableView在使用时&#xff0c;从工具栏拖动到底层页面后&#xff0c;右键进行选择如下图所示&#xff1a; 此处需要注意的是&#xff0c;需要去修改属性&#xff0c;从UI上修改属性如下所示&#xff1a; 也可以通过代码修改属性&#xff1a; //将其设…

栈和队列——c语言实现栈

本节复习栈和队列中栈的增删查改。 首先回顾一下栈的性质&#xff1a; 栈的存储数据的原则是“后入先出”&#xff0c; 先入的在栈底&#xff0c; 后入的在栈顶。 弹出数据时在栈顶弹出。 开始实现栈的接口 栈的所有函数接口 //栈的初始化 void StackInit(Stack* pst); //入栈…

某查查首页瀑布流headers加密

目标网站&#xff1a; 某查查 对目标网站分析发现 红框内的参数和值都是加密的&#xff0c;是根据算法算出来的&#xff0c;故进行逆向分析。 由于没有固定参数名&#xff0c;只能通过搜索headers&#xff0c;在搜索的位置上打上断点&#xff0c;重新请求。 断点在此处断住&a…

解决“source ~/.bashrc 无效”的问题

dockerfile 在执行 RUN source ~/.bashrc 的时候会报错&#xff1a; RUN source ~/.bashrc: 0.188 /bin/sh: 1: source: not found 原因 dockerfile默认的shell是sh&#xff0c;无法使用source 解决方案 在 RUN source ~/.bashrc 前面添加以下指令&#xff0c;将shell改为ba…