单片机延时1ms程序

  • 格式:doc
  • 大小:20.50 KB
  • 文档页数:3

精确的C语言延时子程序表/自己测试,11.0592M晶振 ms延时程序,绝对精确
51单片机,需要用MS 延时程序的时候才发现网上的好多程序不好用,
下面这个忘记从哪里找的,但是已经相当精确,keil亲测。
=======================================================
/*--------------------ms延时函数-----------------------*/
void delay_ms(unsigned int ms_number) // ms延时函数 (AT89C51 @ 11.0592MHz)
{
unsigned int i;
unsigned char j;
for(i=0;i{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
/--------------------------------------------------------------------
用法:在参数传入时填上几就是几毫秒啦
比如,想延时100ms,就把ms_number赋值为50

×××××××××××××××××××××××××××××××××××××××××××××
=============================================
以下为原来转载的资料
=============================================
文章转自 Proteus仿真社区 作者:liaoguobao00
未作验证,如有问题请和原作者联系:lsygrzzh@yahoo.com.cn
=============================================
用C语言写出来程序非常的简练,它是一种模块化的语言,一种比汇编更高级的语言,但是就是这样一种语言也还是
有它不足之处:它的延时很不好控制,我们常常很难知道一段延时程序它的精确延时到底是多少,这和汇编延时程序
没法比。但有时后写程序又不得不要用到比较精确的延时,虽然说可以用混合编程的方式解决,但这种方式不是每个
人都能掌握,且写起来也麻烦。所以,通过测试我给大家提供一个延时子程序模块,并以此给一个出我们经常用到的
延时的数据表格。(注意:表格中的数据只适合我的延时模块,对其他的延时程序不适用,切忌!!!!!!!!别到时候延
时不对来骂我)

延时模块:其中问号代表要填的数,要延时多少,到表格中去找数据,然后填上就OK!切忌3条FOR语句不能颠倒
顺序

void Delay()
{
unsigned char a,b,c;
for(a=0;afor(b=0;bfor(c=0;c}
数据表如下
/******************************************************************************************************
****************/
延时时间 a的值 b的值 c的值 延时误差(us)
10us 1 1 1 -0.5
20us 1 1 8 0
30us 1 1 15 +0.5
40us 2 1 9 0
50us 1 1 28 0
60us 1 1 35 +0.5
70us 1 1 42 +1
80us 1 1 48 0
90us 1 1 55 +0.5
100us 1 1 61 -0.5
200us 1 1 128 0
300us 3 1 63 +1.5
400us 2 1 129 0
500us 5 1 63 +0.5
600us 6 1 63 0
700us 7 1 63 -0.5
800us 1 3 175 +0.5
900us 9 1 63 -1.5
1ms 1 3 219 -1.5
2ms 2 3 220 +3
3ms 3 3 220 +3
Xms X 3 220 +3
(X的范围为2到255)
基本上我们平时用到的延时都在这里了,每种延时的误差都很小,最大也不过3us,有的甚至没有误差,已经很精确了,
如果想延时1秒钟,你可以连续调用延时250ms的程序4次,总共延时误差12us,这样的误差已经不算误差了,用汇
编语言编写还达不到这个程度。

现在你不再为延时不精确担忧了,参照表中的数据写延时,想延时多少就能延时多少。
再次重申:此表格是根据我的延时模块编写,这也是大多数朋友都习惯用的一个模块,如果你用其他模块或是改动了
我的模块,延时都不准的,不信大家可以试试!!!
for循环编写延时函数的方法
2011-01-21 12:55:47 来源:互联网
很多初学者对于程序中ms级延时函数的编写方法比较疑惑,其原理和方式虽然简单,但是却没有相关资料。这里用一
个例程详细介绍一下。
过程参考如下:
在编译器下建立一个新项目,也可以利用已有项目。此过程中需要注意,单片机晶振的选择,因为for循环里指令
的执行时间和晶振有直接关系,本例中晶振使用11.0592M。

编写一段关于延时的函数,主要利用for循环,代码如下:
void delay_ms(unsigned int ms)
{
unsigned int i;
unsigned char j;
for(i=0;i{
for(j=0;j<200;j++);
for(j=0;j<102;j++);
}
}
其中ms是输入参数,如果输入1,就是要求程序延时1ms。
j变量是调整程序运行的时间参数。调整j的数值,使1次循环的时间在1ms。
将此程序编译通过,然后利用软件仿真,调整时间。
两次时间差就是延时函数使用的时间,如果与1ms相差比较多,用户可以调整j参数的值,使延时时间尽量接近1ms。
如增大j的值for(j=0;j<105;j++);
此方法得出延时函数,在晶振不同的情况下,延时时间会不准。另外这种方法不是完全精确的延时,所以不要太
深研究误差的问题。软件调试结果,这个程序的延时时间为:1.01779ms,一般的单片机系统中都可以应用
(本文转自电子工程世界:http://www.eeworld.com.cn/mcu/2011/0121/article_2576.html)