BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / circuit / #17282同步于 2011/5/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖

C51里算中断时间的白白疑惑

Paifeiqi
2011/5/20镜像同步6 回复
系统晶振频率是11.0592MHz,想用定时器中断确定1s的时间,书上例题的中断服务程序是: void T0_time() interrupt 1 { TH0=(65536-45872)/256; TL0=(65526-45872)%256; num++; if(num==20) { num=0; led1=~led1; } } 其中计算TH0和TL0初值的方法是N=50000/(12*1/11059200)=45872。 实际下到板子和调试的时间,都显示中断20次的时间是1.4s左右。不明白为神马。。。虽然问题很白痴,还是求解释。。。
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
ghy机器人#1 · 2011/5/20
大约是每次进入中断后写中断寄存器数值65526-45872, TH0为高位,TL0为低位。 将NUM累计计数。 数到20时LED变状态。 你要改时间可以改写进去的值或者计数次数, 具体去看手册吧。
cordialz机器人#2 · 2011/5/20
你再重新算一下50000/(12*1/11.0592)吧...结果应该是46080 你写的是45872 不知道是不是这个问题 (精确计时建议采用汇编 因为调入子函数也是消耗时钟周期的)或者是你晶振质量不好? 你用的是普通的51么?不是什么改进型吧.....那个公式应该对应的是12T的普通51单片机(干嘛不用12M晶体,还好计算,串口通讯9%的错误率其实影响不大的....)
Paifeiqi机器人#3 · 2011/5/20
我不明白的是,根据书上面说,上面代码控制二极管1s闪一次,但实际时间是1.4s,这个让我不解,是计算有问题,还是原理有问题
Paifeiqi机器人#4 · 2011/5/20
【 在 cordialz 的大作中提到: 】 : 你再重新算一下50000/(12*1/11.0592)吧...结果应该是46080 你写的是45872 不知道是不是这个问题 (精确计时建议采用汇编 因为调入子函数也是消耗时钟周期的)或者是你晶振质量不好? 你用的是普通的51么?不是什么改进型吧.....那个公式应该对应的是12T的普通51单片机(干嘛不用12M晶体,还好计算,串口通讯9%的错误率其实影响不大的....) : -- 昨天晚上试过改成46080也不行,时间偏差还是很大。。我用的TX-1C那个,STC的芯片,配教材,板上面的晶振就是11.0592,我上网查比人的代码用的都是12M,这点我很郁闷。
cordialz机器人#5 · 2011/5/23
换12M的晶体吧.....计算起来比较容易些....110592的好处就是9600bps的串口通讯丢包率是0....
Paifeiqi机器人#6 · 2011/5/24
【 在 cordialz 的大作中提到: 】 : 换12M的晶体吧.....计算起来比较容易些....110592的好处就是9600bps的串口通讯丢包率是0.... : -- 再求解释,附上调试信息 http://img181.poco.cn/mypoco/myphoto/20110524/23/5718903420110524231906062.jpg