加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

c51的精确延时  

(2013-12-13 21:53:59)
分类: 程序语言学习

 用c语言为单片机编程无疑十分节约时间,可在很短的时间内开发出较高效的代码,对于程序的维护和扩充也较汇编语言方便许多。

       但c语言也有它的不足之处,那就是在时间的精确控制上。要想用c实现精确的延时,只能把c的函数编译成汇编语言,然后按照汇编语言计算其执行时间。本人就按照这种方法,编写了几个51单片机的c语言精确延时函数。

 

注:1.编译软件为"Keil uVision3"(Keil uVision2也试用)。用其他编译软件的话就不准了。

       2.需要包含头文件

       3.所有函数的延时时间都是在12Mhz晶振下计算的,如用其他晶振需进行换算。

       4.函数的执行时间为“函数的参数”乘以精确到的时间。例如delayms(unsigned char n)函数,其精确度为1ms,如果写入语句delayms(4),那就是延时4ms。

       5.计算出来的延时时间不包括函数调用与返回的时间。如果函数的精确度较高,且参数较小,那么实际延时时间就可能与计算的时间差很远。

 

(1)精确到2us的延时(12MHz)

void delayus(unsigned char n)  

{ while(--n);

}

 

(2)精确到100us的延时(12MHz)

void delay100us(unsigned char n)   

{ unsigned char i;
  for(;n;n--)
   { _nop_();
     for(i=46;i;i--);
   }
}

 

(3)精确的半毫秒延时函数(12MHz)

void delay1_2ms(unsigned char n)

{ unsigned char i;
  for(;n!=0;n--)
   { _nop_();
     for(i=246u;i!=0;i--); 
   }
}

 

(4)精确的毫秒延时函数(12MHz)

void delayms(unsigned char n) 

{ unsigned char i;
  for(;n!=0;n--)
   { for(i=248u;i!=0;i--);
     for(i=248u;i!=0;i--);
   }
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有