首页 > 编程知识 正文

51单片机定时器位数(51单片机计数器实例)

时间:2023-05-05 07:06:26 阅读:76948 作者:3221

一、上课前要知道的事情: 151单片机有两组定时器/计数器。 因为既能计时器又能计数,所以被称为计时器/计数器。

2、定时器/计数器和单片机的CPU相互独立。 计时器/计数器将自动运行,无需CPU参与。

3、51单片机中的计时器/计数器根据设备内部的时钟或外部的脉冲信号,对寄存器中的数据加1。

4、有了定时器/计数器,可以提高单片机的效率,一些简单的重复加1工作可以交给定时器/计数器处理。 另外,计时器还起到准确的时机作用。 让CPU处理其他复杂的事情。

5、(CPU时机相关) :

振荡周期:向单片机提供定时信号的振荡源的周期(石英振动周期或外置振动周期) ) )。

状态周期:将两个振动周期作为一个状态周期,用s表示。 振荡周期也称为s周期或时钟周期。

机械周期:一个机械周期包括6个状态周期、12个振动周期。

命令周期:完成一个命令所需的所有时间。 这是机器循环单位。

例如:

外置晶振为12MHz时,51单片机相关周期的具体值如下。

振荡周期=1/12us; 状态周期=1/6us; 机器循环=1us; 指令周期=1~4us;

二、定时器/计数器原理定时器/计数器实质上为正1计数器。 计数器的输入脉冲自递增,即每1个脉冲计数器自动递增,当计数器为全1时输入另一个脉冲,计数器返回零,由于计数器溢出,对应的中断标志位置变为1,CCD 如果计时器/计数器以计时器模式运行,则表示计时器时间到了。 以计数模式动作时,表示计数值已满。

可见,只有从溢出时计数器的值中减去计数初始值,才会加上1计数器的计数值。

定时/计数器的本质是一个计数器(16位)的总和,由高8位和低8位两个寄存器THx和TLx构成。 TMOD是定时器/计数器的工作模式寄存器,决定工作模式和功能; TCON是控制寄存器,控制T0、T1的启动停止和溢出标志的设定。

51单片机定时/计数器的工作由两个特殊功能寄存器控制。TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。

(1)工作方式寄存器TMOD

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

GATE是门控位,GATE=0时,用于控制计时器的启动是否受到外部中断源信号的影响。 在软件中将TCON的TR0或TR1设为1时,可以启动计时器/计数器动作; GATA=1时,如果不通过软件将TR0或TR1设为1,且外部中断端子INT0/1也设为高电平,则计时器/计数器动作不会开始。 也就是说,此时的计时器的启动条件中附加了INT0/1端子为高电平的条件。 ***这里通常设定为0 )

C/T :定时/计数模式选择位。 C/T=0是时序模式; C/T=1为计数模式。

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

--方式0

方式0为13位计数,由TL0的低5位(高3位未用)和TH0的8位组成。TL0的低5位溢出时向TH0进位,TH0溢出时,置位TCON中的TF0标志,向CPU发出中断请求。(**这里不自动重装载,所以在中断处理函数中需要重新赋值TH0和TL0)

定时器模式时有:Nt/ Tcy

计数初值计算的公式为:X=2^13N。

定时器的初值还可以采用计数个数直接取补法获得。

计数模式时,计数脉冲是T0引脚上的外部脉冲。

门控位GATE具有特殊的作用。当GATE=0时,经反相后使或门输出为1,此时仅由TR0控制与门的开启,与门输出1时,控制开关接通,计数开始;当GATE=1时,由外中断引脚信号控制或门的输出,此时控制与门的开启由外中断引脚信号和TR0共同控制。当TR0=1时,外中断引脚信号引脚的

高电平启动计数,外中断引脚信号引脚的低电平停止计数。

这种方式常用来测量外中断引脚上正脉冲的宽度。

--方式1

方式1的计数位数是16位,由TL0作为低8位,TH0作为高8位,组成了16位加1计数器 。(**这里不自动重装载,所以在中断处理函数中需要重新赋值TH0和TL0)

计数个数与计数初值的关系为:X=2^16N

g> 

--方式2

方式2为自动重装初值的8位计数方式。(**这里自动重装载,所以在中断处理函数中不需要重新赋值TH0和TL0)

计数个数与计数初值的关系为:X=2^8-N

工作方式2特别适合于用作较精确的脉冲信号发生器。

 --方式3

方式3只适用于定时/计数器T0,定时器T1处于方式3时相当于TR1=0,停止计数。

工作方式3将T0分成为两个独立的8位计数器TL0和TH0 。 

(2)控制寄存器TCON

TCON的低4位用于控制外部中断,已在前面介绍。TCON的高4位用于控

制定时/计数器的启动和中断申请。其格式如下:

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类同。

三、定时器/计数器的使用

初始化程序应完成如下工作:

对TMOD赋值,以确定T0和T1的工作方式。

计算初值,并将其写入TH0、TL0或TH1、TL1。

中断方式时,则对EA赋值,开放定时器中断。

使TR0或TR1置位,启动定时/计数器定时或计数。

计数器初值的计算:

机器周期也就是CPU完成一个基本操作所需要的时间。

计数值N乘以机器周期Tcy就是定时时间t

笑点低的老鼠使用12MHZ的外部晶振的时候,晶振周期(振荡周期)=1/12 ,机器周期(1个机器周期等于12个振荡周期)=(1/12) * 12 =1us。(如果采用方式1即为16位定时/计数器,那么一次记满就最多为65536*1us = 65536us)

如果用定时器0,并采用方式一(16位定时/计数器),而我们定时1ms的初值是多少呢,1ms/1us=1000。也就是要计数1000个数,初值=65535-1000+1(因为实际上计数器计数到66636才溢出)=64536=FC18H (,可这样赋值:TH0=0xFC((65536-1000)/256);TL0=0x18((65536-1000)%256) );

示例代码(定时器中断):

#include "reg52.h"#include "intrins.h"typedefunsigned char u8;typedef unsigned int u32;sbit LED=P0^0;void delay(u32 i)//i==1 10us{while(i--);}/** *Funtion:定时器0中断处理函数(格式固定 interrupt 1(1为中断号)) *IN : void *OUT : void * */void Timer0() interrupt 1{static u32 i;//由于这里定时器0初始化的是方式1(16位定时计数器),所以这里需要重新赋值初始值(TH0和TL0)TH0 = 0xFC;TL0 = 0x18;i++;if(i == 1000)//1s{i = 0;LED = ~LED;}}/** *Funtion:定时器中断0初始化函数 *IN : void *OUT : void * */void Timer0Init(void){//选择为定时器0模式,工作方式1,仅用TR0打开启动TMOD |= 0x01;//给定时器赋初值,定时1msTH0 = 0xFC;TL0 = 0x18;//打开定时器0中断允许ET0 = 1;//打开总中断EA = 1;//打开定时器TR0 = 1;}int main( void ){LED=0;Timer0Init();while(1);return 0;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。