单片机 定时器/计数器
一、简述
MCS—51系列单片机内部有两个16位定时器/计数器,即定时器T0和定时器T1。它们都具有定时和计数功能,可用于定时或延时控制,对外部事件进行检测、计数等。
定时器/计数器是一个加“1”计数器,来一脉冲即做加1计数,直至寄存器各位全为1,再来一脉冲,计数器回0且使TF0(定时器T0)TF1(定时器T1)置1表示定时时间到,计数值乘以单片机的机器周期就是定时时间。
计数器:工作在方式1,可以从0数到65536(2的16次方),超过65535产生中断;如果想要数10000个数,可以设置计数器的初值为55536,这样从初值55535数到65535就是10000个数。
计数器又叫定时器:晶振产生脉冲信号,一个脉冲信号过来,计数器就数1,频率高,产生脉冲信号就快,计数器数数就快,计数器每数了一个数说明过去了xx秒,那么让计数器数10000个数,对应过去了10000乘以xx秒。这样我们想要在10秒之后做某件事情,设置好计数器初值(设定计数器要数多少个数)、设置好频率(确定产生一个脉冲的时间),计数器数到65535之后,产生溢出信号、引起中断,然后执行中断服务(可以是我们自己编写的中断函数)。
如:频率是12MHZ,也就是1秒可以产生12000000个脉冲,也就是1秒可以数12000000个数。如果设置计数器的初值为65524(65535-12),也就是数12个数。数12000000个数用时1秒,那么数12个数用时12/12000000=0.000000.1秒=1微秒。(1秒=1000000微秒),想要定时1ms,那么可以让计数器数12000个数,设置计数器的初值为65535-12000=53535。
二、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直接控制定时器的启动和停止。
三、TCON控制寄存器
四、初值计算
机器周期:
时钟周期(振荡周期) = 1秒/晶振频率 (T = 1/f)
机器周期 = 12*振荡周期
机器周期= 12秒/晶振频率
如果系统晶振频率为12M,那么机器周期=1us
五、例子
定时函数
void Delay1ms(unsigned int count){unsigned int i;TMOD=0x01; //选用定时器0且工作在方式1TH0=0x3c; //设置初值0x3cb0TL0=0xb0;TR0=1;//开启定时器for(i=0;i<count;i++) //循环count次,每次定时50ms,总共count*50ms{while(TF0!=1);// 每次定时50ms (溢出时才会跳出循环)TH0=0x3c; //重置初值0x3cb0TL0=0xb0;TF0=0; //软置溢出位} TR0=0;//关闭定时器}
定时1s:Delay1ms(20);
如果觉得《单片机 定时器/计数器》对你有帮助,请点赞、收藏,并留下你的观点哦!