2018-05-26 15:18:48 nanfeibuyi 阅读数 2072
  • 定时计数器-第1季第10部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第10个课程,主要内容是51单片机的定时器和计数器,本课程的学习目标是对定时器的作用和意义有深入理解,掌握通过操作寄存器来操作硬件的思路和方法。

    1963 人正在学习 去看看 朱有鹏

单片机 定时器/计数器

一、简述

    MCS—51系列单片机内部有两个16位定时器/计数器,即定时器T0和定时器T1。它们都具有定时和计数功能,可用于定时或延时控制,对外部事件进行检测、计数等。

    定时器/计数器是一个加“1”计数器,来一脉冲即做加1计数,直至寄存器各位全为1,再来一脉冲,计数器回0且使TF0(定时器T0)TF1(定时器T1)置1表示定时时间到,计数值乘以单片机的机器周期就是定时时间。

     计数器:工作在方式1,可以从0数到65536(2的16次方),超过65535产生中断;如果想要数10000个数,可以设置计数器的初值为55536,这样从初值55535数到65535就是10000个数。

     计数器又叫定时器:晶振产生脉冲信号,一个脉冲信号过来,计数器就数1,频率高,产生脉冲信号就快,计数器数数就快,计数器每数了一个数说明过去了xx秒,那么让计数器数10000个数,对应过去了10000乘以xx秒。这样我们想要在10秒之后做某件事情,设置好计数器初值(设定计数器要数多少个数)、设置好频率(确定产生一个脉冲的时间),计数器数到65535之后,产生溢出信号、引起中断,然后执行中断服务(可以是我们自己编写的中断函数)。

      如:频率是12MHZ,也就是1秒可以产生12000000个脉冲,也就是1秒可以数12000000个数。如果设置计数器的初值为65524(65535-12),也就是数12个数。数12000000个数用时1秒,那么数12个数用时12/12000000=0.000000.1秒=1微秒。(1秒=1000000微秒),想要定时1ms,那么可以让计数器数12000个数,设置计数器的初值为65535-12000=53535。

二、TMOD控制寄存器

    GATE=1时,“与门”的输出信号K由INTx输入电平和TRx位的状态一起决定(即此时K=TRx·INTx),当且仅当TRx=1,INTx=1(高电平)时,计数启动;否则,计数停止。
    当INT0引脚为高电平时且TR0置位,TR0=1;启动定时器T0;
    当INT1引脚为高电平时且TR1置位,TR1=1;启动定时器T1。
    GATE=0时,“或门”输出恒为1,“与门”的输出信号K由TRx决定(即此时K=TRx),定时器不受INTx输入电平的影响,由TRx直接控制定时器的启动和停止。

三、TCON控制寄存器

 

设定好了定时器/计数器的工作方式后,它还不能进入工作状态,必须通过设置控制寄存器TCON中的某些位来启动它工。要使定时器/计数器停止运行,也必须通过设置TCON中的某些位来实现。当定时器/计数器计满溢出,或有外部中断请求时,TCON能标明溢出和中断情况。

  

设定好了定时器计数器/的工作方式后,它还不能进入工作状态,必须通过设置控制寄存器TCON中的某些位来启动它工。要使定时器/计数器停止运行,也必须通过设置TCON中的某些位来实现。当定时器/计数器计满溢出,或有外部中断请求时,TCON能标明溢出和中断情况。控制寄存器TCON每位的含义: 

 

TF1:定时器T1溢出标志位。当定时器T1溢出时,由硬件自动使TF1置1,并向CPU申请中断。CPU响应中断后,自动对TF1清零。TF1也可以用软件清零。 
TR1:定时器T 1运行控制位。可由软件置1(或清零)来启动(或关闭)定时器T1,使定时器T1开始计数。用指令SETB TR1(或CLR TR1)使TR1置1(或清零)。 
TF0:定时器T0溢出标志位。其功能与TF1相同。 
TR0:定时器T0运行控制位。其功能与TR1相同。 
IE1:外部中断1请求标志位。 
IT1:外部中断1触发方式控制位。 
IE0:外部中断0请求标志位。 
IT0:外部中断0触发方式控制位。 
IE1、IT1、IE0、IT0这4位将在第3节讲述。 
控制寄存器TCON的位地址是88H,可以对它进行位寻址。

四、初值计

 

