找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3022|回复: 8
打印 上一主题 下一主题
收起左侧

MCU C语言延时函数{while(i--);}当i=1时为什麽等于10us?

[复制链接]
跳转到指定楼层
楼主
ID:468169 发表于 2021-4-29 23:16 来自手机 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
50黑币
晶振12M,  void delay(u16i)
{while(i--);}當i=1時為什麼等於10us?

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:468169 发表于 2021-4-29 23:17 来自手机 | 只看该作者
說錯了,晶振是12M,不是15M.
回复

使用道具 举报

板凳
ID:643071 发表于 2021-4-29 23:40 | 只看该作者
这个和晶振的频率有关系
回复

使用道具 举报

地板
ID:383215 发表于 2021-4-29 23:56 | 只看该作者
什么单片机?编译级别是什么?任何延时函数不同单片机的不同晶体不同编译级别的时间都不一样,想知道为什么只有看对应的汇编代码就清楚了。
回复

使用道具 举报

5#
ID:506248 发表于 2021-4-30 00:33 | 只看该作者
使用不同的芯片会用到不同的指令集,同一条指令运行所需的时钟周期也是不一样的,即便源代码完全一样生成的hex文件也一样的情况下,使用不同的单片机芯片使用完全相同的延时函数,具体的延时时间也会有差别的。以STC单片机为例,他的指令集就分Y1,Y3,Y5,Y6四种,我们常用的STC89C52RC采用的就是Y1指令集,而STC8F1K08采用的就是Y6指令集。以同样的一条指令NOP为例 STC89C52RC需要12个时钟周期  而STC8F1K08只需要1个时钟周期,这四种指令集速度是不一样的。所以楼主问的当i=1时为什麽等于10us? 真的没法说,因为不知道你指的是什么型号的单片机。你必须说出你的型号,才好针对具体问题具体分析。
以下附图说明各个指令集所需时钟周期(详情请看STC-ISP软件,截图只是其中一部分,说明相同指令在不同指令集下所需时钟周期是不一样的)




STC89C52RC采用的是Y1指令集,他的延时函数 i=1是延时7us  真找不到你说的 10us的,这里还多执行了一个i=1呢,想一想什么芯片比STC89C52RC
还慢呢?想不出来啊!

回复

使用道具 举报

6#
ID:912803 发表于 2021-4-30 06:05 | 只看该作者

           while(i--);
C:0x0090    EF       MOV      A,R7
C:0x0091    1F       DEC      R7
C:0x0092    AC06     MOV      R4,0x06
C:0x0094    7001     JNZ      C:0097
C:0x0096    1E       DEC      R6
C:0x0097    4C       ORL      A,R4
C:0x0098    70F6     JNZ      delay(C:0090)

因为你的单片机是12T的,也就是说12个时间周期才运行一个机器周期,
而一到三个机器周期为运行一个汇报代码,(详情请看单片机精灵)
延时函数由7个汇编代码组成(9us),加上跳转函数是8个(1us)
回复

使用道具 举报

7#
ID:879348 发表于 2021-4-30 08:01 | 只看该作者
因为你用的单片机太弱了,调用函数2us,while需要2us,,i--要1us,退出返回需要2us
回复

使用道具 举报

8#
ID:297320 发表于 2021-4-30 10:53 | 只看该作者
keil里面设置好晶振频率,debug一下,看看时间就知道了。延时的长短和你的单片机芯片选取有关。
回复

使用道具 举报

9#
ID:468169 发表于 2021-4-30 13:12 来自手机 | 只看该作者
kmsj 发表于 2021-4-29 23:56
什么单片机?编译级别是什么?任何延时函数不同单片机的不同晶体不同编译级别的时间都不一样,想知道为什么 ...

STC89C52RC
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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