51单片机——定时器/计数器

简介

之前单片机学习中,实现延时的方式是软件延时,就是通过循环代码,让cpu数数一段时间,这段时间cpu只能处于数数状态,接收不到其他的指令

而C51单片机中,有专门的硬件电路来支持数数,这个硬件电路会对应有相应的寄存器,定时器和计数器都是依赖于这个硬件电路,但是二者计数的信号来源不同。

如果把该寄存器配置为定时器时,每经过一个机器周期,寄存器的值就加1,相当于通过内部震荡电路来计数,通过寄存器的值*机器周期的时间就可以得出定时器定时长度

如果把该寄存器配置为计数器时,每次来一个负跳变信号(从T0,P3^4或T1,P3^5引脚读入),寄存器的值就加1,相当于通过读取外部针脚信号来计数

标准C51有两个定时器/计数器:T0和T1,C52多一个T2

定时器如何定时

定时器的本质原理:每经过一个机器周期,计数+1。那么只要知道了机器周期的时间,那么定时的时间就等于计数*机器周期

晶振

晶体振荡器,又称为数字电路的"心脏",是各种电子产品里面必不可少的频率元器件,数字电路的所有工作是离不开时钟的,晶振的好坏还会影响系统的稳定性

比如这块C52开发板的时钟频率就是11.0592MHZ  

时钟周期

也称为振荡周期,是时钟频率的倒数,时钟周期是计算机中最基本,最小的时间单位,在一个时钟周期,CPU仅能完成一项最基本的工作,更小的时钟周期意味着更高的工作频率

机器周期

也称CPU周期,在计算机中,常把一个指令的执行过程划分为若干阶段(取地,译码,执行等等),每一个阶段完成一个基本操作,完成一个基本操作所需的时间称为机器周期,一般情况下,一个指令周期由若干个机器周期组成,一个机器周期由若干个时钟周期组成,51单片机中一个机器周期等于12或者6个时钟周期,传统模式是12个时钟周期,所以定时器+1一般经过1/11059200*12=1.085微秒

知道了这个时间,我们就可以通过设定寄存器存值的多少,来设计定时器定时的时长

定时器/计数器的相关寄存器

定时器控制寄存器TCON

地址88H,类似IO口寄存器,可按位寻址,进行定时器的控制

从高位到低位为TF1,TR1,TF0,TR0,IE1,IT1,IE0,IT0

TF位检测计数溢出,置1时表示溢出,置0时非溢出,溢出时,如果需要产生中断,此位作为中断请求位,cpu进入中断服务后,由硬件置0,不用中断时也可以软件手动置0;TR位控制计数运行置1时启动计数,置0时停止计数 

IE位为外部中断请求位,cpu进入中断服务时,由硬件置0;IT位为外部中断的触发方式,置0为电平触发,置1为负跳变触发

定时器模式寄存器TMOD

地址89H,不可按位寻址,用于选择定时器的工作模式和工作方式,即T0和T1的工作方式

高低4位都是GATE,C/T,M1,M0,高4位管控定时器1,低4位管控定时器0

M1和M0取值00,01,10,11分别对应4种模式

00:13位定时器,TL只用低5位,TH8位全用

01:16位定时器,TL,TH全用,优点是量程大,但是每次爆表需要手动给THTL赋初值

10:8位自动重载定时器,TL位来计时,溢出时,硬件自动将TH存放的值存入TL中,优点是效率高,爆表时硬件自动将TH的值存入到TL中继续计数

11:对于定时器1,停止计数,定时器无效

       对于定时器0,作为双8位定时器,TL0作为一个8位定时器通过TCON0控制,TH0也作为一个8位定时器通过TCON1控制

计数寄存器TL0,TH0,TL1,TH1

用于计数,并且有4种工作方式,由TMOD寄存器控制

如果只用高位或者低位只能数256下,高低为同时用能数65536下,即71ms,溢出时TCON对应TF位置1,可以供cpu查询,注意查询后及时清零

如何设定定时时间

16位模式定时10ms

因为寄存器数数只能从0开始数到65536,那么如果我们改变开始数的数就可以设定自定义定时时间,比如定时10ms,算出起始数为65536-10000/1.085=56320,转化为16进制为DC00,所以设定TL=0x00,TH=0xDC就可以设定定时10ms

​
void Delay10()		//10毫秒@11.0592MHz
{
	AUXR &= 0x7F;	//定时器时钟12T模式
    TMOD &= 0xF0;	//设置定时器模式
	TMOD |= 0x01;	//设置定时器模式
	TL0 = 0x00;		//设置定时初值
	TH0 = 0xDC;		//设置定时初值
	TF0 = 0;		//清除TF0标志
	TR0 = 1;		//定时器0开始计时
}

​

按位操作

清0用&,置1用|

对于8位寄存器,如果想在指定位置上置1,其他位置不变,就可以将寄存器的相应位置或(|)上1,其他位置或(1)上0;如果想在指定位置上置0,其他位置不变,就可以将寄存器的相应位置与(&)上0,其他位置与(&)上1;

TMOD &= 0xF0;    //高4位&1111,不修改定时器1的配置,低4位&0000,将定时器0的控制位所有置0

TMOD |= 0x01;    //高4位|0000,不修改定时器1的配置,低4位|0001,将定时器0的控制位最低位置1,这样就将TMOD的低4位配置为0001,将定时器0配置为16位定时器,而高4位不改变

AUXR寄存器的作用

AUXR寄存器8位,只有最低两位有效,最低位用于决定是否ALE输出,置1禁止输出,置0运行输出,禁止ALE信号输出后,会降低系统的EMI输出(单片机时钟对外界的电磁辐射干扰),

案例

1、定时器控制闪灯

#include "reg52.h"

sbit ledblue =P3^7;
sbit ledyellow =P3^6;

void delay500(){
	int cnt=0;
	TMOD=0x01;
    TL0=0x00;
	TH0=0xDC;
	TR0=1;
	while(1){
	  if(TF0==1){
		 cnt++;
		 TF0=0;
	   TL0=0x00;
	   TH0=0xDC;
	 }
	 if(cnt==100)break;
	}
	TR0=0;
	
}

void main(){
	 ledblue=0;
	 delay500();
     while(1){
        ledblue=!ledblue;
		delay500();
	 }
}

                                                                                                                                                                                                                                                                                                                                         

你可能感兴趣的:(C51单片机,51单片机)