用C语言编写1ms延迟子程序,不明白for (j=0;j<120;j++),求助大大们

作者&投稿:屈怪 (若有异议请与网页底部的电邮联系)
在单片机编程中,12M晶振,延时1ms,常用for(i=0;i<120;i++);谁能帮我解释一下,为什么这个语句就是1ms?~

这个是for循环是一个软件延时,意思就是单片机执行for循环耗费的时间大约在1ms左右,并不准确的,这个for循环没有人能计数出来单片机在执行它能耗费多少机器周期,都是通过仿真看到的。

这个for循环也是别人在仿真时候测试CPU执行空i--指令耗费大约在1ms.

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<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)以及超级电脑等作业平台。

void delay1ms(int x)//延迟函数开始
{
int i,j;
for (i=0;i<x;i++) //计数x次,延迟x 1ms
for (j=0;j<120;j++); //计数120次,延迟1ms
}
这是一个for循环嵌套,每执行一次第一个for语句,那么第二个for语句要执行120次
for (j=0;j<120;j++); 就是没执行一次第一个for循环,就令 j =0,再判断是否 j 满足循环条件(这里就是判断是否 j 小于120)如果满足就继续循环,如果不满足就跳出循环。

自己写延时是很麻烦的.
因为CPU有自己的时钟中断,如果你的循环在最后一次执行的时候,CPU发生了中断,那么你能保证就刚好是X*120吗?
CPU发生的中断,系统会调用swapcontext函数进行线程切换.(等下一个线程把运行权限交回来的时候(20ms),都不知道运行了多久了.已经运行了成千上万条指令了.)
除非把中断关闭了.但是在三环下面又不能关闭时钟中断.还是调用系统的sleep好了,这样要保险一点.

可以设置for(a;b;c){ }(注:如果for循环里面为空的话{}可以省略),进入for循环后第一步执行a,之后执行b,满足条件b的话进入循环,执行{}内容后跳到c,然后再回到b判断是否满足条件,满足的话再执行{}内容回到c,依次循环直到不满足b条件为止跳出for循环。for循环中首先第一步使j的值为0,然后进入循环,本例为空所以直接执行j++,j自加后便判断j是否小于120,满足的话再执行for循环里面的空语句,又跳到执行J++;依次执行 直到j不满足<120为止跳出循环结束。

因为每个指令执行都需要时间,大概算出来120次差不多1ms

因为每做一次i++或者j++都是需要时间的,因此可以通过x次“++”运算使得这段时间恰好为1ms。如果linux下可以利用gcc选项查看运行时间


2051单片机C语言编写延时器
include <REG2051.H> \/***1ms延时***\/ void delay(unsigned char ms){ unsigned char x;for(;ms>0;ms--) \/\/ms不等于零,ms减1 for(x=244;x>0;x--); \/\/x不等于零,x减1 } void main(){ delay(20); \/*调用20ms延时;参数等于多少,就延时多少ms*\/ } ...

C语言用for语句要设置1MS延时,为什么是500*121?
这个取决于您cpu的运算速度、编译器编译出来的执行效率。您换台电脑就不是500*121了。一般1MS延时用Sleep(1),但它也不够精确,在高精度时钟下相对好些,低精度时钟会在10-55MS之间。还有个更精确的办法是取CPU时钟频率,计算1MS的cpu循环数,然后禁止当前cpu核心接受中断,用汇编循环让cpu运行1MS。

51单片机中,写个延时函数,延时1ms,该怎么写,为什么?
用汇编语言写可以精确计算,但有时想拼出整数的ms或10ms也不容易,计算方法如下图说明:而C语言靠经验和实验得来的,如下面程序 如果不准(与晶振频率有关),调K的值,,软件仿真查看,直到大致准确,想更精确用定时器 void delay(unsigned char i) \/\/延时程序{ unsigned char i,k;for(j=i;j...

用C语言编程如何计算延时时间?
这怎么是延时1ms的程序?k不一样延时也不一样。而这种靠执行指令延时的程序的延时里昂:1.可以通过查看她的反汇编代码来分析得到。2.也可以通过定时计数器的获得。执行前从0开始计数启动定时器,然后以一定参数k调用delay,在返回后检查定时器的计数值 t。t = tc + k t0,tc是任何一次调用都具有的...

C语言延时程序编程
Delay(unsigned int uDelay) { while ( uDelay-- ); } -在主程序中用一个GPIO测试,如:SetGPIOHigh(); Delay(1000); SetGPIOLOW();-用示波器测量该GPIO波形及频率 -调整Delay函数的调用值,可以用变量,在调试时实时修改变量值,找到延时1毫秒的值,把Delay函数改名为Delay1ms,之后调用这个函数...

找一个单片机汇编语言编写的延时1ms的子程序
多简单的小程序呀:TIME1MS:MOV R6, #2 TIME1:;延时498uS MOV R7, #248 DJNZ R7, $ ;R7的为0时,程序向下运行,否则继续减 ;DJNZ R6, TIME1 ;加上此命令后,每个小周期时间为500uS ;运行两周为1MS,再加上最前面的MOV R6那条指令,就是1.002MS RET 此程序实现的是1.002MS的定时,当然...

...写一个大概延时1MS的子程序,应该怎样写?(用C语言)
void delay(uint n){ uint i,j;for(i=n;i>0;i--){ for(j=110;j>0;j--);} } 当n=1是延时大约是1ms,就是说n等于都少就延时多少ms,当然n的值不超过uint的最大值。头文件下请定义宏 define uchar unsigned char define uint unsigned int ...

哪位高手知道 单片机精确延时1秒得C语言子程序 谢谢了
下面几个是单片机的延时程序(包括asm和C程序,都是我在学单片机的过程中用到的),在单片机延时程序中应考虑所使用的晶振的频率,在51系列的单片机中我们常用的是11.0592MHz和12.0000MHz的晶振,而在AVR单片机上常用的有8.000MHz和4.000MH的晶振所以在网上查找程序时如果涉及到精确延时则应该注意晶振的...

怎么样用C语言实现精确延时
要自己构造,步骤1,检查单片机的说明书,知道执行一条指令要多少时钟周期,2, 12M的时钟频率就是一个始终周期83.3ns,3,你要1毫秒,就是要延迟12000个时钟周期,做一个For循环,在里面做4000次加法运算就可以了(假设你的单片机一个指令用一个时钟)...

单片机外接24M的晶振,1ms的基准延时函数用C语言怎么写?
定时器T0 工作方式1 晶振频率24MHz 定时器最大定时时间(us):32768 定时器最小定时时间(us):0.5 【1ms精确定时C51代码】void T0_init(void) \/\/定时器初始化 { TMOD |= 0x01;TH0 = 0xf8; \/\/设置定时器计数初值,定时1000us TL0 = 0x33;IE |= 0x82; \/\/打开总中断...

满洲里市13583456217: 用C语言编写延时0.001ms程序 -
周扶瑞达: #include <stdlib.h> void main(){ sleep(1); /* 延迟1ms */ }