机器周期:

    时钟周期(振荡周期) = 1秒/晶振频率         (T = 1/f)

    机器周期 = 12*振荡周期

    机器周期 = 12秒/晶振频率 

    如果系统晶振频率为12M,那么机器周期=1us

 

五、例子

 

定时函数

void Delay1ms(unsigned int count)
{
	unsigned int i;
	TMOD=0x01;			   //选用定时器0且工作在方式1
	TH0=0x3c;			  //设置初值0x3cb0
	TL0=0xb0;
	TR0=1;      //开启定时器
	for(i=0;i<count;i++) //循环count次,每次定时50ms,总共count*50ms
	{	
		while(TF0!=1);// 每次定时50ms (溢出时才会跳出循环)
		TH0=0x3c;	 //重置初值0x3cb0
		TL0=0xb0;
		TF0=0;		   //软置溢出位
	} 
	TR0=0;      //关闭定时器
}

定时1s:Delay1ms(20);

 

 

2013-12-29 16:51:24 csuyishuan 阅读数 1023
  • 定时计数器-第1季第10部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第10个课程,主要内容是51单片机的定时器和计数器,本课程的学习目标是对定时器的作用和意义有深入理解,掌握通过操作寄存器来操作硬件的思路和方法。

    1963 人正在学习 去看看 朱有鹏

   上一节讲述了51单片机定时器/计数器的两个特殊功能寄存器TMOD、TCON,明白了定时器可有四种工作方式。

    对于加1计数器,输入的计数脉冲来源有:(1)由系统的时钟振荡器输出脉冲经12分频后送来(2)由T0或T1引脚输入的外部脉冲。每来一个脉冲计数器加1,当加到计数器全为1时,再输入一个脉冲就会使计数器溢出回零,计数溢出后会使得TCON寄存器中的TFX置1,向CPU发出中断请求。若工作于定时状态,则说明定时已到;若工作于计数状态,则说明计数值已满。

    溢出时的值减去计数初值即为加1计数器的计数值。

    设置定时器模式时,加1计数器是对内部机器周期计数。1个机器周期等于12个晶振振荡周期,即计数频率为晶振频率的1/12.       定时时间t=计数值N*机器周期Tcy。

    设置为计数器模式时,外部事件计数脉冲由T0或T1引脚输入到计数器中。当输入脉冲产生由1到0的负跳变时,计数器的值加1.在每个机器周期的S5P2期间对输入的电平进行采样。当采样到某一个高电平输入,而下一周期采样到一个低电平时,计数器加1.因此检验一个由1到0的下降沿需要两个机器周期,因此外部输入脉冲的最高频率为晶振频率的1/24.  如下

 

2019-05-26 13:30:50 weixin_44726304 阅读数 154
  • 定时计数器-第1季第10部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第10个课程,主要内容是51单片机的定时器和计数器,本课程的学习目标是对定时器的作用和意义有深入理解,掌握通过操作寄存器来操作硬件的思路和方法。

    1963 人正在学习 去看看 朱有鹏

关于CPU时序的知识:

振荡周期(晶振周期):为单片机提供定是信号的振荡源的周期
状态周期(s状态):2个晶振周期等于一个S状态
机器周期:一个机器周期等于6个S状态,12个晶振周期

定时计数器工作原理以及作用:

51有两组定时计数器,他们与单片机的CPU相互独立,其为自动完成
他们是根据机器内部的时钟或者外面的脉冲信号对寄存器的数据加1,也就是一个加1计数器。
计数器全1——计数器的溢出使相应的中断标志位置1——向CPU发出中断请求
作用:可以增加单片机的效率

定时计数器结构:

在这里插入图片描述
由高8位还有低8位两个而寄存器THX和TLX,TMOD是定时计数器的工作方式,TCON是控制寄存器,控制T0,T1的启动和停止以及设计溢出标志
TMOD(工作方式寄存器)
在这里插入图片描述
高四位为T1,低四位为T0
TATE:门控位,一般让其为0
C/T:定时/计数模式选择 ,0为定时,1为计数
M1M0:工作方式设置位,一共四种方式
在这里插入图片描述

TCON(控制寄存器)
在这里插入图片描述
TF1:T1溢出中断请求标志位,溢出时硬件自动制1,CPU响应中断后TF1由硬件自动置0
TR1:T1运行控制位 1为T1开始工作,0为停止工作
TR0和TF0与上面一个,不过控制的是T0

工作方式

