关于延时时间的一个问题

hill340 2010-05-01 08:55:47
关于具体延迟时间我有个小问题:

我采用51单片机,用汇编编了个延时程序:

DELAY: MOV R7,#250;
D1: MOV R6,#250;
D2: DJNZ R6,D2;
DJNZ R7,D1;    
RET;
采用12M晶振,那么时钟周期就是1/12us,机器周期就是1us。
DJNZ指令周期是2机器周期,即2us
那么DELAY就延迟了2*250*250=125ms

我用C语言写的话,如下:
void delay(unsigned int i)
{
unsigned char j;
for(i;i > 0;i--)
for(j = 255;j > 0;j--);
}

请问下i应该写多少,延迟时间才能和上面一样呢???

...全文
1115 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
M0521 2010-07-12
  • 打赏
  • 举报
回复
为啥不用定时器做?
ForestDB 2010-07-12
  • 打赏
  • 举报
回复
要调试一下。
PG 2010-07-11
  • 打赏
  • 举报
回复
打开调试器,,根据实际消耗时间,再调整i值
murhpy 2010-07-11
  • 打赏
  • 举报
回复
汇编不懂
jldream110 2010-07-06
  • 打赏
  • 举报
回复
保证是不相等的 用单片机编延时 首选是定时器 其次可以用内嵌汇编或者 c库函数 编译器按照你选的不同型号给你写好的会准一点 只有在 比如按键消抖啊 ,LED闪烁间隔时间啊 这类功能是 采用for循环 或者while循环延时。
你的情况12M 的晶振 一个单指令周期是 1us 也就是一个nop();是1us 具体for循环的对应时间 需要实际调试
skyworth98 2010-07-06
  • 打赏
  • 举报
回复
你这个实现跟cpu的频率有关……

[Quote=引用楼主 hill340 的回复:]
关于具体延迟时间我有个小问题:

我采用51单片机,用汇编编了个延时程序:

DELAY: MOV R7,#250;
D1: MOV R6,#250;
D2: DJNZ R6,D2;
DJNZ R7,D1;    
RET;
采用12M晶振,那么时钟周期就是1/12us,机器周期就是1us。
DJNZ指令周期是2机器周期,即2us
那么DELAY就延迟了2*……
[/Quote]
jackylongchen 2010-07-06
  • 打赏
  • 举报
回复
不错!
tzwsoho 2010-05-07
  • 打赏
  • 举报
回复
推荐嵌入汇编。。。。。

//用 Keil 在 C 中嵌入汇编的方法:
//在有加入汇编的文件中,还要设置编译该文件时的选项
//右击左边的Test.C,选 Options For File "Test.C"
//勾上:
// Generate Assembler SRC File 生成汇编SRC文件
// Assemble SRC File 封装汇编文件
//最后在C文件中要嵌入汇编的地方用
// #pragma asm
// ...
// ...
// #pragma endasm
//分隔开来,这样编译时 KEIL 就知道这中间的一段是汇编了。

#include <at89x52.h>
#include <boebot.h>

#define Beeper P2_0

int main()
{
while (1)
{
#pragma asm
CPL Beeper
#pragma endasm
Delay_MS(10);
}
}

//boebot.h
//延时 n 微秒
void Delay_US(unsigned int n)
{
n = n / 10;
while (--n);
}

//延时 n 毫秒
void Delay_MS(unsigned int n)
{
n++;
while(--n)
Delay_US(900); //延时 1 ms,同时进行补偿
}
zhxingway 2010-05-07
  • 打赏
  • 举报
回复
帮顶,路过.呵呵.
lida2003 2010-05-07
  • 打赏
  • 举报
回复
如果你需要精确时间,请用汇编;
如果你需要大概时间,请用C + 示波器;
51的话,估计你是没有OS的,所以用上面两个方法应该够了。

如果是老师布置作业,请拿出汇编指令的书,然后拿出一张纸和笔,算把。用汇编,肯定得分,不用汇编,肯定 没分了。
qingtian6174 2010-05-07
  • 打赏
  • 举报
回复
for(k=n;k>0;k--)
for(i=110;i>0;i--)
用c语言的ms延时方法
naichadsk 2010-05-07
  • 打赏
  • 举报
回复

每天回帖即可获得10分可用分!小技巧:教您如何更快获得可用分
xidianzhe 2010-05-07
  • 打赏
  • 举报
回复
恩,好 …
西风万里 2010-05-06
  • 打赏
  • 举报
回复
标题党啊
I_CAN_FLY_Y 2010-05-06
  • 打赏
  • 举报
回复
接分。。。接分。。。。。
mmxopq 2010-05-06
  • 打赏
  • 举报
回复
for循环基本无法精确到是多少时间,只能用 可能的值 调试 最接近的
yirenyang 2010-05-06
  • 打赏
  • 举报
回复
用示波器读读清楚些~~
xy502742540 2010-05-06
  • 打赏
  • 举报
回复
汇编 太遥远了吧
wang0635 2010-05-05
  • 打赏
  • 举报
回复
应该写汇编语言子程序,由C语言程序调用
wotur 2010-05-05
  • 打赏
  • 举报
回复
用个硬timer量一下吗
加载更多回复(11)

69,372

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