满洲里市13583456217: 求一个1ms的单片机C语言延时程序 -
周扶瑞达: void delay(char x) { unsigned char a,b,c; for(c=x;c>0;c--) for(b=38;b>0;b--) for(a=130;a>0;a--);} 学过标准C就知道了,char 和int 是可以相...

满洲里市13583456217: 我的单片机用的11.0592M的晶振,想写一个大概延时1MS的子程序,应该怎样写?(用C语言)
周扶瑞达: void delay(uint n) { uint i,j; for(i=n;i>0;i--) { for(j=110;j>0;j--); } } 当n=1是延时大约是1ms,就是说n等于都少就延时多少ms,当然n的值不超过uint的最大值. 头文件下请定义宏 #define uchar unsigned char #define uint unsigned int

满洲里市13583456217: 找一个单片机汇编语言编写的延时1ms的子程序 -
周扶瑞达: 多简单的小程序呀:TIME1MS: MOV R6, #2 TIME1: ;延时498uS MOV R7, #248 DJNZ R7, $ ;R7的为0时,程序向下运行,否则继续减 ; DJNZ R6, TIME1 ;加上此命令后,每个小周期时间为500uS ;运行两周为1MS,再加上最前面的MOV R6那条指令,就是1.002MS RET此程序实现的是1.002MS的定时,当然这当中不算主程序调用此延时程序时现场保护的时间,即压栈和出栈的时间

满洲里市13583456217: 单片机外接12M的晶振,1ms的基准延时函数用C语言怎么写? -
周扶瑞达: /*----------------------------------------------- 名称:delay1ms() 功能:延时1ms 晶振:12MHz 机器周期1us 时间计算:t=2+1+995+2=1000us =1.000ms-----------------------------------------------*/ void delay1ms(void) //延时1ms子程序 { unsigned char i,j; for(i=5...

满洲里市13583456217: 怎么用C语言写一个51单片机0.001ms延时程序 -
周扶瑞达: 普通的51用11.0592MHz达不到这个要求的,如果你用12MHz的晶振可以达到,一个_nop_();就是1us,******************************* 头文件要加如下:#include ******************************* 这个问题就不要想着用中断了,还没响应0.001ms就已经过去了,谈何精确??普通的51,12MHz晶振,一个周期就已经是0.001ms了,你自己想想看吧...

满洲里市13583456217: 单片机外接24M的晶振,1ms的基准延时函数用C语言怎么写? -
周扶瑞达: 定时器T0 工作方式1 晶振频率24MHz 定时器最大定时时间(us):32768 定时器最小定时时间(us):0.5 【1ms精确定时C51代码】 void T0_init(void) //定时器初始化 { TMOD |= 0x01; TH0 = 0xf8; //设置定时器计数初值,定时1000us TL0 = 0x33; IE |= 0x82; //打开总中断 TR0 = 1; //启动定时器 } void T0_intservice(void) interrupt 1 //定时器中断服务 { TH0 = 0xf8; //重装载定时器计数初值 TL0 = 0x33; //这里可以插入其他处理程序,不会影响定时器工作 }

满洲里市13583456217: 单片机求一用C编写的延时1小时的子程序,要精确到秒级别 -
周扶瑞达: 你用C语言来编制有精度要求的延时子程序,这太不现实了.不过可以用定时器来做.void delay1s() { int i; TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)*256; TR0=1; for(i=0;i<20;i++) { TH0=(65536-50000)/256; TL0=(65536-50000)*256; while(TF0==0); TF0=0; } }

满洲里市13583456217: 51单片机在12M晶振,C语言编程时,延时函数120次=1ms(书本上是这样 -
周扶瑞达: unsigned char us; void t0int (void) interrupt 1//中断自调整时间 { TH0=8; TL0=8;每8微秒中断一次,当US加到120次时大概就1MS就到了 us++; if(us==120) { us=0; } } void main(void) { TMOD=0X1; TH0=8; TL0=8; EA=1; ET0=1; TR0=1; while(1);死循环 }//最主要的是你算好定时时间

满洲里市13583456217: 1秒延时子程序(C语言) -
周扶瑞达: sleep(1000);这个可以不?

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网