哥们你想多了吧!
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。。。
追答好吧!我没用过这款单片机!那你还得慢慢琢磨!