一、单片机的时序

  单片机工作时,是在统一的时钟脉冲控制下一拍一拍地进行的。由于指令的字节数不同,取这些指令所需要的时间也就不同,即使是字节数相同的指令,由于执行操作有较大的差别,不同的指令执行时间也不一定相同,即所需的拍节数不同。
  时钟周期:时钟周期也称为振荡周期,定义为时钟脉冲的倒数(可以这样来理解,时钟周期就是单片机外接晶振的倒数,例如12M的晶振,它的时间周期就是1/12 us),是计算机中最基本的、最小的时间单位。 在一个时钟周期内,CPU仅完成一个最基本的动作。 在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。
  机器周期:在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。8051系列单片机的一个机器周期同6个S周期(状态周期)组成。前面已说过一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示),8051单片机的机器周期由6个状态周期组成,也就是说一个机器周期=6个状态周期=12个时钟周期。
  指令周期: 指令周期是执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需的机器周期数也不同。 时钟周期、机器周期、指令周期之间的关系图如下。


二、51单片机的定时/计数器的概念

  单片机中,脉冲计数与时间之间的关系十分密切,每输入一个脉冲,计数器的值就会自动累加1,只要相邻两个计数脉冲之间的时间间隔相等,则计数值就代表了时间的流逝,因此,单片机中的定时器和计数器其实是同一个物理的电子元件,只不过计数器记录的是单片机外部发生的事情(接受的是外部脉冲),而定时器则是由单片机自身提供的一个非常稳定的计数器,这个稳定的计数器就是单片机上连接的晶振部件;MCS-51单片机的晶振经过12分频之后提供给单片机稳定脉冲;晶振的频率是非常准确的,所以单片机的计数脉冲之间的时间间隔也是非常准确的。


三、51单片机的定时/计数器的工作原理

  加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;一个是T0或T1引脚输入的外部脉冲源。
  作为定时器使用时,定时器计数8051单片机片内振荡器输出经过12分频后的脉冲个数,即:每个机器周期使定时器T0/T1的寄存器值自动累加1,直到溢出,溢出后继续从0开始循环计数;所以,定时器的分辨率是时钟振荡频率的1/12;
  作为计数器使用时,通过引脚T0(P3.4)或T1(P3.5)对外部脉冲信号进行计数,当输入的外部脉冲信号发生从1到0的负跳变时,计数器的值就自动加1由于检测一个从1到0的下降沿需要2个机器周期,因此要求被采样的电平至少要维持一个机器周期。当晶振频率为12MHz时,最高计数频率不超过1/2MHz,即计数脉冲的周期要大于2微秒。;计数器的最高频率一般是时钟振荡频率的1/24;
  由此可知,不论是定时器还是计数器工作方式,定时器T0和T1均不占用CPU的时间,除非定时器/计数器T0和T1溢出,才可能引起CPU中断,转而去执行中断处理程序。所以说,定时器/计数器是单片机中效率高而工作灵活的部件。


51单片机定时器工作原理图:

  由上图可见与定时器相关的寄存器主要有下面这几个:TMOD、 TCON、 TL0、TH0、TL1、TH1。下面介绍一下这几个寄存器

  • 16位加法计数器:

      是定时计数器的核心,其中 TL0、TH0、是定时计数器0的底八位和高八位;TL1、TH1是定时计数器1的底八位和高八位;并且高八位和底八位可单独使用。16位加法计数器主要是在设置定时计数器的初值时候使用
  • TMOD定时器工作模式及方式寄存器

       GATE :定时操作开关控制位,当GATE=1时,INT0或INT1引脚为高电平,同时TCON中的TR0或TR1控制位为1时,计时/计数器0或1才开始工作。若GATE=0,则只要将TR0或TR1控制位设为1,计时/计数器0或1就开始工作。
      C/T :定时器或计数器功能的选择位。C/T=1为计数器,通过外部引脚T0或T1输入计数脉冲。C/T=0时为定时器,由内部系统时钟提供计时工作脉冲。
      M1 M0:T0、T1工作模式选择位
      
      
  • TCON定时器控制寄存器

    TF1:定时器T1溢出标志,可由程序查询和清零,TF1也是中断请求源,当CPU响应T1中断时由硬件清零。
    TF0:定时器T0溢出标志,可由程序查询和清零,TF0也是中断请求源,当CPU响应T0中断时由硬件清零。
    TR1:T1充许计数控制位,为1时充许T1计数(定时)。
    TR0:T0充许计数控制位,为1时充许T0计数(定时)。
    IE1:外部中断1请示源(INT1,P3.3)标志。IE1=1,外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”。
    IT1:外部中断源1触发方式控制位。此位为1设置为底电平触发,为0设置为下降沿触发。
    IE0:外部中断0请示源(INT0,P3.2)标志。IE0=1,外部中断1正在向CPU请求中断,当CPU响应该中断时由硬件清“0”。
    IT0:外部中断源0触发方式控制位。此位为1设置为底电平触发,为0设置为下降沿触发。

