51单片机C语言中delay函数是怎么定义和使用的

51单片机C语言中delay函数是怎么定义和使用的,第1张

delay函数是一般自己定义的一个延时函数。

c语言定义延时函数主要通过无意义指令的执行来达到延时的目的。下面给出一个经典的延时函数。

// 定义一个延时xms毫秒的延时函数

void delay(unsigned int xms) // xms代表需要延时的毫秒数

{

unsigned int x,y;

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

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

}

举一个例子来说明吧比如你要编一个延时50毫秒的子程序,那么步骤如下:

1、查看一下你的硬件环境,比如晶振大小,CPU型号,不用CPU指令的机器周期是不一样的。

2、计算延时需要的机器周期。比如采用12M晶振,CPU采用通用8051,那么一个机器周期为1US,50毫秒为501000=50000US,需要的机器周期=50000/1=50000。

3、试编程,如下:

程序代码 指令时间 总共时间

DELAY50MS: ;2 2

MOV R7,#A ;1 1

DELAY1:

MOV R6,#B ;1 1A

DJNZ R6,$ ;2 2BA

DJNZ R7,DELAY1 ;2 2A

RET ;2 2

所以总时间=2+1+A+2AB+2A+2=5+3A+2AB

4、凑数求A、B

根据2、3得到如下式子:

50000=5+3A+2AB

可以有很多种结果,不过最好是以A尽可能小,B尽可能大为原则,当然不能大于255

我现在凑出A=110,B=225;那么总延时时间=5+3110+2110225=49835。还差165US

5、补齐不够时间

再加一个小循环就OK了,呵呵如下:

MOV R6,#C

DJNZ R6,$

会算了吧,2C+1=165;所以C=82。

现在完整的延时程序出来了,如下:

DELAY50MS: ;2 2

MOV R7,#110 ;1 1

DELAY1:

MOV R6,#225 ;1 1110

DJNZ R6,$ ;2 2225110

DJNZ R7,DELAY1 ;2 2110

MOV R6,#82 ;1 1

DJNZ R6,$ ;2 282

RET ;2 2

很圆满:总的时间50000微妙,也就是50毫秒。这种方式编程,在该硬件环境下可以保证最大误差为1微妙。

一般单片机在c语言中很难得到精确的延时,所以一般对时间要求高的都用计时器中断来做了。如果时间要求不严格可以用for循环来做,你可以实际测试一下,把时间延时到大概一秒左右,然后烧进单片机里运行,比如一个灯亮灯灭的程序,看着灯计数,同时用秒表计时,几个几十次后取平均值就能知道大概时间了。

delay(int t)这个是延时子程序,如果采用20M晶振的话,调用一次延时t毫秒。

display()是数码管动态扫描显示子程序,位控位为P30、P31,段码控制为P1。扫描间隔时间为5毫秒左右。

以上就是关于51单片机C语言中delay函数是怎么定义和使用的全部的内容,包括:51单片机C语言中delay函数是怎么定义和使用的、单片机延时时间程序怎么编程、单片机c语言的延时程序500ms等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9833413.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存