C语言 中断 定时器 初始值计算

C语言 中断 定时器 初始值计算,第1张

这个很简单的呀,商就是TH0,余数就是TL0。
最简单的思考方法就是:你要定时50毫秒,而定时器满度是65536毫秒,
很显然需要从65536-50000开始计数。即15536开始,换成16进制就是3CB0

TH0,TL0给定的是定时器的初始值51单片机每12个机器周期将定时器的数值++;
当定时器内数据溢出时候产生定时器中断

65536-2000;;;65536为溢出值(0xffff),将初始值设定为65536-2000=63536
则定时次数为 65536-63536=2000

TH0=(65536-2000)/256; //重新赋值 2ms

这样写使程序的可读性变强了,很容易看出时间

再次重新启动。

用C语言实现的,先要定义好定时器的初值,不管你使用多大的晶振,使用51单片机,一般都是12分频出来,也就可以得出一个机器周期,机器周期=12/n(n指晶振频率),假设你要定时的时间为M,那么定时的初值为:M/机器周期=初值;

TH0=(65536-初值)%256;

TL0=(65536-初值)/256;

将(65536-初值)所得的值化成16进制,其高位就是TH0的值,低位为TL0的值,例如用12M晶振做1ms定时计算如下:

机器周期=12/1210^6=1us(微秒)

定时初值=(110^-3)/(110^-6)=1000;

所以:TH0=(65536-1000)%256;

TL0=(65536-1000)/256;

将65536-1000=64536化为16进制为:0xFC18,TH0=0xFC,TL0=0X18;

定好初值后要延迟一秒就定一个延时参数,这里使用1000就行了(定时为1ms)中断程序为:timer0() interrupt 1 // 1ms延时(120MHz)

至于那些书上都有的理论知识我就不说了,就简单的说一下吧,楼主可以想简单点
定时器工作的流程可以按照这个顺序(以51为例用定时器0方式一产生50毫秒的定时)
1、确定使用哪个定时器,使用哪种方式,这一步通过TMOD设置,TMOD的低四位是设置定时器0的,高四位是用来设置定时器1的,其中的M0,M1是用来设置定时器工作在哪种方式,GATE一般用不要设置,C/T是选择计数模式还是定时模式的,如:TMOD = 0X01,就说明定时器0工作在方式1。
2、接下来就要设置定时的时间,用定时器定时50毫秒,可以用这种方式TH0 = (65535 - 50000) / 256,TL0 = (65535 - 50000) % 256;可以这样理解:因为这是定时器的初值,也就是说计数脉冲就是在这个数的基础上向上递增,到达65535后就溢出产生中断,至于为什么是对256取整,和取余的话楼主自己先琢磨吧, 不懂再hi我;
3、第三步就要打开中断了,使用IE寄存器,我一般是对各个位进行单独设置,这样看起来感觉更好,首先打开总中断EA = 1,这一步是所有中断所必须的,然后打开定时器0中断,ET0 =1;
4、这时准备工作都准备好了就要开始启动定时器了,使用TCON寄存器,TR0 = 1,到现在为止就实现了一个50毫秒的定时了;
总结一下:TMOD = 0X01; TH0 = (65535 - 5000) / 256; TL0 = (65535 - 50000) % 256; EA = 1; ET0 = 1; TR0 = 1,至于那个中断函数我就不写了,要注意的是方式0 ,1, 3是不能自动重装的,所以得在中断函数中重新对TH0 ,TL0赋初值,楼主说的那个SCON寄存器就是用于串口的,定时器会用了的话,串口也就会了的,希望能够帮助楼主了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13370963.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-23
下一篇 2023-07-23

发表评论

登录后才能评论

评论列表(0条)

保存