asm("nop") 如何精确延时函数

 我来答
那时虾米
推荐于2017-05-22 · TA获得超过4.4万个赞
知道大有可为答主
回答量:5054
采纳率:0%
帮助的人:3393万
展开全部
精确延时函数

/************************************delay.h*************************************/

/#ifndef __DELAY_H__
#define __DELAY_H__

extern void _delay_1us(void);
extern void _delay_us(unsigned int
n);
extern void _delay_1ms(void);
extern void _delay_ms(unsigned int
n);

#endif

/************************************delay.c*************************************/

/**************************************************************
隶属模块:ATmega128延时函数模块
函数名称:_delay_1us(void)
函数功能:
延时1us
入口参数: 无
返回参数:无
修改时间: 2011-8-21
修改者: 陶志华
注意:
系统时钟16M
误差:
0
***************************************************************/
void
_delay_1us(void)
{
asm("nop");

asm("nop");
asm("nop");
asm("nop");
asm("nop");

asm("nop");
asm("nop");
asm("nop");

}
/**************************************************************
隶属模块:ATmega128延时函数模块
函数名称:_delay_us(unsigned
int n)
函数功能: 延时nus
入口参数: 无
返回参数:无
修改时间: 2011-8-21
修改者:
陶志华
注意: 系统时钟16M
误差:
1.69us(高于实际值1.69us)
***************************************************************/
void
_delay_us(unsigned int n)
{
do{
asm("nop");

asm("nop");
asm("nop");
asm("nop");
asm("nop");

asm("nop");
asm("nop");
asm("nop");
asm("nop");

asm("nop");
}while(n--);

}
/**************************************************************
隶属模块:ATmega128延时函数模块
函数名称:_delay_1ms(void)
函数功能:
延时1ms
入口参数: 无
返回参数:无
修改时间: 2011-8-21
修改者: 陶志华
注意:
系统时钟16M
误差:
0.69us(高于实际值0.69)
***************************************************************/

void _delay_1ms(void)
{
unsigned int i =
2666;
for(;i;i--);

}
/**************************************************************
隶属模块:ATmega128延时函数模块
函数名称:_delay_1us(void)
函数功能:
延时nms
入口参数: 无
返回参数:无
修改时间: 2011-8-21
修改者: 陶志华
注意:
系统时钟16M
误差:
1ms(高于实际值1ms)
***************************************************************/

void _delay_ms(unsigned int n)
{
unsigned int i;

do{
for(i=2665;i;i--);
}while(n--);
}

/*************************************************心得体会******************************************

** 函数的调用与返回均为4个时钟周期

** 定义变量与变量赋值均为1个时钟周期

** 循环语句for、while、do{}while均为4个时钟周期

** 自增、自减为1个时钟周期

** asm("nop");1个时钟周期

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

为你推荐:

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

类别

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

说明

0/200

提交
取消

辅 助

模 式