请教关于单片机C语言中用while延时的问题
我的单片机晶振频率是12M先创造延时子程序如下voiddelay(unsignedlongtime)//参数time大小{while(time--);}当我delay(x...
我的单片机晶振频率是12M
先创造延时子程序如下
void delay(unsigned long time) //参数 time 大小
{
while(time--);
}
当我
delay(x);
的时候,x和实际的秒数存在着什么样的关系?
比如,我
delay(500000);
会延时多长时间呢 展开
先创造延时子程序如下
void delay(unsigned long time) //参数 time 大小
{
while(time--);
}
当我
delay(x);
的时候,x和实际的秒数存在着什么样的关系?
比如,我
delay(500000);
会延时多长时间呢 展开
3个回答
展开全部
晶振频率Fosc=12MHz,则机械周期 T=12/Fosc=1us;程序中 的 自加(++)、自减(--) 的执行周期为1个机械周期,即1us;
若为 理想状态,则delay(500000)的时间应该是:500000×1us=500ms;
但是,编译软件 要把 函数调用、for 语句转换成 机器指令,这是需要一定周期的,周期长短 视不同的编译软件 而有所不同,目前也没人对这个 转换差别 做过 专业的考量,故LZ 的问题,没有确切 的答案,只能 是告诉 你,大于某个时间;如例子 的答案是 大于 500ms,但大到什么程度,不知道,不过可以从 软件中 单步调试 中 得到。
若为 理想状态,则delay(500000)的时间应该是:500000×1us=500ms;
但是,编译软件 要把 函数调用、for 语句转换成 机器指令,这是需要一定周期的,周期长短 视不同的编译软件 而有所不同,目前也没人对这个 转换差别 做过 专业的考量,故LZ 的问题,没有确切 的答案,只能 是告诉 你,大于某个时间;如例子 的答案是 大于 500ms,但大到什么程度,不知道,不过可以从 软件中 单步调试 中 得到。
展开全部
首先延时函数一般采用for循环嵌套实现,而它们的转化关系。你必须51指令中的时钟周期、状态周期、机器周期概念。C中的循环减其实就是汇编中的DJNZ指令,你先了解此指令在51中的执行周期。在进行换算即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
延时一次为一次机器周期,但是如果要准确的话,建议用keil去debug,将你需要的周期设定,1ms,1us等,以后只需要调用
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询