打印
[热门应用]

单片机定时器学习汇总

[复制链接]
906|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
心愿wish|  楼主 | 2017-3-21 14:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1时钟周期=1/晶振频率M
1机器周期=12(51系列12T,若1T则为1)X时钟周期 = 12(1)X(1/晶振频率M) = 1 us(1/12 us)
1us机器周期脉冲数=晶振频率f/12
假设12MHZ晶振工作在51单片机12T模式下,需要使用定时器进行50MS定时操作,定时器工作在方式1;
12M的晶振每秒(s)可产生1M(10^6 us)个机器周期
50ms就需要50×1000 us × 1us(1机器周期)个机器周期 = 50000
定时器在方式1工作,是16位计数器,最大值为65536(2^16),也就是能进行最大65536次计数
50ms定时操作需要50000个机器周期,1个机器周期=1us,所以需要50000次计数操作
为了计数器定时器工作,需要预先填充定时器初值(初值=定时器计数最大计数次数 - 所需定时计数次数)
所以需设置定时器初值15536 = 65536 -50000,即3CB0H(10进制15536转换成16进制数3CB0),所以TH0=0x3c,TL0=0xb0,高位就是TH0的值,低位为TL0的值
若假设使用11.0592MHZ的晶振,其他条件不变
11.0592M的晶振每秒可产生0.9216M个机器周期,50ms就需要46080个机器周期
定时器在方式1工作,是16位计数器,最大值为65536,所以需设置初值19456 = 65536 - 46080,即4C00H
所以TH0=0x4c,TL0=0x00。
推导方式1 ,16位定时器/计数器初值设定高8位TH0,低TL0的公式为:
TH0=(65536- 所需计数次数)/256 = 初值/256;
TL0=(65536 - 所需技术次数)%256 = 初值%256;
为什么除以256,因为我们的计时器是两个8位组成的,那么要把那些差值装进这两个8位,计数从低8位开始,那么低8位最多能装256个机器周期,那么256计满了就用高8位的,就是说低8位满一次高8位加1,那么高8位装多少,低8位就满了几次,算法就是用差值除一下256取其整数,剩下的,就是还剩了小于256次数的就放在低8位,就是差值 的余数。
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
flag++;
if(flag==20)//当定时到1秒时执行花括号里面的语句
{ }
}
---------------------------------------------------------------------------------------
at89s52,晶振频率12m
其程序如下:
#include
#include
void timer0_init()
{
TMOD=0x01;//方式1
TL0=0xb0;
TH0=0x3c;
TR0=1;
ET0=1;
}
void timer0_ISR(void) interrupt 1
{
TL0=0xb0;
TH0=0x3c;//50ms中断一次
single++;
if(single==20)
{ kk++;
single=0;
}
}
void main()
{
int kk=0;//计数器
int single=0;
timer0_init();
}

沙发
心愿wish|  楼主 | 2017-3-27 15:53 | 只看该作者
自己顶一下,每天学点新技术,每天进步一点点

使用特权

评论回复
板凳
几时再见| | 2017-3-29 20:23 | 只看该作者
这也是51有这种情况,到了M核的年代,就没这么复杂的分类了。

使用特权

评论回复
地板
paotangsan| | 2018-7-16 12:09 | 只看该作者
总也闹不清楚  这个很详细介绍的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

104

帖子

0

粉丝