8739|11

85

帖子

1

TA的资源

一粒金砂(初级)

楼主
 

【求助】C语言的延时子程序 [复制链接]

如何能写出一个高效的C语言延时程序,延时时间较准确的,请高手们给个程序!

最新回复

to:请教njw: 我用C-SPY仿真查出一下您写的程序用的机器周期和您的注释不一样,能给解释一下吗?谢谢! 1、 void Delay_ms(unsigned int nValue)//毫秒为单位,8MHz为主时钟 { unsigned int nCount; unsigned int ii; unsigned int jj; nCount = 1331;//8000000*0.001/1332/6个Tj=1( 我的是8011T,近似1MS,这个一样) for(ii = nValue;ii > 0;ii--) { for(jj = nCount;jj > 0;jj--); } return; } 2、 void Delay_us(unsigned int nValue)//微秒为单位,8MHz为主时钟 { unsigned int ii; for(ii = nValue;ii > 0;ii--) { _NOP();//1Tj _NOP();//1Tj } return;//8000000*0.000001/(6+2)=1( 我的是21T,近似2.625微秒) }  详情 回复 发表于 2008-5-30 15:31
 
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
书上有很多啊
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
void Delay(unsigned int t)
{
while(--t);
}
生成的汇编指令有三条:
Delay
add.w #ffff,r12
tst.w r12
jne Delay

占用4个机器周期(只是这三条,调用指令忽略不计),我的机器周期为0.0000125S
所以我的程序中t=1时,延时0.00005S计50uS,应该够用了!

初学,弄了半天才弄清楚,还算严谨吧?呵呵呵!
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

4
 
延时可以用 for(i--) for(i++) while(--i)等等,其中while(--i)分辨率最好
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(中级)

5
 
仿真的时候看延时程序的时钟周期,如不准确可加NOP调整
/***************************************/
void Delay_S(unsigned int nValue)//秒为单位,8MHz为主时钟
{
unsigned int nCount;
unsigned int ii;
unsigned int jj;
nCount = 50000;//50000,调整为49999,当nValue=3秒时为24000034个Tj,较为精确
nValue <<= 4;//输入的数值*16
for(ii = nValue;ii > 0;ii--)
{
for(jj = nCount;jj > 0;jj--)//共10个Tj
{
_NOP();//1Tj
_NOP();//1Tj
_NOP();//1Tj
_NOP();//1Tj
}
}
return;//8000000/50000/(6+4)/16个Tj=1
}

void Delay_ms(unsigned int nValue)//毫秒为单位,8MHz为主时钟
{
unsigned int nCount;
unsigned int ii;
unsigned int jj;
nCount = 1331;//8000000*0.001/1332/6个Tj=1
for(ii = nValue;ii > 0;ii--)
{
for(jj = nCount;jj > 0;jj--);
}
return;
}

void Delay_us(unsigned int nValue)//微秒为单位,8MHz为主时钟
{
unsigned int ii;
for(ii = nValue;ii > 0;ii--)
{
_NOP();//1Tj
_NOP();//1Tj
}
return;//8000000*0.000001/(6+2)=1
}
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
引用:

void Delay(unsigned int t)
{
while(--t);
}
生成的汇编指令有三条:
Delay
add.w #ffff,r12
tst.w r12
jne Delay

占用4个机器周期(只是这三条,调用指令忽略不计),我的机器周期为0.0000125S
所以我的程序中t=1时,延时0.00005S计50uS,应该够用了!

初学,弄了半天才弄清楚,还算严谨吧?呵呵呵!
请教一下,我用这个例程实验一下为什么会编译出错?代码如下:
void Delay(unsigned int) ;声明
int main( void )
{
void Delay(1);调用---------此为出错提示行
return 0;
}
void Delay(unsigned int t);定义
{
while(--t);
}
这小段程序编译出错为:Error[Pe079]: expected a type specifier E:\IAR\S××ES\main.c 5
我刚学C,还请过路的多多指点!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

7
 
把void去掉应该可以吧
main函数中 函数调用时候不要加void应该
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用:

请教一下,我用这个例程实验一下为什么会编译出错?代码如下:
void Delay(unsigned int) ;声明
int main( void )
{
void Delay(1);调用---------此为出错提示行
return 0;
}
void Delay(unsigned int t);定义
{
while(--t);
}
这小段程序编译出错为:Error[Pe079]: expected a type specifier E:\IAR\S××ES\main.c 5
我刚学C,还请过路的多多指点!

void Delay(1);这句去掉 void
 
 
 

回复

89

帖子

0

TA的资源

一粒金砂(初级)

9
 
多谢了!
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

10
 
路过,顺便学习下,不错
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 

仿真的时候看延时程序的时钟周期????

仿真的时候看延时程序的时钟周期????请问在IAR或AQ430如何看??谢谢了!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

12
 
to:请教njw:
我用C-SPY仿真查出一下您写的程序用的机器周期和您的注释不一样,能给解释一下吗?谢谢!

1、
void Delay_ms(unsigned int nValue)//毫秒为单位,8MHz为主时钟
{
unsigned int nCount;
unsigned int ii;
unsigned int jj;
nCount = 1331;//8000000*0.001/1332/6个Tj=1( 我的是8011T,近似1MS,这个一样)
for(ii = nValue;ii > 0;ii--)
{
for(jj = nCount;jj > 0;jj--);
}
return;
}

2、
void Delay_us(unsigned int nValue)//微秒为单位,8MHz为主时钟
{
unsigned int ii;
for(ii = nValue;ii > 0;ii--)
{
_NOP();//1Tj
_NOP();//1Tj
}
return;//8000000*0.000001/(6+2)=1( 我的是21T,近似2.625微秒)
}
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表