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直接控制定时器的启动和停止。
当TR0=1,启动定时器T0。
当TR1=1,启动定时器T1。
C/T=0时为定时功能: 加1计数器对脉冲f进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;
C/T=1时为计数功能: 加1计数器对来自输入引脚T0(P3.4)和T1(P3.5)的外信号脉冲进行计数,每来一个脉冲,计数器加1,直到计时器TFx满溢出;
MCS-51的定时器T0有4种工作方式:方式0,方式1,方式2,方式3。
MCS-51的定时器T1有3种工作方式:方式0,方式1,方式2。
TCON:定时器计数器控制寄存器
在特殊功能寄存器中能够进行位操作,很方便
作用:控制定时器计数器的起停,标志定时器的溢出和中断情况
TF1:定时器1的溢出标志位,中断时硬件自动清零,查询时应该软件清0TR1:定时器1的运行控制位,软件值0关闭定时器1(当GATE=1,INT1为高电平且TR1=1时启动定时器1。或者,GATE=0,TR1=1启动定时器1)
TF0:
TR0:
IE1:外部中断1请求标志位
IT1:外部中断1触发方式选择位。0:低电平触发 1:下降沿触发
IE0:
IT0:
定时器计数器初始化步骤:
1.确定工作方式(对TMOD赋值)
2.预置定时器/计数器的初值(直接将初值写入TH0,TL0或TH1,TL1)
3.根据需要开放定时器/计数器的中断(直接对IE位赋值)
4.启动定时器计数器
定时器/计数器初值的计算方法:
方式0:M=2 *13=8 192
方式1:M=2*16=65 536
方式2:M=2*8=256
方式3:定时器0分成两个8位计数器,所以两个M均为256。
因为定时器/计数器是作“加1”计数,并在计数满溢出时产生中断,因此初值X可以这样计算:
在计数方式下:X=M-计数值
在计数方式下:X=M-计数值
在定时方式下:X=M-定时值/机器周期
一个机器周期=12*时钟周期
时钟周期=1/f
所以:机器周期=12/f 即12个脉冲为一个机器周期
#include <reg52.h> #include <absacc.h> sbit R0=P1^0; sbit R1=P1^7; unsigned int t0=0,t1=0,m0=0,m1=0; //工作方式0:最大定时计数=2^13=8192 //工作方式1:最大定时计数=2^16=65536 //机周时间=12/fosc 12MHz:1us; 6MHz:2us; //TH&TL:T初值=(工作方式最大计值)-定时时间/机周时间; void Time0_init() //计时 { TMOD|=0x01; //T0方式1 TH0=(65536-0)/256; // TL0=(65536-0)%256; EA=1; ET0=1; TR0=1; } void Time1_init() //计时 { TMOD|=0x10; //T1方式1 TH1=(65536-0)/256; // TL1=(65536-0)%256; EA=1; ET1=1; TR1=1; } main() { Time0_init(); Time1_init(); P1=0XFF; while(1) { //P1=~t0; } } void Time0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; t0++; if(t0==10) { t0=0;m0++; } //if(t0%5==0) R0=~R0; } void Time1() interrupt 3 { TH1=(65536-10)/256; TL1=(65536-10)%256; t1++; if(t1==10) { t1=0;m1++; } //if(t1%5==0) R1=~R1; }