单片机C语言中怎么实现微秒级延时?

供稿:hz-xin.com     日期:2025-01-13
求助:单片机C语言中延时程序怎样计算?

你好:
如果你想直接知道答案,那么我告诉你,12MHz晶振:
void delayms(unsigned int t)
{
unsigned int i,j;

for(i=t;i>0;i--)

for(j=123;j>0;j--);

}
能精确到1ms。
如果是11.0592MHz晶振,只需把上面的“j=123”改为“j=114”,都是调试过的,没问题。
然后你要想知道是怎么调试的,很简单,打开uv2编程软件,在最上边的工具栏里边有个“Debug”,点击后出现下拉菜单,选择第一个“start/stop Debug Session”,然后在最右边有一个Watch栏,有两个项目,一个是“Register”,一个是“value”,然后在“Register”栏下边的“Sys”里边有个“sec”,你只要单击“Step over”运行程序并观察“sec”的值就能调试出你程序的执行时间了。
注意,一定要先选择晶振频率,不然会默认24MHz。
希望我的回答能帮助到你。

#include
unsigned char sx[]={
oxfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,
oxfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,
0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x01},
ml[]={0xff,0x00, 0xff,0x00, 0xff,0x00,
0xff,0x00, 0xff,0x00, 0x01};
unsigned int a=0,b=0;
del1ms(unsigned int k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<100;j++);
}
main()
{
while(1)
{
if(sx[]!=0x01)
{
P0=sx[a];
del1ms(20);
a++;
}
else
a=0;
if(lm[]!=0x01)
{
P0=lm[b];
del1ms(30);
b++;
}
else
b=0;
}
}
说明一下: 这样延时太短了,基本上看不出
对于定义来说:变量只是一个标识符而已,随便设,当变量多 的时候最好用带意思如:sec stu 等

可以用_nop_( )函数来实现微秒级的延时。

_nop_();            // 直接当成一条语句使用,产生一条NOP指令

NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M晶振,延时1uS。


注:使用该函数时,需要将头文件#include<intrins.h>包含进源文件中。



大致的原理 就是根据CPU的指标 得到CPU执行一条指令的时间t
然后通过循环一定次数 即执行一定条数的指令N
t*N就是时间了
仅适用于单线程的单片机
对于有线程或者是有中断的情况下会不准确

单片机执行一步运算需要一定的时间,这根单片机的晶振有关!
while(i--)执行了6次,6步的时间!

这些属于软件延时,会有一定的误差,但一般的测试没有问题,你可以用KEIL软件仿真,在你写的代码前后各设置一个断点,从第一个断点开始,单步运行到下个断点,KEIL左侧会显示执行这段代码所用的时间。 本质上就是,单片机执行完这段代码的时间,就是你所要的时间。
这款单片机不能硬件调试,如果是其它类型能调试 的MCU,你可以用示波器测出来。

C中 nop()函数如何实现1us延时?
C语言中的_nop_()指令,堪称编程中的“静默使者”,看似简单,实则在关键时刻发挥着微妙作用。在51单片机的世界里,当晶振频率设定为12兆赫兹时,_nop_()指令的延时效果相当于一个周期,即1微秒。这看似微不足道,但在追求效率和精准控制的编程世界里,每一分每一秒都至关重要。C语言,作为一门广...

51单片机c语言里 _nop_ 函数怎么用?
在单片机c语言中直接调用库函数即可,具体如下:include<intrins.h> \/\/ 声明了void _nop_(void);_nop_(); \/\/ 产生一条NOP指令。该函数的作用:对于延时很短的,要求在us级的,采用“_nop_”函数,这个函数相当汇编NOP指令,延时几微秒。NOP指令为单周期指令,可由晶振频率算出延时时间,对于12M...

在c语言中,sleep()怎么用?
sleep()用于代码的阻断延迟运行,其用法步骤如下:需要准备的材料分别有:电脑、C语言编译器。1、首先,打开C语言编译器,新建一个初始.cpp文件,例如:test.cpp。2、在test.cpp文件中,输入C语言代码:Sleep(1000);printf("sleep end.");。3、编译器运行test.cpp文件,此时成功执行Sleep()函数在1秒...

求一个C语言的微秒级延时函数
免得以后要用的时候又不知道那里去找,方便自己也方便大家^_^ 又避免重复发明轮子^_^ \/ Created: 2006\/09\/02 FileName: t.c Author: Liu Qi Purpose: 测试微秒级延时 \/ include <windows.h> include include <stdio.h> ULONG GetTimeDis(struct tm first, struct tm second...

c语言有办法取得当前纳秒或微秒级的时间吗
Windows 内部有一个精度非常高的定时器, 精度在微秒级, 但不同的系统这个定时器的频率不同, 这个频率与硬件和操作系统都可能有关。利用 API 函数 QueryPerformanceFrequency 可以得到这个定时器的频率。利用 API 函数 QueryPerformanceCounter 可以得到定时器的当前值。

c语言中怎么设置计时器?
include <iostream> include using namespace std;int main(){ clock_t start = clock();\/\/do some process here clock_t end = (clock() - start)\/CLOCKS_PER_SEC;cout<<"time comsumption is "<<end<<endl;}

如何用单片机的delay实现延时?
后两种的一个机器周期分别为1 μs和2 μs,便于精确延时。本程序中假设使用频率为12 MHz的晶振。最长的延时时间可达216=65 536 μs。若定时器工作在方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。

c语言sleep函数怎么用
结论:C语言中的sleep函数和相关延迟函数如usleep和delay在编程中用于控制程序执行的暂停时间。下面是它们的详细使用方法:首先,使用Sleep函数来实现挂起进程。在Windows开发环境中,使用`#include `头文件,并确保函数名是小写的"sleep"(如`Sleep(1000)`表示暂停1秒)。而在Linux和某些C标准环境中,通常...

请问在C语言里怎么获取当前时间和日期(精确到毫秒)?
c include include include time.h> int main() { struct timeval tv;gettimeofday(&tv, NULL);printf("当前时间是: %ld.%06ld\\n", tv.tv_sec, tv.tv_usec);} 这段代码通过`gettimeofday()`函数获取当前时间,精确到微秒级别。若需毫秒级别精度,可自行转换微秒为毫秒。值得注意的是,不同...

求单片机软件延时精确计算公式。C编程,for语句。好像与...
回答:在不同单片机中,有不同的单片机指令。每个指令都占用不同的时钟周期。一般延时程序就是通过循环去达到延时的作用。下面以最基础的51单片机去做说明:我这边用我之前debug过的2个延时程序,晶振使用12M:void delay_us_fun (unsigned int i) \/\/us延时 { while (i--); }这个是用来微秒级延时