单片机 定时器/计数器
一、简述
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控制寄存器
设定好了定时器/计数器的工作方式后,它还不能进入工作状态,必须通过设置控制寄存器TCON中的某些位来启动它工。要使定时器/计数器停止运行,也必须通过设置TCON中的某些位来实现。当定时器/计数器计满溢出,或有外部中断请求时,TCON能标明溢出和中断情况。
设定好了定时器计数器/的工作方式后,它还不能进入工作状态,必须通过设置控制寄存器TCON中的某些位来启动它工。要使定时器/计数器停止运行,也必须通过设置TCON中的某些位来实现。当定时器/计数器计满溢出,或有外部中断请求时,TCON能标明溢出和中断情况。控制寄存器TCON每位的含义:
TF1:定时器T1溢出标志位。当定时器T1溢出时,由硬件自动使TF1置1,并向CPU申请中断。CPU响应中断后,自动对TF1清零。TF1也可以用软件清零。 |
四、初值计算
机器周期:
时钟周期(振荡周期) = 1秒/晶振频率 (T = 1/f)
机器周期 = 12*振荡周期
机器周期 = 12秒/晶振频率
如果系统晶振频率为12M,那么机器周期=1us
五、例子
定时函数
void Delay1ms(unsigned int count)
{
unsigned int i;
TMOD=0x01; //选用定时器0且工作在方式1
TH0=0x3c; //设置初值0x3cb0
TL0=0xb0;
TR0=1; //开启定时器
for(i=0;i<count;i++) //循环count次,每次定时50ms,总共count*50ms
{
while(TF0!=1);// 每次定时50ms (溢出时才会跳出循环)
TH0=0x3c; //重置初值0x3cb0
TL0=0xb0;
TF0=0; //软置溢出位
}
TR0=0; //关闭定时器
}
定时1s:Delay1ms(20);
今天的文章单片机 定时器/计数器分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/12597.html