求一个C语言的微秒级延时函数

需要一个微秒级的延时函数...求一个微秒级的延时函数...... 需要一个微秒级的延时函数...求一个微秒级的延时函数... 展开
 我来答
N_0_1
高粉答主

2015-10-29 · 关注我不会让你失望
知道大有可为答主
回答量:8628
采纳率:47%
帮助的人:838万
展开全部

c语言,微秒级延时


void Delay_us (unsigned char time_us)

{

   unsigned long int  TM_LODAE;

   TR2   = 0;                          // Stop timer

   TF2H  = 0;                          // Clear timer overflow flag

   

   TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us);

   

  // TMR2  = -( (UINT)(SYSCLK/1000000) * (UINT)(time_us) );

   

  TMR2H =  TM_LODAE>>8;

  TMR2L =  TM_LODAE&0x00FF;

   TR2   = 1;                          // Start timer

   while (!TF2H);                      // Wait till timer overflow occurs

   TR2   = 0;                          // Stop timer

}

 程序分析:

  1. 前面一起住航分析一下该代码,

  2. unsigned long int  TM_LODAE;  声明一个长整型数据,

  3. TR2   = 0;    定时器2停止计时

  4. TF2H  = 0;      清除定时器2中断标志

  5. TM_LODAE = 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us);    计算定时器初值。 SYSCLK是系统的晶振频率,SYSCLK/1000000是系统 1uS 执行的指令。 (UINT)(SYSCLK/1000000) * (UINT)(time_us)就是系统 time_us执行的指令数。 65535-(UINT)(SYSCLK/1000000) * (UINT)(time_us)定时器需要 TM_LODAE指令周期才会溢出。

  6. 该单片机的一个指令周期就是一个时钟周期.TMR2H =  TM_LODAE>>8;  TMR2L =  TM_LODAE&0x00FF;置定时器寄存器的初值、

  7. TR2   = 1;   启动单片机计时  while (!TF2H);  等待定时器2寄存器溢出。TR2   = 0;停止计时,在这段代码注释中已经说明了应该有50nS的误差,这个是函数调用产生的。

a452953977
2015-10-10 · TA获得超过5.6万个赞
知道大有可为答主
回答量:3687
采纳率:77%
帮助的人:417万
展开全部
  _nop_(); //延时1us,fosc = 12MHz 时。

  C语言是一种计算机程序设计语言,属高级语言范畴。它既具有高级语言的特点,又具有汇编语言的特点。它可以作为工作系统设计语言,编写系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序,代码清晰精简,十分灵活。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
乐跑小子
2016-01-17 · TA获得超过1.5万个赞
知道大有可为答主
回答量:1.1万
采纳率:7%
帮助的人:4724万
展开全部
可以用_nop_( )函数来实现微秒级的延时。
_nop_(); // 直接当成一条语句使用,产生一条NOP指令

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

注:使用该函数时,需要将头文件#include<intrins.h>包含进源文件中。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
suer2008
2013-04-14
知道答主
回答量:13
采纳率:0%
帮助的人:6.8万
展开全部
//*********** 微秒延时函数 ********************************************
void Delayus(unsigned int US)
{
unsigned i;
US=US*5/4; //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
for( i=0;i<US;i++);
}
//*********************************************************************

以上函数式根据AVR单片机在8MHZ时钟频率下得出的结果。
如果系统频率不一样,就按比例改变。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-04-12
展开全部
一个微秒级的延时函数今天要用到一个微秒级的定时函数,到网上search下,找了几个都不能用,我晕,无奈,还是自己动手比较好,赶紧贴出来。

免得以后要用的时候又不知道那里去找,方便自己也方便大家^_^ 又避免重复发明轮子^_^

/********************************************************************
Created: 2006/09/02
FileName: t.c
Author: Liu Qi

Purpose: 测试微秒级延时
*********************************************************************/

#include <windows.h>
#include <time.h>
#include <stdio.h>

ULONG GetTimeDis(struct tm first, struct tm second) //计算两次时间差
{
return abs((first.tm_hour * 3600 + first.tm_min * 60 + first.tm_sec)
- (second.tm_hour * 3600 + second.tm_min * 60 + second.tm_sec));
}

void Delay(ULONG ulMicroSeconds)
{
LARGE_INTEGER timeStop;
LARGE_INTEGER timeStart;
LARGE_INTEGER Freq;
ULONG ulTimeToWait;

if (!QueryPerformanceFrequency( &Freq ))
return;

ulTimeToWait = Freq.QuadPart * ulMicroSeconds / 1000 / 1000;

QueryPerformanceCounter ( &timeStart );

timeStop = timeStart;

while( timeStop.QuadPart - timeStart.QuadPart < ulTimeToWait )
{
QueryPerformanceCounter( &timeStop );
}
}

int main(void)
{
struct tm timeStart, timeEnd;

_getsystime(&timeStart);

Delay(1000 * 1000 * 3); //3秒

_getsystime(&timeEnd);
printf("用时:%d秒\n", GetTimeDis(timeStart, timeEnd));

return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式