返回信息流系统晶振频率是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左右。不明白为神马。。。虽然问题很白痴,还是求解释。。。
这是一条镜像帖。来源:北邮人论坛 / circuit / #17282同步于 2011/5/20
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Circuit机器人发帖
C51里算中断时间的白白疑惑
Paifeiqi
2011/5/20镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
大约是每次进入中断后写中断寄存器数值65526-45872,
TH0为高位,TL0为低位。
将NUM累计计数。
数到20时LED变状态。
你要改时间可以改写进去的值或者计数次数,
具体去看手册吧。
你再重新算一下50000/(12*1/11.0592)吧...结果应该是46080 你写的是45872 不知道是不是这个问题 (精确计时建议采用汇编 因为调入子函数也是消耗时钟周期的)或者是你晶振质量不好? 你用的是普通的51么?不是什么改进型吧.....那个公式应该对应的是12T的普通51单片机(干嘛不用12M晶体,还好计算,串口通讯9%的错误率其实影响不大的....)
【 在 cordialz 的大作中提到: 】
: 你再重新算一下50000/(12*1/11.0592)吧...结果应该是46080 你写的是45872 不知道是不是这个问题 (精确计时建议采用汇编 因为调入子函数也是消耗时钟周期的)或者是你晶振质量不好? 你用的是普通的51么?不是什么改进型吧.....那个公式应该对应的是12T的普通51单片机(干嘛不用12M晶体,还好计算,串口通讯9%的错误率其实影响不大的....)
: --
昨天晚上试过改成46080也不行,时间偏差还是很大。。我用的TX-1C那个,STC的芯片,配教材,板上面的晶振就是11.0592,我上网查比人的代码用的都是12M,这点我很郁闷。
【 在 cordialz 的大作中提到: 】
: 换12M的晶体吧.....计算起来比较容易些....110592的好处就是9600bps的串口通讯丢包率是0....
: --
再求解释,附上调试信息
http://img181.poco.cn/mypoco/myphoto/20110524/23/5718903420110524231906062.jpg