定时器之计数器应用

定时器的定时器应用估计大家都略有耳闻,而且都会用。那计数器功能了解?说实话,这个功能确实是使用场景少,用途少。但存在即合理,公司设计就会有用途。学习这件事情,不能以用处不大为由而去忽略不看。下面来看看定时器之计数器应用。

概述

计数器是对外来脉冲信号计数,对来自于外部引脚P3.4(T0),P3.5(T1),P1.1(T2)的外部信号计数。在设置计数器工作状态时,每当外部输入的脉冲发生负跳变(原来正常状态下是高电平,没有事件发生,当高电平变为低电平时,即发生负跳变),计数器加1,知道加满溢出,向cpu申请中断,以此重复。

计数器

原理

在讲解原理之前,先来看几个概念。方便看懂原理。
机器周期 在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。它一般由12个时钟周期(振荡周期)组成,也是由6个状态周期组成。而振荡周期=1秒/晶振频率,因此单片机的机器周期=12秒/晶振频率 。
时钟周期 又称振荡周期,是处理操作的最基本单位。(晶振频率的倒数) 
节拍与状态 把振荡脉冲的周期定义为节拍(用p表示)。振荡脉冲经过二分频后定义为状态。一个状态就包含两个节拍。

机器周期
如图所示,一个机器周期包含6个状态周期,一个状态周期又分为2个节拍。文字说明和图片解释很好理解。下面来开始说正事:
当定时器设定为计数器时,外部引脚输入脉冲。但输入信号产生从1到0的负跳变。计数器加1.每个机器周期的S5P2期间,对外部输入引脚进行采样。如在第一个机器周期中采得的值为1,在下个周期采的值为0.则在在再下个机器周期的S3P1期间,计数器加1.由于这个设定,外部输入信号频率有限制,最高为振荡器频率的1/24。(频率:单位时间内完成周期性变化的次数)可以这样理解,确定一次输入信号需要两个机器周期。所以输入信号的高低电平变化时间要大于两个机器周期。举个例子,外部信号电平低-高-低变化,在进入低电平状态至再次进入低电平状态的时间需要大于两个机器周期。不然会检测出错。还有就是,为了电平在变化之前能检测到,需要电平状态至少保持一个机器周期。机器周期

内部结构

计时器逻辑图
图片没什么好说的,和定时器一样。只是C/T位变化而已。

附寄存器数据手册

寄存器TCON

寄存器TCON
TF1:定时器 1 溢出标志。当定时器/计数器 1 溢出时,由 硬件置位;当主机响应中断,
转向中断服务程序时,由硬件清零。
TR1:定时器 1 运行控制位, 由软件置位/ 复位来开启或关闭定时器/计数器 1。
TF0:定时器 0 溢出标志。当定时器/计数器 0 溢出时,由 硬件置位;当主机响应中断,
转向中断服务程序时,由硬件清零。
TR0:定时器 0 运行控制位,由 软件置位/ 复位来开启或关闭定时器/计数器 0。
IE1:外部中断 1 跳变中断请求标志,当检测到 INT1 发生 1 到 0 的跳变时,由硬件置位;当主机响应中断, 转向中断服务程序时,由硬件清零。
IT1:外部中断 1 触发方式控制位,由 软件置位或清零来选择外部中断 1 的跳变/电平触发中断请求。IT1=0 时,外部中断 1 为电平触发方式,当 INT1 输入低电平时,置位 IE1。
采用电平触发方式时,外部中断源必须保持低电平有效,直到该中断被 CPU 响应,同时在该中断服务程序执行完之前,外部中断源必须被清除,否则将产生另一次中断。IT1=1 时,外部中断 1 为边沿触发方式,在对 INT1 的相邻两次采样中,如果一个周期中为高电平,接下来的周期为低电平,则置位 IE1,表示外部中断 1 正在向 CPU 申请中断。直到该中断被CPU 响应时,才被 硬件清零。
IE0:外部中断 0 跳变中断请求标志,当检测到 INT1 发生 1 到 0 的跳变时,由硬件置位;当主机响应中断, 转向中断服务程序时,由硬件清零。
IT0:外部中断 0 触发方式控制位,应用同 IT1。

寄存器TMOD

寄存器TMOD
GATE:门控制位,当 GATEx=1 时,控制寄存器 TCON 的 TRx=1(x=0 或 1)。当 GATEx=0 时,定时器启动与停止仅受寄存器中的TRx来控制(x=0 或 1)。
C / :定时器、计数器方式选择位,该位为 1 时为计数器,为 0 时为定时器。
M0:定时器/计数器工作模式选择位。
M1:定时器/计数器工作模式选择位。
注:高四位是T1定时器控制位,低四位是T0定时器控制位

工作方式如下图所示

4种工作方式

应用

/***********************************************本程序用定时器0作脉冲源,周期为200us,频率为5khz用定时器1作计数器,每当经过20个脉冲,就取反X,输出一个新的频率。作用:了解计数器,懂得如何使用计数器************************************************/#include<reg52.h>sbit X=P1^0;     //T1计数器控制位sbit Y=P1^7;     //T0定时器脉冲源控制位void initialize();//声明初始化函数main() //主函数{    initialize(); //调用初始化函数    while(1);}void initialize ()     //初始化函数{    TMOD=0X62;  //0110 0010  定时器1计数器模式,工作方式2,定时器0定时器模式,工作方式2    TH1=236;    //赋初值,计数20次中断    TL1=236;    TH0=0XA4;  //赋初值,定时100us进中断    TL0=0XA4;    EA=1;      //打开总中断    ET1=1;     //打开定时器1中断    ET0=1;     //打开定时器0中断    TR1=1;     //启动定时器1中断    TR0=1;     //启动定时器0中断}void timer_T0() interrupt 1      //定时器0中断{    Y=~Y;       //状态取反}void timer_T1() interrupt 3{    X=~X;       //状态取反}

