C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振核数为12MHz的单片机猛碧为例,晶振为12MHz即一个机器周期为1us。
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++); } } 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 { for(j=0;j<200;j++); for(j=0;j<102;j++); } } 拓展资枝氏举料 C语言是一门通用计算机编程语言,应用广泛。C语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。 尽管C语言提供了许多低级处理的功能,但仍然保持着良好跨平台的特性,以一个标准规格写出的C语言程序可在许多电脑平台上进行编译,甚至包含一些嵌入式处理器(单片机或称MCU)以及超级电脑等作业平台。
delay函数是一般自己定义的一个延时函数。
C语言定义延时函数主要通过无意义指令的执行来达到延时的目的。
关于单片机C语言的精确延时,网上很多都是大约给出延时值没有准确那值是多少,也就没有达到精确高的要求,而本函数悉数克服了以上缺点,能够精确计数出要延时值且精确达到1us,本举例所用CPU为STC12C5412系列12倍速的单片机,只要修改一下参数值其它系例单片机也通用,适用范围宽。
ms=1时,第一个for循环进入,然后在第二个for循环中执行100次
再回到第一个for循环中进睁禅首行第二次循环.
就这样
你可以进入编辑器,添加断点,自行查看代码执行过袭闷程
这个延时关亩宴局旁键看使用的晶振多大,比如12M晶振for(j=0;j<120;j++);大概延时1毫秒,11.0592M晶振那么for(j=0;j<110;j++);迅腊银延时1毫秒,你这里的for(j=0;j<100;j++);延时1毫秒的话,晶振应该是10M,不太常见哟,特别是在单片机方面。
C的谈链脊话其实时间没有办法完全定性地计算的
如果非得精确的话只能使用定时器了,或者汇编的也行
不过时间要求精度不是很高的话使用下面的代码就行了
当时使用示波器把时间完全调含渗准的,65536ms范围内还是比较准的,已经可以满足通常的要求了:
#include "reg51.h" //头文件包含
//宏定义
#define uint unsigned int
#define uchar unsigned char
void delay(uint ms) // 毫秒级延时(AT89C52 @ 11.0592MHz)
{
uint ti;
while(ms--)
{
for(ti=0;ti<112;ti++){}/唤丛/112
}
}
调用方式如下:
delay(400); //开机延时400ms
够详细了吧?!
void delay(unsigned int x) //延时 x ms
{
unsigned int i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
延时1ms 即为使x=1;
这程序延时约1ms(x=1时用keil测出来约链斗 0.96831272ms,近似1ms),用C语言很难做到准确的1ms。注意晶振为11.0592MHZ的时候宏唤友用~ 晶振蔽槐为12MHZ时 把 i=120 近似值1ms