以下测试是在keil软件中的观察到的数据,仅供参考。
/******************************************************************************
*函 数 名:void delay2(unsigned char i)
*功能描述:0到510微秒延时函数
*函数说明:实现几个微秒的延时,可直接用_nop_()函数,在11.0592M晶振下每
执行一条用时为1.09或1.08(实际为1.09与1.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)
*功能描述:0到65535毫秒延时函数
*函数说明:在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--);
}
/*****************************************************************************/
文章评论(0条评论)
登录后参与讨论