原创 单片机软件延时简单测试

2009-10-31 15:42 2124 5 5 分类: MCU/ 嵌入式

以下测试是在keil软件中的观察到的数据,仅供参考。


/******************************************************************************


* 名:void delay2(unsigned char i)


*功能描述:0510微秒延时函数


*函数说明:实现几个微秒的延时,可直接用_nop_()函数,在11.0592M晶振下每


执行一条用时为1.091.08(实际为1.091.08交替出现)。注意,在调用此函数


时先包含:#include<intrins.h>10us以下用此函数延时误差大,可用_nop_()函数


如下测试均在11.0592M的晶振下


delay2(1):延时约2us,实际为429.69-422.09=5.60us


可用2_nop_():延时约2us,实际为424.26-422.09=2.17us


delay2(2):延时约4us,实际为431.86-422.09=9.77us


可用4_nop_():延时约4us,实际为426.43-422.09=4.34us


delay2(3):延时约6us,实际为434.03-422.09=11.94us


可用6_nop_():延时约6us,实际为428.60-422.09=6.51us


delay2(4):延时约8us,实际为436.20-422.09=14.11us


可用条_nop_():延时约8us,实际为430.77-422.09=8.68us


10us以上的延时调用此函数延时间约为2*i(us),误差慢慢减小


delay2(10):延时约20us,实际为449.22-422.09=27.13us


delay2(50):延时约100us,实际为536.02-422.09=113.93us


delay2(100):延时约200us,实际为644.53-422.09=222.46us


delay2(200):延时约400us,实际为861.55-422.09=439.44us


delay2(255):延时约510us,实际为980.90-422.09=558.81us


再增大i将溢出


测试说明:测试上面用如下程序,422.09us为进入到main函数中开始测试的时间,


试时将用不到的函数注释掉


#include<reg52.h>


#include<intrins.h>


#define uint unsigned int


#define uchar unsigned char


void delay2(uchar i)


{


         while(--i);


}


void delay(uint z)


{


         uint x,y;


         for(x=z;x>0;x--)


                   for(y=115;y>0;y--);


}


void main()


{


         delay2(255);


         delay(66535);


         _nop_();


         _nop_();


         _nop_();


         _nop_();


         _nop_();


         _nop_();


         _nop_();


         _nop_();


         while(1);


}


******************************************************************************/


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


void delay2(uchar i)


{


         while(--i);


}


/*****************************************************************************/


 


 


/******************************************************************************


* 名:void delay(uint z)


*功能描述:065535毫秒延时函数


*函数说明:在11.0592M的晶振下


delay(1):延时约1ms,实际为1.44875-0.42209=1.02666ms


0.42209ms为进入到main函数中开始测试的时间)


delay(50):延时约50ms,实际为51.05469ms


delay(100):延时约100ms,实际为101.67318ms


delay(1000):延时约1000ms,实际为1012.84576ms


delay(50000):延时约50000ms,实际为50619.56055ms


delay(65535):延时约65535ms,实际为66346.92166ms


再往上增,就出错了,延时长短是其补码对应大小如:


delay(66535):延时约1000ms,实际为1011.80339ms


******************************************************************************/


void delay(uint z)


{


         uint x,y;


         for(x=z;x>0;x--)


                   for(y=115;y>0;y--);


}


/*****************************************************************************/

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
5
关闭 站长推荐上一条 /1 下一条