T=1/f,若f=12MHz,
则振荡周期T=1/12us,
状态周期T=2*(1/6)us;
机器周期T=12*(1/12)=1us
指令周期T=1~4us
精确的延时函数,用定时器完成
默认介绍T0-T1, T2不做介绍,内容基本相同
实质是+1计算。有16位=高8位+低8位
每次有脉冲时,自动+1,当全部+1时,溢出,此时完成定时/计数功能
定时时间/计数次数计算=溢出计数值-初值(如65536-10)
T0引脚连接P3.4管脚
T1引脚连接P3.5管脚
TMOD寄存器工作方式寄存器;控制选择是定时器功能还是计数器功能
TCON寄存器低4位用于控制外部中断相关位,高4位控制定时器控制位,包括启动,停止,溢出
7-4位,高4位,管理T1:
GATE:门控位,为0时,软件控制TR0=1,TR1=1(常用)
为1时,软件控制TR0=1,TR1=1并且INTO=1,INT1=1
C/T:选择位,C为计数,T为定时,T=0时,低电平有效,为定时模式,T=1时,为计数模式
M0,M1为工作方式的设置:00 01 10 11多使用01和10(01是定时寄存器工作,10是串口通信波特率的生成)
3-0位,低4位,管理T0:
TF1/TF0:查询定时器是否溢出(也可通过软件置1或清0)
TR1:为1时,定时器开始工作;为0时,定时器停止工作,通过软件配置
TMOD的0X00方式0的00,13位,若5位均为11111,则向前8位置1,若前8位也满,则溢出给TF0,
TFO为溢出标志位,溢出,发送信号给计数器
图右侧:
GATE=0时,经过非门为1,(与INTO引脚的)或门为1,当TRO为1时,经过与门,进入中断开关,使之置为1。
GATE=1时,经过非门为0,(与INTO引脚的)或门为1(INT0为1时),当TRO为1时,经过与门,进入中断开关,使之置为1。
GATE=1时,经过非门为0,(与INTO引脚的)或门为0(INT0为0时),进入中断开关,使之置为0。
C/T:工作模式选择
当T=0时,计数模式,中断开关连接1,TO引脚连接外部引脚P3.4管脚,并传输外部脉冲
当T=1时,计数模式,中断开关连接0,机器周期,一次就是1us..达到技术目的
计数初值与计数个数:2的13次方-N
(用于定时计算器)
TM0D的0X01方式1的01,16位,低八位计数满了,向高八位溢出,高八位计数满了则溢出给TF0,给CPU中断...
计数初值与计数个数:2的16次方-N
(用于波特率)
TMOD的0X02方式2的10,TLO全为11111111时,溢出给THO,THO再次归还给TLO,自动重置
适用于精确脉冲信号发生器,如串口通信uart
计数初值与计数个数:2的8次方-N
TMOD的0X03方式3的11,仅适用于T0
计算初值1ms
如默认为f=12MHz时,机器的T=1/f=1us
则1ms/1us=1000,65536-1000=64536,并将其写入TL0,TH0或TH1,TH1中,FC18
TL0=0xFC TL1=0x18
若计算值过大时,则可以用工具里面的定时器计算工具
理解此图需要与上图尤其是方式1.2紧密结合着理解,较简单,不再赘述。
TMOD=0x01,0x0代表选择T0,1代表0001,0001的0代表GATA=0,C/T=0,M1=0,M0=1.此时完成对T0/T1的确定
TH0=0XFC;TL0=0X18是赋初值,将1ms=FC18,FC18给TH0和TL0
打开ET0或ET1,(定时器0中断允许位或定时器1中断允许位)+EA(总中断)
打开定时器1或定时器2
若T0换为T1时,需要TMOD|=0X10;TH1=0XFC;TL1=0X18L;ET1=1;EA=1;TR1=1......
注:用单片机板子显示出来时,需要用D1=P2.0
#include"reg52.h" typedef unsigned char u8; typedef unsigned int u16; sbit LED1=P2^0; void time0_init(void)//定时器中断0 { TMOD|=0X01;//选择为定时器0模式,工作方式1 TH0=0XFC;//给定时器赋初值,定时1ms TL0=0X18; ET0=1;//打开定时器0中断允许 EA=1;//打开总中断 TR0=1;//打开定时器 } void time1_init(void) { TMOD|=0X10;//选择为定时器0模式,工作方式1 TH1=0XFC; //给定时器赋初值,定时1ms TL1=0X18; ET1=1;//打开定时器1中断允许 EA=1;//打开总中断 TR1=1;//打开定时器 } void main(void) { time0_init();//定时器0中断配置 time1_init();//定时器1中断配置 while(1) { } } void time0() interrupt 1 //定时器0中断函数 { static u16 i;//定义静态变量i TH0=0XFC; //给定时器赋初值,定时1ms TL0=0X18; i++; if(i==1000) { i=0; LED1=!LED1; } } void time1() interrupt 3 //定时器1中断函数 { static u16 i;//定义静态变量i TH1=0XFC; //给定时器赋初值,定时1ms TL1=0X18; i++; if(i==1000) { i=0; LED1=!LED1; } }