标题: 单片机中断程序疑问 [打印本页]

作者: xnysfh    时间: 2023-6-26 09:33
标题: 单片机中断程序疑问
void InterruptTimer0() interrupt 1
{
TH0 = 0xFC; //重新加载初值
TL0 = 0x67;
cnt++; //中断次数计数值加 1
if (cnt >= 1000) //中断 1000 次即 1 秒
{
cnt = 0; //清零计数值以重新开始下 1 秒计时
flag1s = 1; //设置 1 秒定时标志为 1
}
LedScan();
}
问:这里的LedScan();是920us刷新一次吗?问:为什么fc67习惯说是1ms?



作者: mtdzok    时间: 2023-6-26 10:19
初值是根据晶振频率计算的,首先确定使用多大的晶振,是11.0592还是12M还是......
作者: xnysfh    时间: 2023-6-26 10:33
mtdzok 发表于 2023-6-26 10:19
初值是根据晶振频率计算的,首先确定使用多大的晶振,是11.0592还是12M还是......

11059200

作者: munuc_w    时间: 2023-6-26 10:39
1. 为什么是1ms,自己看书去。
2. 中断服务程序应该简洁,追求执行时间最短的指导思想,LedScan();最好不要放在这里。
作者: yzwzfyz    时间: 2023-6-26 10:44
【LedScan()】,在【void InterruptTimer0() interrupt 1】中只运行了一次。
所以【void InterruptTimer0() interrupt 1】多久运行一次,【LedScan()】就多久运行一次。
也即取次于你的中断时常数设定。而时基又是晶振频率。所以你看着办吧。

作者: lkc8210    时间: 2023-6-26 11:11
说的出920us就代表你懂得TH0 = 0xFC;TL0 = 0x67;的意义
但还差一点的,就是0xFC67加到0x10000溢出的时间计算
0x10000 - 0xFC67 = 921
THTL每加1的时间间隔是基于晶振频率
12Mhz是1us, 而11.0592Mhz就是12/11.0592 = 1.085us
921 x 1.085 = 999.35 差不多是1ms
作者: xnysfh    时间: 2023-6-26 13:17
lkc8210 发表于 2023-6-26 11:11
说的出920us就代表你懂得TH0 = 0xFC;TL0 = 0x67;的意义
但还差一点的,就是0xFC67加到0x10000溢出的时间计 ...

参考了6楼的讲解,已解决问题,谢谢大家参与讨论
作者: real8799190    时间: 2023-7-3 13:45
根据提供的代码,可以看出在 Timer0 的中断函数 InterruptTimer0() 中调用了函数 LedScan()。由于没有给出 LedScan() 的具体实现代码,无法确定其刷新频率。因此,无法准确回答 "LedScan(); 是 920us 刷新一次吗?" 这个问题。

至于为什么 TH0 = 0xFC 和 TL0 = 0x67 常被称为 1ms,是因为这是设置 Timer0 初值的方式,在一些常见的时钟频率和定时器设定下,可能导致定时器每溢出一次需要 1ms 的时间。

具体来说,当使用 11.0592MHz 的晶振作为时钟源,并将定时器 T0 设置为模式 1(16位定时/计数模式),以 12 分频(Prescaler)的方式进行计数时,初值 TH0 = 0xFC,TL0 = 0x67 可以使定时器在溢出前计数满 1000 次,而每次计数需要 1ms。
作者: rayin    时间: 2023-7-5 08:03
中断服务函数里面,不要调用ledscan这种耗时长的子程序.




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1