stc12c5a60s2单片机,11.0592MHz晶振。5us和5ms精确延时函数

如题所述

哥们你想多了吧!
11.059200MHz晶振下,一个机器指令周期 t=((1*12)/11059200) = 1.0850694us,也就是一个空指令也要1.0850694us,所以5us的延时只能是5个空指令周期,并且误差很大,写成延迟函数误差更大。
在程序中直接:
_NOP_();_NOP_();_NOP_();_NOP_();_NOP_();
这就延时了 5*1.0850694us。
至于5ms的话可以使用定时器,但是误差较大:
void delay_5ms(void)
{
TMOD = 0x01;

TH0 = 0x12;

TL0 = 0x00;

TR0 = 1;

while(TF0 == 0);

TF0 = 0;

TR0 = 0;

}
执行该函数时间会略大于5ms,略大于的部分主要是:
1、进入和退出函数的入栈和出栈操作会占用几个机器周期,具体的自己可以算。
2、初始化定时器和停止定时器也需要几到十几个机器周期那样,具体自己调试算一下。
整体来说,这样误差会在0.1%--1%那样,你可以根据情况来适当的缩小TH0和TL0里面的值。追问

这款单片机默认情况是12T还是1T

跟延时有关么

追答

好吧!我错了,这是1T单片机。
但是5us写成一个延迟函数误差一样大,看你想要精确到什么程度,只要是写成函数,调用和退出函数都是需要一定时间,这个根据实际情况来算。
5ms的延时误差就比较小了,还是和上面的程序一样,只要适当的更改TH0和TL0的值即可。
1T还是12T和延时肯定有关系啊,1T处理速度快,延时更准确,12T处理速度相对慢一下,延时误差稍大。

追问

好像这个单片机需要设置aux寄存器才能为1T。。默认12T。。。

追答

好吧!我没用过这款单片机!那你还得慢慢琢磨!

温馨提示:内容为网友见解,仅供参考
无其他回答
相似回答