标题: 有段单片机延时代码,请大神指导是如何计算时间的? [打印本页]

作者: szbadd    时间: 2021-8-31 16:41
标题: 有段单片机延时代码,请大神指导是如何计算时间的?
各位大神:小弟初接触单片机,以下一段代码,其中的i:及j: 及K:是怎么算出来的?求计算方法,或求专门的计算软件,谢谢。


void Delay100ms()                //@11.0592MHz
{
        unsigned char i, j, k;

        i = 5;
        j = 52;
        k = 195;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}




作者: lkc8210    时间: 2021-8-31 16:50
可用STC_ISP自动生成代码



作者: 188610329    时间: 2021-8-31 19:04
没有计算方法,C语言你就不要考虑了,除非你懂汇编。
然后查询该单片机的手册,查到DJNZ的机器周期,MOV的机器周期,然后根据晶振速率,算出需要多少个机器周期,然后算出用多少个DJNZ, 要精准的话,还要算上 MOV时间, RET时间, 和 CALL的时间。
作者: 188610329    时间: 2021-8-31 19:08
STC的单片机,你可以用他的下载器自带的工具生成,其他的单片机,你能你把在KEIL上,加载该MCU的信息后,写一个大概的延时,然后DEBUG跑一下看看多少时间,在调整调整到你需要的时间。
作者: Hephaestus    时间: 2021-8-31 20:08
这个不是算出来的,而是测出来的。
作者: Y_G_G    时间: 2021-8-31 20:49
不同的单片机环境有不同的办法
如果是8051,在STC下载器那有现成的,选择好单片机型号和晶振,复制就可以了
PIC就有专门的uS,mS延时函数,程序开始的时候设定好晶振频率,直接调用函数就行,这比较省事

作者: 188610329    时间: 2021-8-31 20:53
Hephaestus 发表于 2021-8-31 20:08
这个不是算出来的,而是测出来的。

你还真说错了,这个就是算出来的。根据不同型号的芯片,while 语句所对应的汇编代码 DJNZ的周期数,然后计算出来的数值。
作者: jjwangxu2008    时间: 2021-8-31 21:19
一般我是测出来
作者: szbadd    时间: 2021-8-31 21:32
lkc8210 发表于 2021-8-31 16:50
可用STC_ISP自动生成代码

大神,我明白,原来是这样算出来的,太感谢了,
作者: szbadd    时间: 2021-8-31 21:33
188610329 发表于 2021-8-31 19:04
没有计算方法,C语言你就不要考虑了,除非你懂汇编。
然后查询该单片机的手册,查到DJNZ的机器周期,MOV的 ...

谢谢你的回复,论坛有你更精采
作者: szbadd    时间: 2021-8-31 21:34
188610329 发表于 2021-8-31 19:08
STC的单片机,你可以用他的下载器自带的工具生成,其他的单片机,你能你把在KEIL上,加载该MCU的信息后,写 ...

是的,谢谢你的回复,论坛有你更精采
作者: szbadd    时间: 2021-8-31 21:34
Hephaestus 发表于 2021-8-31 20:08
这个不是算出来的,而是测出来的。

谢谢你,已解决
作者: szbadd    时间: 2021-8-31 21:35
Y_G_G 发表于 2021-8-31 20:49
不同的单片机环境有不同的办法
如果是8051,在STC下载器那有现成的,选择好单片机型号和晶振,复制就可以了
...

嗯,你这个计算出来没有K值,谢谢你
作者: szbadd    时间: 2021-8-31 21:36
188610329 发表于 2021-8-31 20:53
你还真说错了,这个就是算出来的。根据不同型号的芯片,while 语句所对应的汇编代码 DJNZ的周期数,然后 ...

谢谢你的参与
作者: szbadd    时间: 2021-8-31 21:39
已解决,谢谢各位
作者: 人人学会单片机    时间: 2021-9-1 08:19
真正搞工程项目设计的,压根就不去计算这种参数的。理由如下:
1、假设在同一个硬件上做测试,单片机CPU指令周期是一致的。那么 变量i、K,存放在data跟存放在XDATA,读写速度能一样?精确计算有意义吗?
2、假设都存放在data,延迟1ms只需要char类型的变量即可完成,但是,延迟100ms必须16位变量,那么执行时间还能照着公式去套算?
3、假设上述条件都一样,计算好的延迟时间是1ms并且误差1%,打开中断之后,延迟时间变成了5毫秒了。误差500%了,精确计算有意义吗?
4、假设上述条件不影响延迟时间,那么,编译器呢?谁敢说编译器不同的优化等级不影响delay的延迟时间?
5、还有硬件不同的情况,就需要重新计算了。比如晶振频率不同,CPU内核速度不同,STC8H单片机就比STC15快了很多了比89系列快了十几倍了。




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