标题: 单片机程序怎么计算延时时间? [打印本页]

作者: aktuan007    时间: 2022-3-15 10:24
标题: 单片机程序怎么计算延时时间?
void delay(unsigned int i)
{

        unsigned int j;
        while(i--)
        {
                for(j=0;j<0x20;j++);
        }

}
这个延时函数,while循环和for循环,延时多久啊?为什么我用keil调试算的时间和自己算的不一样

作者: Petersoaring23    时间: 2022-3-15 11:22
这个延时,和编译器有关系,如果是汇编的代码,能看到指令,就能计算指令周期,准确的预计时间,你进入调试模式看看汇编代码,应该能够算出来
作者: 294479435    时间: 2022-3-15 11:27
这种不精确,遇到中断就去执行中断了
作者: Y_G_G    时间: 2022-3-15 12:50
这是C语言,C语言要先编译成汇编才能烧录到单片机中,不同的编译环境,编译成的汇编代码是不一样的
所以,这是没法计算的
对于STC,最简单省事的就是在下载器那复制
如果要精确的,那就用定时器
作者: 188610329    时间: 2022-3-15 14:08
如果你用的 是 KEIL , 选择正确的芯片型号,以及设置了正确的晶振值之后……,

单独写一个 延时函数,编译后,Ctrl + F5, 然后运行到 延时函数前,看一下 左侧的 耗时 记住,然后继续运行到 延时函数结束, 记录左侧的耗时, 减一下,就是这个函数的耗费时间,以此为依据,酌情增减。51核的尽量用  while(--i);  可以确保编译出来时 DJNZ  那么只要看一下该芯片的 DJNZ指令的周期,就能算出确切的时间。
作者: aktuan007    时间: 2022-3-15 14:54
上面的这个延时,理论上是延时多少啊?12MHZ晶振
作者: 188610329    时间: 2022-3-15 15:26
aktuan007 发表于 2022-3-15 14:54
上面的这个延时,理论上是延时多少啊?12MHZ晶振

不能光看晶振啊, 还有单片机型号阿, 同样这段代码,同样12MHz的晶振。
就说最常见的:
STC89C51, STC12C5608AD, STC15W408AS, STC8G1K08,  这4款单片机,跑出来的时间完全不一样。
作者: aktuan007    时间: 2022-3-15 15:47
188610329 发表于 2022-3-15 15:26
不能光看晶振啊, 还有单片机型号阿, 同样这段代码,同样12MHz的晶振。
就说最常见的:
STC89C51, STC ...

STC89C51的
作者: 188610329    时间: 2022-3-15 16:36
aktuan007 发表于 2022-3-15 15:47
STC89C51的

你STC为什么不直接用 ISP计算呢? 那个绝对准啊。



选择 Y1  就是 STC89 对应时间。

作者: 188610329    时间: 2022-3-15 16:55
最后给你补充一下,延时函数,你可以多层while函数嵌套,但是绝对不能用unsigned int, 必须要用unsigned char, 不然,你时间绝对算不准。

作者: aktuan007    时间: 2022-3-15 17:59
188610329 发表于 2022-3-15 16:55
最后给你补充一下,延时函数,你可以多层while函数嵌套,但是绝对不能用unsigned int, 必须要用unsigned ch ...

感谢感谢
作者: zerotwo......    时间: 2022-3-16 11:03
单片机的延时程序通过执行指令来达到延时效果,这个时间等于执行的指令需要的时间,而一个指令需要的时间叫做指令周期,这个时间等于若干个机器周期。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1