51单片机定时器4种工作方式:

  工作模式0:
  由TL0的低5位和TH0的全部8位共同构成一个13位的定时器/计数器,定时器/计数器启动后,定时或计数脉冲个数加到TL0上,从预先设置的初值(时间常数)开始累加,不断递增1,当 TL0计满后,向TH0进位,直到13位寄存器计满溢出,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。并且定时器/计数器硬件会自动地把13位的寄存器值清0,如果需要进一步定时/计数,需要使用相关指令重置时间常数,并把定时器/计数器的中断标记TF0置0。
  工作模式1:最常用的定时器工作模式
  模式1与模式0几乎完全相同,唯一的区别就是,模式1中的寄存器TH0和TL0共同构成的是一个16位定时器/计数器来参与操作,因此比模式0中的定时/计数范围更大

  工作模式2: 工作方式2特别适合于用作较精确的脉冲信号发生器。
  这种模式又称为自动再装入预置数模式。有时候,我们的定时/计数操作是需要多次重复定时/计数的,如果溢出时不做任何处理,那么,在第二轮定时/计数时就是从0开始定时/计数了,而这并不是我们想要的。所以,要保证每次溢出之后,再重新开始定时/计数的操作是我们想要的,那就要把预置数(时间常数)重新装入某个地方,而重新装入预置数的操作是硬件设备自动完成的,不需要人工干预,所以这种工作模式就叫自动再装入预置数方式。在工作模式2中,把自动重装入的预置数存放在定时器/计数器的寄存器的高8位中,也就是存放在TH0中,而只留下TL0参与定时/计数操作。
  这个工作模式常用于波特率发生器(串口通讯),T1工作在串口模式2;用于这种方式时,定时器就是为了提供一个时间基准;计数溢出之后,不需要做太多的事情,只做一件事就可以,就是重新装入预置数,再开始重新计数,而且中间不需要任何延时。

  工作模式3:
  方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数由于定时器/计数器T1没有工作模式3,如果把定时器/计数器T0设置为工作模式3,那么TL0和TH0将被分割成两个相互独立的8位定时器/计数器。


三、51单片机的定时/计数器的应用

  在protues下搭建仿真环境:
  


  在这里介绍一下定时器初值的设定:
  
工作方式0:13位定时器/计数器工作模式,最多可计数2的13次方次,即:8192次
工作方式1:16位定时器/计数器工作模式,最多可计数2的16次方次,即:65536次
工作方式2:8位定时器/计数器工作模式,最多可计数2的8次方次,即:256次,
工作方式3:8位定时器/计数器工作模式,最多可计数2的8次方次,即:256次

  以12M晶振为例:每秒钟可以执行1000000次机器周期个机器周期。而定时器每次溢出 最多65536 个机器周期。
那么对12MHz的晶振来讲
1个机器周期 1us ( 12/fosc = 1us)
方式0 13位定时器最大时间间隔 = 2^13 = 8.192ms
方式1 16位定时器最大时间间隔 = 2^16 = 65.536ms
方式2 8位定时器最大时间间隔 = 2^8 = 0.256ms =256 us
方式3 8位定时器最大时间间隔 = 2^8 = 0.256ms =256 us

