找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机执行C语言时间计算

[复制链接]
跳转到指定楼层
楼主
1T模式,16M赫兹的单片机,在c语言编程做延时运算,使用do while结构void Delay200ms()                //@16MHz{
        unsigned char i, j, k;

        i = 13;
        j = 41;
        k = 198;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
这个时间是怎么推算出来的呀?




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

使用道具 举报

沙发
ID:97438 发表于 2017-9-29 16:32 | 只看该作者
根据运行一个指令的时间,然后计算这个程序运行了多少个指令。如果你用的是STC的单片机的话,它的那个下载工具里面有自动帮你计算的工具。
回复

使用道具 举报

板凳
ID:47286 发表于 2017-9-29 19:26 | 只看该作者
在c下写这种延时 设定好运行频率用c仿真 看经过多少时间 估计出来的 在c下全c的语句很难精确计算时间 不知道c怎么编译
回复

使用道具 举报

地板
ID:111634 发表于 2017-9-29 21:48 | 只看该作者
keil  c中,系统特殊寄存器组“Sys”中有一项“sec”和“states”,可查看程序执行时间和运行周期数。例如,执行到延时子程序时,记录进入该子程序的sec值,然后按过程单步键,快速执行该子程序完毕,再读取sec值,两者之差,即为该子程序执行时间。也可根据周期数states与图2-8中设置的晶振频率计算程序运行时间。以上摘自张志良编著《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学。
回复

使用道具 举报

5#
ID:223571 发表于 2017-9-29 22:07 | 只看该作者
luoluoluo136 发表于 2017-9-29 16:32
根据运行一个指令的时间,然后计算这个程序运行了多少个指令。如果你用的是STC的单片机的话,它的那个下载 ...

“根据运行一个指令的时间,然后计算这个程序运行了多少个指令。“这个我能理解;关键是指令语言是相对汇编而言,而不同结构的C语言反汇编会有不同的指令语句,那么我的问题就变成了:是否有一种直接的规则针对不同的C语言结构对应出相应的执行时间?
回复

使用道具 举报

6#
ID:223571 发表于 2017-9-29 22:10 | 只看该作者
luoluoluo136 发表于 2017-9-29 16:32
根据运行一个指令的时间,然后计算这个程序运行了多少个指令。如果你用的是STC的单片机的话,它的那个下载 ...

还有一个问题,关于你的第二个回答,这是STC芯片。这是一个已经存在的时间延时函数,假如我要用此芯片延时300us,该怎么进行修改,就在此模式下,就是说怎么计算?
回复

使用道具 举报

7#
ID:223571 发表于 2017-9-29 22:12 | 只看该作者
dzbj 发表于 2017-9-29 19:26
在c下写这种延时 设定好运行频率用c仿真 看经过多少时间 估计出来的 在c下全c的语句很难精确计算时间 不知 ...

这个其实在调试的时候,可以通过反汇编可以看到执行的时间,关键是怎么设计延时,假如我要延时300us该怎么搞?

回复

使用道具 举报

8#
ID:123289 发表于 2017-9-30 00:40 | 只看该作者
简单,编译器生成汇编后,就能看出来了。这样就可以增删了。
回复

使用道具 举报

9#
ID:236686 发表于 2017-9-30 01:42 | 只看该作者
有个调试的功能  keil  里面     可以看到花了多少时间
回复

使用道具 举报

10#
ID:164602 发表于 2017-9-30 08:33 | 只看该作者
这是个很专业的问题,我回答不了,但我知道怎么去找答案!
STC的下载软件,功能是很强大的,其中就有这个延时函数的自动生成功能。
在软件右上角,有很多功能的页面,其中就有“软件延时计算器”,我截个图,你自己看看。
当然,如果你是想自己掌握这个时间,那我就帮不了你了。

1.jpg (26.99 KB, 下载次数: 79)

1.jpg
回复

使用道具 举报

11#
ID:104472 发表于 2017-9-30 11:48 | 只看该作者
反编码,能够得到时间值;
回复

使用道具 举报

12#
ID:155507 发表于 2017-10-1 13:02 | 只看该作者

  1. void Delay300us()                //@16.000MHz
  2. {
  3.         unsigned char i, j;

  4.         i = 5;
  5.         j = 168;
  6.         do
  7.         {
  8.                 while (--j);
  9.         } while (--i);
  10. }
复制代码


  1. DELAY300US:                        ;@16.000MHz
  2.         NOP
  3.         PUSH 30H
  4.         PUSH 31H
  5.         MOV 30H,#4
  6.         MOV 31H,#183
  7. NEXT:
  8.         DJNZ 31H,NEXT
  9.         DJNZ 30H,NEXT
  10.         POP 31H
  11.         POP 30H
  12.         RET
复制代码
回复

使用道具 举报

13#
ID:207388 发表于 2017-10-10 15:30 | 只看该作者
void Delay300us()                //@16.000MHz
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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