stc12c5a60s2单片机,11.0592MHz晶振。5us和5ms精确延时函数
1个回答
展开全部
哥们你想多了吧!
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里面的值。
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
跟延时有关么
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询