以上是对定时器定时的最大时间间隔做一个说明,下面具体说明怎么计算初值(小于最大时间间隔)假如定时10ms那么的定时器初值计算如下:
-当使用12M晶振,12MHz除12为1MHz,也就是说一秒=1000000次机器周期。10ms=10000次 机器周期。
预置数的计算公式:预置数=最大值-需要计数的次数;(65536-10000)
再将预置数装入16位定时计数器,如下:
TH0=(65536-10000)/256
TL0=(65536-10000)%256
-当使用11.0592M晶振,11.0592MHz除12为921600Hz,就是一秒921600次机器周期,10ms=9216次机器周期。
预置数的计算公式:预置数=最大值-需要计数的次数;(65536-9216)
再将预置数装入16位定时计数器,如下:
TH0=(65536-9216)/256
TL0=(65536-9216)%256


  介绍完初值的确定,下面介绍定时器最常见的两种用法

  • 定时:定时计数器作为定时器使用,配置步骤如下:
    1.模式设置,配置TMOD寄存器
    2.定时器初值设置 假设10ms中断
    3.开定时器中断
    4.开总中断
    5.打开定时器
    通过以上5步就打开了一个定时器,定时器没10毫秒发起一次中断,即没10毫秒进入一次中断服务程序
    示例程序如下:
#include<reg51.h>sbit led=P1^0;
unsigned int flag;
void main()
{TMOD=0x01;//1.模式设置,00000001,采用的是定时器0,工作与式1(M1=0,M0=1)。TH0=(65536-10000)/256;  //2.定时器设置,每隔10毫秒发起一次中断。TL0=(65536-10000)%256;ET0=1;                  //3.开定时器0中断EA = 1;                 //4.开总中断TR0=1;                  //5.打开定时器while(1){if(flag==100)  {led=~led;flag=0;}   }
}void TIM0() interrupt 1 //中断服务程序
{   TH0=(65536-10000)/256;  //进入中断要重新设置定时器处置,要注意。TL0=(65536-10000)%256;flag++;
}
  • 计数:定时计数器作为计数器使用,配置步骤如下:
    1.模式设置,配置TMOD寄存器。
    2.开计数器中断
    3.开总中断
    4.打开计数器
    通过这简单的四步,我们就打开了一个计数器,可以对P3.4或者P3.5进行下降沿的脉冲计数,这里有一点要注意就是计数器可以不开中断,这样溢出时只是不会进去中断服务程序。
    示例程序如下:
#include<reg51.h>sbit led=P1^0;
sbit s=P3^4;
unsigned int count;
void main()
{TMOD=0x05;       //1.模式设置,00000101,采用的是计数器0,工作模式1(M1=0,M0=1)。TH0=0;           //计数器清零TL0=0;ET0=1;           //2.开计数器0中断EA=1;            //3.开总中断TR0=1;           //4.打开计数器led=1;while(1){   count=(TH0<<8)|TL0;if((count*10000)==50000)//按5下按键led状态取反  {led=0;TH0=0XFF;TL0=0XFF; //人为的让计数器进入中断}}
}void TIM0() interrupt 1 //中断服务程序
{   led=1;TH0=0;TL0=0;
}

心得体会~

这样51单片机的定时计数器就会使用了,当然这只是基础的应用,当然我们使用单片机只是学习配置它的硬件,其他高大上的用法可以说不关单片机的事情,那关系到算法啊思路想法这些东西了,真正难得还是后者。所以说只是要求会用,那么花不了几天时间就可以学会了,涉及到应用那就是一辈子的事情啦,写这篇博客一是对51系列单片机做一下总结,方便日后开发,二呢也方便初学者借鉴一下,快速入门提高。

