帮我看一下这个C语言函数:

void delay(unsigned int ms)
{
uchar j=0;
while(ms--)
{
for(j =0;j<120;j++);
}
}

调用一次,比如ms=5,延时多久?

你这个是C语言的,基本来说是看不出延时多久的。为什么呢?
看一下你的参数,unsigned int ms很明显,ms是十六位数据,那么十六位数据在编译器汇编的时候会变成什么样子,我们就很难知道了,51是八位的单片机。
void delay(uchar ms)
{
uchar j=0;
while(ms--)
{
for(j =120;j>0;j--);
}
}
如果我没记错的话,在c51汇编里面,djnz这个指令是双周期的,那么上面的延时也就是5*120*2微秒,等于1.2毫秒。如果我记错了,那就差不多是600微秒
其实C语言的延时都是不准确的,汇编就很准确了,可就算是汇编,如果遇到被中断打断,那同样也是不准确的,所以如果是非常重要的延时的话,应该要关中断好一点,或是使用定时器来做。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-06-02
如果需要精准延时,建议不要这样写。要知道精确的机器周期需要先转换成汇编语言。上面的代码具体机器周期我没有算,但肯定大于1800个机器周期。
可以参考一下代码,只使用char或unsigned char型:
C程序中可使用不同类型的变量来进行延时设计。经实验测试,使用unsigned char类型具有比unsigned int更优化的代码,在使用时应该使用unsigned char作为延时变量。 以某晶振为12MHz的单片机为例,晶振为12MHz即一个机器周期为1us。
一. 500ms延时子程序
程序:
void delay500ms(void)
{
unsigned char i,j,k;
for(i=15;i>0;i--)
for(j=202;j>0;j--)
for(k=81;k>0;k--);
}
计算分析:
程序共有三层循环
一层循环n:R5*2 = 81*2 = 162us DJNZ 2us
二层循环m:R6*(n+3) = 202*165 = 33330us DJNZ 2us + R5赋值 1us = 3us
三层循环: R7*(m+3) = 15*33333 = 499995us DJNZ 2us + R6赋值 1us = 3us
循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us
延时总时间 = 三层循环 + 循环外 = 499995+5 = 500000us =500ms
计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5
希望对你能有帮助。本回答被提问者采纳
第2个回答  2011-06-02
在做单片机开发吧?有个错了,应为uint j,for 下面 应有 几个nop(),就是循环等待;循环时间=5*120个循环体指令执行时间,就是有几个nop()
第3个回答  2011-06-02
可以用sleep实现延时,不建议用死循环,会造成资源浪费
第4个回答  2011-06-02
延迟基本为0追问

详细点说,是600个时钟周期吗?

追答

600 个时钟周期吧 + 5个mov reg,reg周期

帮我看一下这个C语言函数:
{ uchar j=0;while(ms--){ for(j =120;j>0;j--);} } 如果我没记错的话,在c51汇编里面,djnz这个指令是双周期的,那么上面的延时也就是5*120*2微秒,等于1.2毫秒。如果我记错了,那就差不多是600微秒 其实C语言的延时都是不准确的,汇编就很准确了,可就算是汇编,如果遇到被中断打...

帮忙看看这个C语言函数是这样写吗?
void output(int a[],int n){ int i; for(i=0;i<=n-1;i++) printf("%d ",a[i]); } 输入的应该是一个整数数组 用printf输出,在格式化的时加一个空格,这样最后多一个空格

帮忙看下这个C语言函数怎么看一点没头绪,本人是菜鸟
int main(void) \/*主函数*\/ { float a,b,c;printf("input two number\\n "); \/*告诉用户需输入两个值,\\n表示换行 *\/ scanf("%f%f",&a,&b); \/*接受两个参数,分别保存到&a,&b *\/ c=max(a,b); \/*调用函数,并把值赋予c *\/ printf("max is %f\\n",c); \/*输出。

c语言 帮忙看一下这个function
int countWords(char *line);在主函数中逐行输入文章内容,每输入一行,就调用该函数一次,并将得到的结果累加起来。

帮忙看看这个函数 C语言
那里是do。。。while while (fabs(t)>= 1e-6);这句是条件,假如fabs(t)还大于它,那么继续循环,直到小于它为止。所以和题目的意思一样 唉。。我真是跟你们说不清,你们在批评别人的回答钱能把题目看清楚吗 题目说的是到,注意,是到!!!|x^n\/n!|<1e-6的时候结束,你把程序好好看一遍...

急 大家帮忙看看这个c语言写的加减乘除 不知道是什么问题啊,谢谢了_百 ...
是提示下面的四个函数找不到吗?undefined??如果是,改变一下顺序,像下面这样就就可以了。还有,要注意 除法 分母不能为0.include <stdio.h> void cheng(float a,float b){ printf("%f",a*b);} void chu(float a,float b){ printf("%f",a\/b);} void jia(float a,float b){ pr...

谁帮我解释一下这个C语言 函数?unsigned char chars_to_bits(const uns...
0],bits与chars[0]相或,就是bits和chars[0]二进制形式相或,都为0结果为0,有一个为1结果为1 for(i=1;i<8;++i){ bits<<=1; \/\/bits=bits<<1就是把bits以二进制向左边移动1位,末尾补0 bits|=chars[i];} return bits;} 想不明白这函数有啥用,很奇怪的功能 ...

谁能帮我看看c语言代码?
这是一个输出某一年份日历的C语言程序。程序的主要思路是先计算输入年份的1月1日是星期几,然后按照每个月的天数输出整个年份的日历。程序中使用了两个函数来检查平年和闰年,并使用switch语句来输出每个月的天数。以下是代码的一些详细解释和建议:check_year函数:该函数用来检查一个年份是否是闰年。其中...

这段C语言函数怎么解读?是怎么实现de
bin是个递归函数,作用是:给定入参x,循环输出x\/2,x\/2平方,x\/2三次方……直至x除以2的n次方的结果小于1时停止。看错了,输入的是x%2,不是x\/2。假如入参x=12(程序里的预设int n=12)第一轮:bin(12),调用bin(12\/2),然后输出12%2 = 0。注意是先调用下一轮bin,再输出0。下同...

哪位大佬能帮看看这道c语言?
所以,定义2个指针分别指向a,b最后一个输入的元素地址,嵌套循环,分别往前移动,同时比较两数组元素,每次找到对应位置就将a移位并插入b的位置。ps:由于存在b小于a的所有元素这种特殊情况,循环外还有a数组全部后移的情况。故位移写成单独函数,符合编程习惯。下面是代码:include <stdio.h> void move1...

相似回答
大家正在搜