51单片机c语言延时函数 Void delay 1ms(unsigned int ms){un

51单片机c语言延时函数 Void delay 1ms(unsigned int ms){un,第1张

C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。

void delay_ms(unsigned int ms_number) // ms延时函数 (AT89C51 @ 110592MHz)

{

unsigned int i;

unsigned char j;

for(i=0;i<ms;i++)

{

for(j=0;j<200;j++);

for(j=0;j<102;j++);

}

}

void Delay()

{

unsigned char a,b,c;

for(a=0;a<;a++)

for(b=0;b<;b++)

for(c=0;c<;c++);

}

void delay_ms(unsigned int ms)

{

unsigned int i;

unsigned char j;

for(i=0;i<ms;i++)

{

for(j=0;j<200;j++);

for(j=0;j<102;j++);

}

}

C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。

1、比较死板的方法是自己写一个delay函数,里面用for,while等做一些循环,下面是1ms的延时函数

void

delay1ms(void)

{

unsigned

char

i,j;

for(i=0;i<10;i++)

for(j=0;j<33;j++);

}

具体算法是//(3j+2)i=(3×33+2)×10=1010(us),但精确度不高,如果想准确点可以调节相应的参数用示波器来实

现,上面的函数适用于程序简单,对时间性要求不高,如:点led灯,单个按键 *** 作等等。

2,就是用定时器中断里面设定标志位来产生延时的方法,比如你可以把定时器设定为每1ms进一次中断,在中断里面

把一个标志位(如flag)置一

当你需要1ms延时的时候你可以先初始化定时器,然后查询标志位是否置一,置一则执行if后面的语句,即if(fla{};

当你需要10ms延时时,你可以把flag设置为uchar,中断里面flag++;外面查询用if(10==flag){};

以此类推,上面的方法精确度高适用地方。

自己写延时是很麻烦的

因为CPU有自己的时钟中断,如果你的循环在最后一次执行的时候,CPU发生了中断,那么你能保证就刚好是X120吗

CPU发生的中断,系统会调用swapcontext函数进行线程切换(等下一个线程把运行权限交回来的时候(20ms),都不知道运行了多久了已经运行了成千上万条指令了)

除非把中断关闭了但是在三环下面又不能关闭时钟中断还是调用系统的sleep好了,这样要保险一点

两种方案,简单粗暴的直接用for循环:

for(int i=0;i<1000000000;i++);

循环次数自行调试,试出大概的值就行

第二种,精准延时,通过SysTick系统计时器来实现

6M晶振,方式2定时1mS的时间太长,不能直接实现,(最大定时应该是512uS)下面是500uS定时示例程序,可在中断函数中计数每2次得1S。

void Timer1Init(void) //500微秒@6000MHz

{

AUXR &= 0xBF; //定时器时钟12T模式

TMOD &= 0x0F; //设置定时器模式

TMOD |= 0x20; //设置定时器模式

TL1 = 0x06; //设置定时初值

TH1 = 0x06; //设置定时重载值

TF1 = 0; //清除TF1标志

TR1 = 1; //定时器1开始计时

}

void delay1ms(unsigned int ms)

{

unsigned int i,j;

for(i=0;i<ms;i++)

for(j=0;j<100;j++);

}

抛开软件延时是否准确而言,这段代码要配用原设计的晶振频率(貌似为12MHz),如果需要延时1ms,则ms=1,那么单片机就运行一遍for(j=0;j<100;j++);当j=99运行完成后,程序在这里正好空转了100圈而耽搁了1ms的时间,如果再追究为什么,你就要看教科书了,不同的编译器也会有不同的情形,就普通C51单片机而言,在12MHz晶振时一个机器周期为1微妙,对于keil编译的代码运行而言,一条判断语句(i<1) 4个机器周期,一条自增语句(i++) 1个机器周期,一条判断语句(i<1) 4个机器周期,将所有代码的运行时间累加起来就是延时时间,至于最终的延时时间是否准确,可以通过编译软件相关窗口查看,至于怎样查看,请移步百度网页搜索,就不在这里耽搁时间了。

以上就是关于51单片机c语言延时函数 Void delay 1ms(unsigned int ms){un全部的内容,包括:51单片机c语言延时函数 Void delay 1ms(unsigned int ms){un、延时子程序实现原理、用C语言编写1ms延迟子程序,不明白for (j=0;j<120;j++),求助大大们等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://www.outofmemory.cn/zz/9281219.html

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

发表评论

登录后才能评论

评论列表(0条)

保存