方式0 (13位计数)
在这里插入图片描述
TL0的低五位(高三位没用)和TH0的8位组成
TL0的低5位溢出时向TH0进位,TH0溢出时,TF0置1,向CPU发出中断请求
计数初值计算公式为 X=2的十三次幂-N
剩下三种方式类似就不一一列举了

初始化程序应该完成的工作:

1.TMOD赋值,确定工作方式
2.计算初值,将其写入TH和TL
3.EA赋值,开放定时器中断(ET)
4.使TR置位

定时器中断程序(让小灯1S翻转一下)

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int 
sbit led=P2^0;

void time0()
{
TMOD|=0x01;  //选择工作方式1,GATE=0,定时作用(低四位控制T0)
TH0=0XFC;
TL0=0X18;   //1S用软件算出来为FC18
ET0=1;        //T0的中断允许位 
EA=1;         //总中断打开
TR0=1;      //T0开始工作
}

void main()
{
time0();
while (1) ;
}

void int0() interrupt 1    //前面讲过中断方式 T0为1
{
uint i;
TH0=0XFC;
TL0=0X18;
i++;
if(i==1000)
{
i=0;
led=~led;
}
}
2019-10-29 23:34:48 Reborn_Yu 阅读数 94
  • 定时计数器-第1季第10部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第10个课程,主要内容是51单片机的定时器和计数器,本课程的学习目标是对定时器的作用和意义有深入理解,掌握通过操作寄存器来操作硬件的思路和方法。

    1963 人正在学习 去看看 朱有鹏

计数器是对外来脉冲进行计数,51芯片有T0和T1两个外来脉冲输入端,分别接P3.4和P3.5两个引脚,当出现负跳变脉冲时,计数器加1;定时器也是通过计数器的计数来实现的,但此时的计数脉冲来自单片机内部,即每个机器周期产生一个计数脉冲,计数器加1。若采用12M晶振,则计数频率为1MHz,即每过1μs,计数器加1。
单片机的定时器/计数器有4种工作方式(方式0、方式1、方式2和方式3),其控制字在相应的特殊功能寄存器中,通过对它的特殊功能寄存器的编程,我们可以选择定时器/计数器两种工作模式和0~3四种工作方式。
一、控制寄存器介绍
首先介绍两个特殊功能寄存器TMOD和TCON,TMOD用于选择定时器/计数器的工作模式和工作方式,TCON用于控制T0、T1的启动和停止计数,也包含T0和T1的状态。
(一)TMOD(Timer Mode)
选择定时器/计数器的工作模式和工作方式,字节地址为89H,不能进行位寻址。

D7 D6 D5 D4 D3 D2 D1 D0
GATE C/T* M1 M0 GATE C/T* M1 M0

8位标志位分为两组,高4位控制T1,低4位控制T0。四个标志位含义如下:
(1)GATE:门控位。
GATE=0时,以运行控制位TRX(X=0,1)来启动定时器/计数器运行;
GATE=1时,以外部中断引脚INT0或INT1上的高电平来启动定时器计数器运行。
(2)M1、M0:工作方式选择位,4种编码对应4种工作方式如下:

M1 M0 工作方式
00 方式0,13位定时器/计数器
01 方式1,16位定时器计数器
10 方式2,8位的常数重新自动装载定时器/计数器
11 方式3,仅适用于T0,T0分为两个8位计数器,T1不计数

(3)C/T*:定时器/计数器模式选择位
C/T*=0,定时器模式
C/T*=1,计数器模式,计数器外部输入引脚T0(P3.4)或T1(P3.5)的负跳变脉冲计数。
(二)TCON(Timer Control)
定时器/计数器控制寄存器,字节地址88H,可位寻址,位地址为88H~8FH

TCON D7 D6 D5 D4 D3 D2 D1 D0
标志位 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
位地址 8FH 8EH 8DH 8CH 8BH 8AH 89H 88H

