keiluvision4中定时器怎么写

keiluvision4中定时器怎么写,第1张

首先设置频率

第一步

在这里插入图片描述

第二步,点击Target,设置频率,之后确定

在这里插入图片描述

代码设置

我的定时时间

TH0 = (65536-922)/256//为T0赋初值,定时1ms

TL0 = (65536-922)%256

1

2

1

2

进入调试

第一步

在这里插入图片描述

第二步,进行复位,清除起始点,使程序从第一步运行

在这里插入图片描述

-------------------------------------------------------------------------可跳过-----------------------------------------------------------------------

若是不清除,程序则会从黄标位置开始

在这里插入图片描述

黄标位置为可设置的起始点

选择自己需要开始的程序位置,点击右键,选择Set Program Counter,设置自己需要的起点

-------------------------------------------------------------------------可跳过-----------------------------------------------------------------------

第三步,设置终止点,选择1s结束位置

选择自己需要开始的程序位置,点击右键,选择Insert/Remove Breakpoint,设置自己需要的终点。也可双击设置或者取消

效果如图

在这里插入图片描述

运行进行调试

第一步,点击运行

在这里插入图片描述

第二步,查看时间,单位s

在这里插入图片描述

设置的是需要的是1s运行到终点位置,如今多了,则需要进行调整。

第三步,计算调整代码

发现,多了0.0124s,多的值是经过1000次累加之后的,也就是每一次多了0.0124ms

晶振频率选择的11.0592MHz

一个机器周期的时间为: a=12/11059200 s

经 1/a=922 个机器周期到 1ms

但此时每过 1ms 便多出 0.0124ms

故需要减少 0.0124*922≈11 个机器周期,才能减少误差

故调整后需要 922-11=911 个机器周期

代码调整为

TH0 = (65536-911)/256//为T0赋初值,定时1ms

TL0 = (65536-911)%256

1

2

1

2

此时的时间变为如图所示,误差大大减小。

即使你的初值是对的,你这样写也是比实际慢上一些的。因为CPU响应中断是需要时间的,这时计数器又计过好几个数了,还有你赋值的这两个代码也要花时间的!!如果要精确地在中断中给T0赋初值应该是“你现在的初值+

中断响应时间

+

到设置初值代码执行完的时间”,你可以用KEIL分步调试一下,看下程序从进中断到你赋初值所花的时间,计算出“中断响应时间

+

到设置初值代码执行完的时间”然后算出把正确的初值赋值给T0就OK了。

还有种办法是用定时器的自动重装模式,这个比较精确,不需要想用定时器溢出中断这么麻烦,还要用板子调试计算从进中断到你赋初值所花的时间,因为使用这个模式的时候,计数器计数到TOP值,也就是你设定的最大值时,单片机硬件会自动清零计数器,然后从0开始重新开始计数,而不需要我们继续赋初值。

或者不用定时,你外接个时钟芯片如DS1302也可以的。

#include<reg52.h>

sbit output=P0^0

void init()

{    

TMOD|=0x10 //设置定时器1工作方式1

TH1=(65535-1000)/256 //定时器1设定初始值  1ms中断一次即频率500Hz

TL1=(65535-1000)%256

EA=1 //开总中断

ET1=1 //开定时器1中断

TR1=1 //启动定时器1

}

void t1() interrupt 3

{

TH1=(65535-1000)/256

TL1=(65535-1000)%256

output=!output

}

void main()

{

init()

while(1) 

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存