c语言中一个标准的延时1us的函数怎么写?

供稿:hz-xin.com     日期:2025-01-15
如何用c语言实现精确延时1us,这个语句_nop_()除外。

1 微秒困难。
QueryPerformanceCounter()函数能返回当时时钟记数。两次调用之差就是时间差计数。
QueryPerformanceFrequency()函数获得时钟频率。计数 除以 时钟频率 得时间,单位是秒。
秒换算成微秒添6个0。
还有一种方法是用Pentium芯片汇编指令 0x0F 和 0x31,读取时钟计数图章,类似QueryPerformanceCounter()函数,计时开始和结束分别调用一次,得读数差,并扣除执行一次调用函数消耗的额外时间。读数差怎样转化成时间是个问题,如果知道CPU速度可以算得时间,如果知道时间,可以估算CPU速度。
// Pentium instruction "Read Time Stamp Counter".
__forceinline unsigned _int64 My_clock(void)
{
_asm _emit 0x0F
_asm _emit 0x31
}
全程序和说明,见 L_o_o_n_i_e 百度空间里的文章 “C语言时间函数的应用”

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

如果是单片机上,是有可能的
单片机12M晶振执行一条指令1us,所以C语言1us延时程序 用12M晶振延时1us,用—_nop_();

#include<intrins.h> //头文件
_nop_(); //这一个语句表示1us延时

学过汇编你就会知道,每条指令都占一定的时间(或者机器周期)的,如果你让机器什么都不做,即空指令的话,机器就会延时,然后你在计算好每次延时到底有多长,外面套一个循环(或者多重循环),根据你想要的延时时间即可计算出来循环的次数,延时函数基本上都是这种原理,它的参数就是用来控制循环次数的。

单片机的c语言延迟函数
这里假定单片机是时钟频率为12MHz,则一个机器周期为:1us.参考了51单片机 Keil C 延时程序的简单研究后,我们可知道, 在Keil C中获得最为准确的延时函数将是void delay(unsigned char t){ while(--t);}反汇编代码如下:执行DJNZ指令需要2个机器周期,RET指令同样需要2个机器周期,根据输入t,...

51单片机c语言里 _nop_ 函数怎么用?
_nop_(); \/\/ 产生一条NOP指令。该函数的作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成...

单片机C语言中怎么实现微秒级延时?
可以用_nop_( )函数来实现微秒级的延时。_nop_(); \/\/ 直接当成一条语句使用,产生一条NOP指令NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。注:使用该函数时,需要将头文件#include<intrins.h>包含进源文件中。

关于C语言for循环延时函数
for循环实现C语言精确延时 (晶振12MHz,一个机器周期1us.)一. 500ms延时子程序 程序:void delay500ms(void){ unsigned char i,j,k;for(i=15;i>0;i--)for(j=202;j>0;j--)for(k=81;k>0;k--);} 产生的汇编:C:0x0800 7F0F MOV R7,#0x0F C:0x0802 7ECA MOV ...

单片机外接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; \/\/打开总中断...

_nop_在c语言里怎么用呢?
在c语言里没有这个_nop_函数,这个函数是在51单片机里使用的。作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。对于延时比较长的,要求在大于10us,采用C51中的循环语句来实现。

8051单片机,此延时1ms是怎么来的?语法略懂得,求大神告知关键的地方,当 ...
在12MHz晶振时一个机器周期为1微妙,对于keil编译的代码运行而言,一条判断语句(i<1) 4个机器周期,一条自增语句(i++) 1个机器周期,一条判断语句(i<1) 4个机器周期***,将所有代码的运行时间累加起来就是延时时间,至于最终的延时时间是否准确,可以通过编译软件相关窗口查看,至于怎样查看,...

在51编程delayms什么意思
delay:是延时的意思,ms:毫秒。delayms:就是指毫秒级的延时程序 以下是本人编写的循环体延时程序。时钟晶振为8MHz。\/\/ \/\/函数名:Delay_us\/ms()\/\/描 述:延时函数。\/\/ define Delay_1us() asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");asm("nop")void Delay_us(...

一个_nop_();函数延时多长时间?
一个_nop_();函数延时一个机器周期的时间。要通过你的指令周期和晶振来看:如8051 12M晶振 ——nop——() 1个us。函数名: _nop_原 型: void _nop_(void);void_tuzi_(void);void _nop_(void);功 能:_nop_产生一个NOP 指令,该函数可用作C 程序的时间比较。C51 编译器在_nop_函数...

mdkl 5硬件仿真延时准确吗
一、用NOP函数 在keil C51中,直接调用库函数:include \/\/ 声明了void _nop_(void);_nop_(); \/\/ 产生一条NOP指令 作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。(若为...