低四位与中断有关,这里只介绍高四位
(1)TF1/TF0:计数溢出标志位,计数溢出时置“1”;使用查询方式时,此位作为状态位供CPU查询(查询有效后应及时清零);中断方式时,此位作为中断请求标志位,进入中断服务程序后硬件自动将其清零。
(2)TR1/TR0:计数运行控制位,值为“1”,定时器/计数器启动工作,为“0”停止工作。
二、四种工作方式的区分
方式0和方式1的区别在于计数器的位数不同,方式0为13位(THX+TLX低5位),方式1为16位(THX+TLX)。但是,方式0和方式1一旦计数溢出,则计数器将全部清零,这样如果需要循环计数就需要反复装入计数初值,不仅影响计数精度还导致编程麻烦,因此方式二就是针对这个问题设置的,在计数溢出时,不仅将溢出标志位TF置“1”,同时还将已经设定好的初值装入计数器(将THX中的8位数装入TLX)。
方式3只适用于定时器/计数器T0,目的是为了增加一个附加的定时器计数器。这时TL0和TH0被分为两个相互独立的8位计数器,其中TL0使用T0的状态位们;而TL0则被固定为一个8位定时器(不能做外部计数模式),它使用定时器T1的状态控制位TR1和TF1,同时占用T1的中断请求源TF1。因此,T0工作在方式3时T1运行的控制条件只有两个,一个是C/T*,用来选择定时器还是计数器模式;另一个是M1、M0选择T1运行的工作方式,M1M0=11 时,T1停止计数。
三、定时器/计数器对输入信号的要求
1.定时器:定时器模式计数信号是内部时钟脉冲,每个机器周期使计数器加1,因此定时器输入脉冲的周期与机器周期一样,为12倍的时钟周期。当采用12MHz晶振时,刚好每1μs计数一次。可以看出,定时的精度决定于输入脉冲的周期,因此当需要高分辨率的定时时,应尽量选择频率较高的晶体。
2.计数器:计数器的计数信号是来着相应外部输入引脚INT0和INT1的负跳变,在连续的两个周期采样,若第一采样为高电平 而第二次为低电平则表示发生了负跳变,计数器加1。由于确认一次负跳变需要两个机器周期,即24个震荡周期,因此外部输入的计数脉冲的最高频率为系统晶体震荡频率的1/24,如若采用6MHz晶振,则允许输入的脉冲频率为6MHz/24=250kHz。此外,为保证某一给定电平在变化前能被采样一次,则这一电平至少要保持一个机器周期。

2017-04-19 22:00:33 little_white__ 阅读数 4074
  • 定时计数器-第1季第10部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第1季第10个课程,主要内容是51单片机的定时器和计数器,本课程的学习目标是对定时器的作用和意义有深入理解,掌握通过操作寄存器来操作硬件的思路和方法。

    1963 人正在学习 去看看 朱有鹏

1.基本概念:

89C51有两个计数器T0和T1,每个计数器都是由两个8位的RAM 单元组成的,即每个计数器都是16 位的计数器,最大的计数容量是2的6次方=65536,记住是从0-65535。

定时器的本质也是计数器,只不过定时器的脉冲来自内部的晶振,而计数器的脉冲来自外部,当检测的脉冲的下降沿时,计数寄存器加一,直到溢出,然后单片机产生一个中断。所以需要定时时,先给计数寄存器设定一个初值,每有一个内部的脉冲时钟信号(相当与一段时间),计数器加一,直到溢出,一次定时完成。之后继续循环上述步骤。

2.内部结构:

这里写图片描述

3.相关寄存器:

  1. 定时/计数器方式寄存器TMOD(只能段寻址)
    这里写图片描述
    GATE—门控制位。
    GATE=0,定时器/计数器启动与停止仅受TCON寄存器中TRX(X=0,1)来控制。
    GATE=1,定时器计数器启动与停止由TCON寄存器中TRX(X=0,1)和外部中断引脚(INT0或INT1)上的电平状态来共同控制
    C/T—定时器和计数器模式选择位。
    C/T=1,为计数器模式;C/T=0,为定时器模式。
    M1M0—工作模式选择位。
    这里写图片描述

  2. 定时器/控制器控制寄存器TCON(可以位寻址)
    这里写图片描述
    IT0:外部中断0触发方式控制位
    当IT0=0时,为电平触发方式(低电平有效)
    当IT0=1时,为边沿触发方式(下降沿有效)
    IE0:外部中断0中断请求标志位 (硬件自动完成)
    IT1:外部中断1触发方式控制位(同IT0)
    IE1:外部中断1中断请求标志位 (同IE0)
    TF0:定时/计数器T0溢出中断请求标志位
    TF1:定时/计数器T1溢出中断请求标志位
    TR1:定时器1运行控制位。
    由软件清0关闭定时器1。当GATE=1,且INIT为高电平时,TR1置1启动 定时器1;当GATE=0时,TR1置1启动定时器1。
    TR0—定时器0运行控制位,其功能及操作方法同TR1。

  3. 计数寄存器TH0/TL0(8位) , TH1/TL1(8位)
    关于如何设初值,首先要明白几个周期的概念:

     ***时钟周期:***
    

