第一步
在这里插入图片描述
第二步,点击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)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)