学习笔记之-51单片机定时计数器相关推荐

  1. 学习笔记:51单片机(STC89C52)如何定时10ms

    1.定时器如何定时 首先大致描述一下定时器的定时原理,其实本质就一句话:每经过一个机器周期,寄存器就加1. 这里就又要解释什么是时钟周期,什么是机械周期.我们的51单片机无论是开发板还是最小系统板上, ...

  2. 学习笔记之-51单片机特殊功能寄存器

    一.前言 学习51单片机的过程中,其实就是学习怎么用它的特殊功能寄存器(有些寄存器是我们看不到的),特殊功能寄存器是80C51单片机中各功能部件对应的寄存器,用于存放相应功能部件的控制命令,状态或数据 ...

  3. 51单片机定时/计数器的工作原理

    定时/计数器的最基本工作原理是进行计数.对内部时钟脉冲进行计数时,作为定时器:对外部脉冲信号计数时,则是计数器.不管作为定时器还是计数器,本质上都是计数器. 51单片机有两个定时/计数器:T0/P3. ...

  4. 51单片机定时/计数器

    定时计数器 什么是定时/计数器以及用处 51单片机有2个16位定时器/计数器:定时器0(T0为P3.4)和定时器1(T1为P3.5) 这里所说的16位是指定时/计数器内部分别有16位计数寄存器. 当工 ...

  5. 实验六 51单片机定时/计数器实验

    熟悉唐都51单片机实验箱及综合实验调试平台,深入理解和掌握单片机内部定时/计数器各种工作方式的不同.掌握C51的编程方法以及头文件的使用,学会使用Keil软件. 实验内容: 1. 搭建51单片机对外部 ...

  6. 学习笔记之51单片机键盘篇(非编码键盘与编码键盘、非编码键盘的扫描方式、独立键盘、矩阵键盘)

    这篇博文主要记录51单片机键盘篇(非编码键盘与编码键盘.非编码键盘的扫描方式.独立键盘.矩阵键盘.键盘消抖等)包含原理图.代码等 (一)基础补充 1.键盘的任务 2.键盘的识别 3.如何消除按键的抖动 ...

  7. 51单片机定时器/计数器(定时器中断)

    51单片机定时器/计数器(中断系统:定时器中断) 实现功能 通过定时器终端控制LED灯 D1 间隔一秒闪烁 单片机型号:STC89C52 定时器介绍 1.51单片机定时器原理 定时器实质上就是一个加1 ...

  8. 嵌入式开发学习笔记6-了解单片机中的特殊功能寄存器(定时器/计数器)

    嵌入式开发学习笔记6-了解单片机中的特殊功能寄存器(定时器/计数器) 定时器/计数器简介 TH与TL TMOD工作模式寄存器 TCON定时器控制寄存器 定时器操作实例 定时器/计数器简介 在单片机中, ...

  9. 嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器B、累加器A和程序状态字PSW)

    嵌入式开发学习笔记5-了解单片机中的特殊功能寄存器(寄存器.累加器和程序状态字) 累加器A 寄存器B 程序状态字PSW 累加器A 累加器A是ACC(Accumulator)的缩写,累加器A是一个具有特 ...

  10. 【51毕设案例】基于51单片机-定时喂食供氧智能鱼缸

    目录 功能介绍: 整体功能简述: 硬件框图: 软件流程图: 原理图: 仿真图: 元器件清单: 主要部分代码展示:void main() 工程管理展示: 下载内容展示: 更详细代码视频讲解及代码下载请看 ...

最新文章

  1. 基于OpenCV的特定区域提取
  2. ValueError: Classification metrics can‘t handle a mix of multiclass and unknown targets
  3. (节点分类)四大图数据集AIFB,MUTAG,BGS,AM数据集获取
  4. linux下vim命令详解
  5. ASP.NET网页显示LED字体
  6. 系统程序员成长计划-走近专业程序员
  7. 四川大学计算机专业贵州分数线,四川大学2016年在贵州省高考各专业录取分数线...
  8. PCB中英对照一、 综合词汇
  9. Java设计模式学习总结(15)——行为型模式之责任链模式
  10. Python 各种报错解释及处理方法
  11. 【报告分享】2020-2021年中国职业教育投融资发展报告.pdf(附下载链接)
  12. qq代码大全可复制_给QQ换上“彩色动态昵称”,太酷了!
  13. 一文读懂声纹采集、声纹识别、声纹数据库系统等声纹识别技术在公安业务领域的应用场景
  14. U盘修复,U盘量产教程(以台电晶彩NCU,容量为32G的U盘为实例)by aser
  15. PyCharm - Split Vertically Split Horizontally (垂直拆分窗口 水平拆分窗口)
  16. Attiny48单片机编程经验总结
  17. [日常] NOI2019 退役记
  18. 安装keepalive错误:configure: error: No SO_MARK declaration in headers
  19. Go语言入门到实战——14.Go语言的协程机制以及并发机制
  20. CNN是如何进行图像特征提取的

热门文章

  1. Ubuntu 18.04 chia 远程收割机 harvester 多台
  2. flutter打包出错了,有大神帮忙看看吗?
  3. IT部门绩效考核管理思考
  4. Caffe2 - (二十四) Detectron 之 utils 函数(2)
  5. 【机器学习】基于生成对抗网络的黑白图片上色
  6. 计算机辅助设计学哪个软件,高校有必要进行计算机辅助设计软件的教学.pdf
  7. layui时间日期控件laydate设置默认值,并且结束时间大于开始时间
  8. 2-折腾python:继续一些瞎打印的小把戏
  9. 使用Scrapy(二)编写抓取规则
  10. 来自华为员工家属的“抱怨”