计数器应用
效果图如上。程序注释很清楚,这里不细说了。

总结

计数器和定时器的使用大同小异,只是一个控制位的变化。文章讲解清晰明了,顺着文章细看必会弄懂,部分定义可能略有苦涩,但仔细一读,并没有多大难度。

原文地址:https://www.cnblogs.com/juzige/p/10381001.html

时间: 2024-10-10 04:18:01

定时器之计数器应用的相关文章

0804-----Linux基础----------定时器之 timerfd

1.timerfd 的基本用法 1.1 timerfd 系列的定时器采用的不是信号,而是 fd 可读,常用的函数有 timerfd_create .timerfd_settime 和 timerfd_gettime, 这些函数的功能和用法也比较浅显,这里用一个简单的例子(1.2)来说明其用法,create 参数中 CLOCK_REALTIME 是一个相对时间,当系统时间被更改时会进行调整,还有一个参数CLOCK_MONOTONIC,它是绝对时间,更改系统时间对它没有影响,这里flags一般设为0

定时器之延时触发鼠标悬浮事件

前端代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>定时器之延时触发鼠标悬浮事件</title> <script src="https://lib.baomitu.com/jquery/3.4.1/jquery.js"></script> </head> <style>

定时器之基于模模式的间隔定时

1 #include "ioCC2530.h" 2 3 #define D3 P1_0 4 #define D4 P1_1 5 #define D5 P1_3 6 #define D6 P1_4 7 8 unsigned char count = 0; //长定时累计变量 9 10 /*======================端口初始化函数========================*/ 11 void Init_Port() 12 { 13 //初始化LED灯的I/O端口 1

js小功能:定时器之滑动的ul

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style> ul{margin: 0;padding: 0;} li{list-style: none} .box{width: 100px;height: 150px;margin: 100px auto;position: relative;overflow:

定时器之倒计时效果

一.倒计时所对应的前段代码和样式 代码中所用到的前端样式css:nth-last-of-type(n)  //选择器匹配属于父元素的特定类型的第 N 个子元素的每个元素,从最后一个子元素开始计数. :nth-last-child() 选择器,该选择器选取父元素的第 N 个子元素,与类型无关,从最后一个子元素开始计数. 相关前端代码: <ul> <li class="clock"> <span>0</span> <span>0&

ZigBee交通事故警示装置

近年来,随着人们生活水平的提高和电子技术的快速发展,汽车已逐渐走进人们的生活,汽车电子化也已成为一种趋势.鉴于全球定位系统(GPS)能够实时方便.精准的提供经纬度.时间.速度等信息的优势,目前已广泛应用于汽车的监控.导航.定位等领域.本文研究重点是利用ZigBee模块技术来传输发生交通事故的车辆向周围车辆发出的警示信息. 1系统的总体设计 为了对连环追尾的恶性交通事故进行预防,设计一款以ATmegal28单片机为主控芯片的交通事故警示装置,该装置由GPS模块.无线收发模块.液晶显示模块.语音警示

C# 利用性能计数器监控网络状态

本例是利用C#中的性能计数器(PerformanceCounter)监控网络的状态.并能够直观的展现出来 涉及到的知识点: PerformanceCounter,表示 Windows NT 性能计数器组件.NextValue() 即获取计数器样本并为其返回计算所得值. PerformanceCounterCategory 表示性能对象,它定义性能计数器的类别.通过这两个即可得到计数器的信息. Chart 图表,VS自带的Chart图表,大大简化了对图表的开发.关于Chart,此前已有例子说明 Q

旧文备份:利用一个定时器实现多个虚拟定时器的两种方法

固定周期法 使用一个硬件定时器进行固定周期(比如1ms)定时,用一个结构体数组作为软定时器描述表,数组的结构体数就是最大虚拟定时器的数量,每个结构体的成员都包括虚拟定时器状态(空闲.激活.运行.超时触发.周期触发).定时值(换算成定时周期数,例如1ms的硬件定时周期,现进行125ms的定时,定时值就是125).标识ID和回调函数等:用一个变量作为定时周期计数器,每次进入定时中断,重置定时器,扫描结构体数组中的每个成员结构体,对定时值做减一操作,然后判断该定时值是否为0,是则判定该值对应的虚拟定时

DSP与单片机的选用

最近我们公司开展一个新的项目,对传感器的模拟信号的采集,有两个要求:1.ad精度要求在16位 2.采样频率要求达到2000HZ..看来很多单片机,基本上都达不到这两个条件,之前用的stm32  12位ad,采样频率也只能保持在100左右. DSP与单片机 单片机的出现实现了简单的控制功能,暂时满足了工程设计的需求,但是随着计算机科学与技术.信号处理理论与方法的迅速发展,对工程中控制或信号处理芯片的实时性和精度的要求越来越高,在某些领域,低档单片机已不再能满足要求,这促使具有快速和高精度处理能力的