文章1:如果你选的单片机的晶振一定,比如12MHZ来说吧,机器周期是1us,就是说每1us产生一次计数,就拿50ms来说,这是你想要的计时,意思是,对机器周期进行50000计数就可以得到我想要的,可T0是一个可以对机器周期能进行65536次计数,也就是说我想要的50MS不能让T0溢出,怎么办,那么先给这个定时器里面放些数,放多少,就是我们想要的50MS在加上一个多少就能等于65536,也就是65536和50000的差值,这个值就是我们说的初值。
为什么除以256,因为我们的计时器是两个8位组成的,那么要把那些差值装进这两个8位,那么低8位最多能装256个机器周期,那么256计满了就用高8位的,就是说低8位满一次高8位加1,那么高8位装多少,低8位就满了几次,算法就是用差值除一下256取其整数,剩下的,就是还剩了小于256次数的就放在低8位,就是差值 的余数。如果我要放一个超过256的数,肯定是超过先放高八位,把剩下的部分放在低八位中了,TH0=(65536-50000)/256就是把TL0中放不下的部分放在TH0中,再把剩下的部分放在TH0中。
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
flag++;
if(flag==20)//当定时到1秒时执行花括号里面的语句
{ }
}
(Fromhttp://bbs.ednchina.com/BLOG_ARTICLE_3012623.HTM)
文章2:
其实很简单,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期
机器周期=12/n(n指晶振频率),假设你要定时的时间为M
那么定时的初值为:
M/机器周期=初值;
TH0=(65536-初值)/256;
TL0=(65536-初值)%256;
将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值
例如用12M晶振做1ms定时计算如下:
机器周期=12/12*10^6=1us(微秒)
定时初值=(1*10^-3)/(1*10^-6)=1000;
所以:TH0=(65536-1000)/256;(求模运算,即可求出高八位的值)
TL0=(65536-1000)%256;(求余运算,因为低八位最大能装255)
将65536-1000=64536化为16进制为:0xFC18
TH0=0xFC;
TL0=0X18;
(Fromhttp://blog.sina.com.cn/s/blog_5134d7020100ey3i.html)
关键字:C51 定时器 推导
引用地址:
C51 定时器 TL0=(65536-50000)%256是怎么推导出来的?
推荐阅读最新更新时间:2024-10-23 12:44
C51 定时器 TL0=(65536-50000)%256是怎么推导出来的?
文章1:如果你选的单片机的晶振一定,比如12MHZ来说吧,机器周期是1us,就是说每1us产生一次计数,就拿50ms来说,这是你想要的计时,意思是,对机器周期进行50000计数就可以得到我想要的,可T0是一个可以对机器周期能进行65536次计数,也就是说我想要的50MS不能让T0溢出,怎么办,那么先给这个定时器里面放些数,放多少,就是我们想要的50MS在加上一个多少就能等于65536,也就是65536和50000的差值,这个值就是我们说的初值。 为什么除以256,因为我们的计时器是两个8位组成的,那么要把那些差值装进这两个8位,那么低8位最多能装256个机器周期,那么256计满了就用高8位的,就是说低8位满一次高8位加1,那么
[单片机]
C51 定时器 TL0=(65536-50000)%256是怎么推导出来的?
文章1:如果你选的单片机的晶振一定,比如12MHZ来说吧,机器周期是1us,就是说每1us产生一次计数,就拿50ms来说,这是你想要的计时,意思是,对机器周期进行50000计数就可以得到我想要的,可T0是一个可以对机器周期能进行65536次计数,也就是说我想要的50MS不能让T0溢出,怎么办,那么先给这个定时器里面放些数,放多少,就是我们想要的50MS在加上一个多少就能等于65536,也就是65536和50000的差值,这个值就是我们说的初值。 为什么除以256,因为我们的计时器是两个8位组成的,那么要把那些差值装进这两个8位,那么低8位最多能装256个机器周期,那么256计满了就用高8位的,就是说低8位满一次高8位加1,那
[单片机]
c51中定时器工作时如何使用T0脚输入脉冲信号?
嵌入式系统中,定时器是一种常用的设备,可以实现各种时间控制功能,如计时、计数、产生中断等。8051单片机中有两个定时器:T0和T1,其中T0定时器主要用于计时和计数操作,可以通过T0脚输入脉冲信号来控制定时器的工作。 T0脚是单片机的P3.4口,既可以作为普通的输入输出口,也可以作为T0定时器的外部输入引脚。当T0脚作为定时器的外部输入引脚时,可以通过输入的脉冲信号来控制定时器的计数。在使用T0脚输入脉冲信号时,需要采取一些措施来确保信号的稳定性和正确性。 首先,需要确定输入脉冲信号的频率。在使用T0脚输入脉冲信号时,需要将信号的频率与定时器的工作频率相匹配。具体来说,当定时器使用外部时钟源时,其工作频率为外部时钟源频率的一半,因
[单片机]
用C51单片机的外部中断设计1s定时器
51单片机给我们提供了2个计时器中断,分别是计时器0和计时器1,他们对应的优先级分别是1和3,开启计时器并允许其中断后,计时器会从给定的初始值开始,每个指令周期加1,直到加到65535,再加一时计时器溢出,计时器此时会进入中断,并执行中断服务函数。 虽然书上讲的很清楚了,但实际使用还是有些许差别,我自己是这样理解的 65536-50000的由来 假设我使用的单片机的晶振为12MHZ,其机器周期是1us,即每1us产生一次计数 如果设计一个1s的定时器,理论上是需要1*10^6个机器周期,但定时器T0只能对机器周期能进行最大65536次计数,很明显已经超过了,并不能直接采用T0的默认值 转下思维模式,取个65535之内的整数值,
[单片机]
C51编程16-中断篇(定时器中断3)
使用定时器/计数器中断,需要将满足以下的条件。 1)中断总允许打开 EA = 1; 2)中断源允许打开 ET0 = 1或者 ET1= 1; 3)设置定时器计/计数器的工作方式(设置TMOD) 4)装载定时器,设置计数器的初始计算值。 5)开启定时器(TCON中的TR0 = 1或者TR1 = 1) 6)中断服务函数 通过前面一些中断文章的学习,相信除了上面的第4点外,使用定时器/计数器已经没什么难度了。 装载定时器,前面的定时器章节可以知道,定时器/计数器有4种方式。它们分别是13位手动装载(方式0)、16位手动装载(方式1)、8位自动重装(方式2)、8位手动装载(方式3)。根
[单片机]
C51编程15-中断篇(定时器中断2)
使用定时器/计数器中断,需要将满足以下的条件。 1)中断总允许打开 EA = 1; 2)中断源允许打开 ET0 = 1或者 ET1= 1; 3)设置定时器计/计数器的工作方式(设置TMOD) 4)装载定时器,设置计数器的初始计算值。 5)开启定时器(TCON中的TR0 = 1或者TR1 = 1) 6)中断服务函数 在满足上面的条件后,就使用定时器了,但为了对定时器的4种方式更深入的了解,下面从逻辑图上讲解4种方式。 方式0: 逻辑结构图 从上面的逻辑结构图中,逻辑结构主要分为三个部分; 1)计数源:计数源可以选择振荡器12分频(机器周期);计数源也可以选择T0(P3.4)引脚。当C/
[单片机]
C51编程14-中断篇(定时器中断1)
在MCS-51的中断系统中,除了有外部中断以外,还有定时器/计数器中断、串行中断,本章节将会说明定时器/计数器中断,以及它的四种方式 MCS-51单片机中,内部有两个16位的可以选择的定时器/计数器,称为定时器0(T0)或者定时器1(T1),它们用来做定时器或者计数器。 定时器/计数器工作原理: 作为定时器使用时,输入的时钟脉冲是由晶体振荡器的输出12分频后得到的,所以定时器是对机器周期的计数器,每一个机器周期+1,因此它的定时频率为晶振频率的1/12;当设置了定时器工作方式并启动定时器后,定时器就会按照被设定的工作方式独立工作,不再占用CPU时间。当计数器计满时溢出时向CPU请求中断。 作为计数器工作使用时,计数器
[单片机]
【C51自学笔记】定时器
CPU时序: 振荡周期:为单片机提供定时信号的振荡源的周期(晶振周期或外加振荡周期) 状态周期:2个振荡周期为1个状态周期,用S表示。振荡周期又称S周期或时钟周期。 机器周期:1个机器周期含6个状态周期,12个振荡周期。 指令周期:完成1条指令所占用的全部时间,以机器周期为单位。 例如:外接晶振为12MHz时,89S52单片机的4个时间周期的具体值为: 振荡周期=1/12us; 状态周期=1/6us; 机器周期=1us; 指令周期=1~4us; 注意: 定时器/计数器和单片机的CPU是相互独立的。定时器/计数器工作的过程是自动完成的,不需要CPU的参与。 51单片机有两组定时器/计数器,
[单片机]