您的位置 首页 FPGA

最简略的51延时

voiddelay_us(unsignedcharus)延时微秒@12M,us最大值255{while(–us);}voiddelay_ms(unsignedintms)延时毫秒@12M,ms{un

void delay_us(unsigned char us) //延时微秒@12M,us最大值255

{

while(–us);

}

void delay_ms(unsigned int ms)//延时毫秒@12M,ms

{

unsigned char i;

while(ms–)

for(i =123; i >0; i–) ;

}

关于第一个延时us的函数,计算办法:us×2+5可完结5~515us的延时,经验证,挺准的。

关于第二个延时ms的函数,传递值的类型可取unsigned int和unsigned char两种类型,当取unsigned int时传递值的规模能够更广一些。for循环中i的取值也能够修正,取不同的值延时也不尽相同。在12M的晶振频率下,用Keil验证的成果如下:

定论:不论传递数为何种的类型,for循环中i取值123时延时差错最小,所以主张取123。从成果中也能够看出当取123时有负误差,取124时有正误差,所以可根据详细使用进行取值。

而关于不同的频率下的取值,就以12M下的123为参阅来取值。譬如用8.0000M的晶振,则取值为123*8/12=82(近似取值)。由于需求这种延时的使用,自身就不需求很高的精度;如果有要求延时精度高的使用时,则需求定时器来完结。

----------------------------------

常用的延时办法(12M晶振)

1、1~4us

_nop()_完结

计算办法:1~4us分别用1~4个_nop()_

2:5~500us

void delay(unsigned char i)

{

while(–i) ;

}

计算办法:i×2+5可完结5~515us的延时

3、10us~2ms

void delay(unsigned char i)

{

for( ;i>0 ;i–) ;

}

计算办法:i×8+10可完结10us~2.050ms的延时

4、2ms~130ms

void delay(unsigned char i,unsigned char j)

{

for( ;j>0 ;j–)

for( ;i>0 ;i–) ;

}

计算办法:(i×2+3)×j+5 us

个人主张:i在里面赋值248,这样延时为0.5ms的倍数(注:该条我没有验证经过,由于生成的代码不是DJNZ的,而是DEC,SUBB之类的)

5、130ms~30s

void delay(unsigned char i,unsigned char j,unsigned char k)

{

for( ;k>0 ;k–)

for( ;j>0 ;j–)

for( ;i>0 ;i–) ;

}

计算办法:((i×2+3)×j+3)×k+5 us

相同能够先把i和j赋值

(注:该条我没有验证经过,由于生成的代码不是DJNZ的,而是DEC,SUBB之类的。当该函数无形参时,行将i,j,k在内部界说时则可满意公式)

再长的延时就没含义了

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/fangan/fpga/258127.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部