时钟周期也叫振荡周期或晶振周期,即晶振的单位时间发出的脉冲数,一般有外部的振晶产生,比如12MHZ=12×10的6次方,即每秒发出12000000个脉冲信号,那么发出一个脉冲的时间就是时钟周期,也就是1/12微秒。通常也叫做系统时钟周期。是计算机中最基本的、最小的时间单位。

		***机器周期:***

在计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一阶段完成一项工作。例如,取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一个基本操作所需要的时间称为机器周期。8051单片机的机器周期由12个状态周期组成。

在标准的51单片机中,一般情况下,一个机器周期等于12个时钟周期,也就是机器周期=12*时钟周期,(上面讲到的原因)如果是12MHZ,那么机器周期=1微秒。单片机工作时,是一条一条地从RoM中取指令,然后一步一步地执行。单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。

机器周期不仅对于指令执行有着重要的意义,而且机器周期也是单片机定时器和计数器的时间基准。例如一个单片机选择了12MHZ晶振,那么当定时器的数值加1时,实际经过的时间就是1us,这就是单片机的定时原理。

接下来就是如何设初值了:

一般我们取12M晶振时,一个周期刚好是1us,计数1000个就是1ms,这是因为标准的51单片机是12时钟周期的(STC有6时钟和1时钟方式)。那么,如果我们晶振是12M,就比较好算,如果是其它的,就用12去除好了。比如是6M的,那么就是12/6=2,每个计数是2us,那么你要定时1ms就只要计数500个即可以。

定时器的初值跟定时器的工作方式,跟晶振频率都有关系。一个机器周期Tcy=晶振频率X12,计数次数N=定时时间t/机器周期Tcy,那么初值就X=65536-N,得出的数化成十六进制就行了。这里是用定时器O工作方式1做例子,如果是其它工作方式,就不能是65535了。工作方式0是8192,方式2,3是256。这里有一个公式:

TH=(65536-time/(12/ft))/256

其中,time就是要延时的100ms(要取100000us),ft是晶振频率。这个式子又可以简化成

TH=(65536-time*ft/12)/256

TL=(65536-time*ft/12)%256

4.实例分析:

通常定时器初始化过程如下:
(1)对TMOD赋值,以确定T0和 T1的工作方式。
(2)计算初值,并将初值写入TH0、TL0或TH1、TL1。
(3)中断方式时,则对IE赋值,开放中断。
(4)使TR0和TR1置位,启动定时器/计数器定时或计数。

这里写图片描述

	产生一个1khz的方波

主程序:

采用定时器0的模式1

#include <reg51.h>
#include <intrins.h>

#define uint unsigned int 

sbit led = P1^0 ;

void Time0_Init(void)
{
	TMOD = 0x1 ;  //定时器0模式1,C/T = 0 , GATE0 = 0 ;
	TH0 = (65536 - 500)/256 ;  //设初值
	TL0 = (65536 - 500)%256 ;
	ET0 = 1 ;        //开定时器0中断
	EA = 1 ;        //开总中断
	TR0 = 1 ;      // 开定时器0
}

void Time0() interrupt 1
{
	TH0 = (65536 - 500)/256 ; //重新设初值
	TL0 = (65536 - 500)%256 ;
	led = ~led ;
}
void main(void)
{
	Time0_Init() ; // 定时器0初始化
	led = 0 ;

	while(1)
	{

	}
}

采用定时器0的模式2:

#include <reg51.h>
#include <intrins.h>

#define uint unsigned int 

sbit led = P1^0 ;

uint T0_count = 0 ;

void Time0_Init(void)
{
	TMOD = 0x2 ;  //定时器0模式2 ,C/T = 0 ,GATE0 = 0 ;
	TH0 = 256 - 100;  //设初值
	ET0 = 1 ;
	EA = 1 ;
	TR0 = 1 ;      // 开定时器0
}

void Time0() interrupt 1
{
	T0_count ++ ;//每次0.1ms加一
	if(T0_count == 5)
	{
		led = ~led ;
		T0_count = 0 ;
	}
}
void main(void)
{
	Time0_Init() ; // 定时器0初始化
	led = 0 ;
	while(1)
	{
	}
}

感觉自己水水的,请多指教。

51单片机计数器

阅读数 2407

没有更多推荐了,返回首页