之前单片机学习中,实现延时的方式是软件延时,就是通过循环代码,让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微秒
知道了这个时间,我们就可以通过设定寄存器存值的多少,来设计定时器定时的时长
地址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为负跳变触发
地址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控制
用于计数,并且有4种工作方式,由TMOD寄存器控制
如果只用高位或者低位只能数256下,高低为同时用能数65536下,即71ms,溢出时TCON对应TF位置1,可以供cpu查询,注意查询后及时清零
因为寄存器数数只能从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寄存器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();
}
}