找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2478|回复: 15
收起左侧

有段单片机延时代码,请大神指导是如何计算时间的?

[复制链接]
ID:824397 发表于 2021-8-31 16:41 | 显示全部楼层 |阅读模式
20黑币
各位大神:小弟初接触单片机,以下一段代码,其中的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);
}



回复

使用道具 举报

ID:161164 发表于 2021-8-31 16:50 | 显示全部楼层
可用STC_ISP自动生成代码
2021-08-31_164928.png

评分

参与人数 1黑币 +20 收起 理由
szbadd + 20

查看全部评分

回复

使用道具 举报

ID:624769 发表于 2021-8-31 19:04 | 显示全部楼层
没有计算方法,C语言你就不要考虑了,除非你懂汇编。
然后查询该单片机的手册,查到DJNZ的机器周期,MOV的机器周期,然后根据晶振速率,算出需要多少个机器周期,然后算出用多少个DJNZ, 要精准的话,还要算上 MOV时间, RET时间, 和 CALL的时间。
回复

使用道具 举报

ID:624769 发表于 2021-8-31 19:08 | 显示全部楼层
STC的单片机,你可以用他的下载器自带的工具生成,其他的单片机,你能你把在KEIL上,加载该MCU的信息后,写一个大概的延时,然后DEBUG跑一下看看多少时间,在调整调整到你需要的时间。
回复

使用道具 举报

ID:883242 发表于 2021-8-31 20:08 | 显示全部楼层
这个不是算出来的,而是测出来的。
回复

使用道具 举报

ID:401564 发表于 2021-8-31 20:49 | 显示全部楼层
不同的单片机环境有不同的办法
如果是8051,在STC下载器那有现成的,选择好单片机型号和晶振,复制就可以了
PIC就有专门的uS,mS延时函数,程序开始的时候设定好晶振频率,直接调用函数就行,这比较省事 51hei截图20210831204559.png
回复

使用道具 举报

ID:624769 发表于 2021-8-31 20:53 | 显示全部楼层
Hephaestus 发表于 2021-8-31 20:08
这个不是算出来的,而是测出来的。

你还真说错了,这个就是算出来的。根据不同型号的芯片,while 语句所对应的汇编代码 DJNZ的周期数,然后计算出来的数值。
回复

使用道具 举报

ID:86450 发表于 2021-8-31 21:19 | 显示全部楼层
一般我是测出来
回复

使用道具 举报

ID:824397 发表于 2021-8-31 21:32 | 显示全部楼层
lkc8210 发表于 2021-8-31 16:50
可用STC_ISP自动生成代码

大神,我明白,原来是这样算出来的,太感谢了,
回复

使用道具 举报

ID:824397 发表于 2021-8-31 21:33 | 显示全部楼层
188610329 发表于 2021-8-31 19:04
没有计算方法,C语言你就不要考虑了,除非你懂汇编。
然后查询该单片机的手册,查到DJNZ的机器周期,MOV的 ...

谢谢你的回复,论坛有你更精采
回复

使用道具 举报

ID:824397 发表于 2021-8-31 21:34 | 显示全部楼层
188610329 发表于 2021-8-31 19:08
STC的单片机,你可以用他的下载器自带的工具生成,其他的单片机,你能你把在KEIL上,加载该MCU的信息后,写 ...

是的,谢谢你的回复,论坛有你更精采
回复

使用道具 举报

ID:824397 发表于 2021-8-31 21:34 | 显示全部楼层
Hephaestus 发表于 2021-8-31 20:08
这个不是算出来的,而是测出来的。

谢谢你,已解决
回复

使用道具 举报

ID:824397 发表于 2021-8-31 21:35 | 显示全部楼层
Y_G_G 发表于 2021-8-31 20:49
不同的单片机环境有不同的办法
如果是8051,在STC下载器那有现成的,选择好单片机型号和晶振,复制就可以了
...

嗯,你这个计算出来没有K值,谢谢你
回复

使用道具 举报

ID:824397 发表于 2021-8-31 21:36 | 显示全部楼层
188610329 发表于 2021-8-31 20:53
你还真说错了,这个就是算出来的。根据不同型号的芯片,while 语句所对应的汇编代码 DJNZ的周期数,然后 ...

谢谢你的参与
回复

使用道具 举报

ID:824397 发表于 2021-8-31 21:39 | 显示全部楼层
已解决,谢谢各位
回复

使用道具 举报

ID:390416 发表于 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系列快了十几倍了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表