找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1987|回复: 11
收起左侧

单片机程序怎么计算延时时间?

[复制链接]
ID:582255 发表于 2022-3-15 10:24 | 显示全部楼层 |阅读模式
void delay(unsigned int i)
{

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

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

使用道具 举报

ID:1009400 发表于 2022-3-15 11:22 | 显示全部楼层
这个延时,和编译器有关系,如果是汇编的代码,能看到指令,就能计算指令周期,准确的预计时间,你进入调试模式看看汇编代码,应该能够算出来
回复

使用道具 举报

ID:73435 发表于 2022-3-15 11:27 | 显示全部楼层
这种不精确,遇到中断就去执行中断了
回复

使用道具 举报

ID:401564 发表于 2022-3-15 12:50 | 显示全部楼层
这是C语言,C语言要先编译成汇编才能烧录到单片机中,不同的编译环境,编译成的汇编代码是不一样的
所以,这是没法计算的
对于STC,最简单省事的就是在下载器那复制
如果要精确的,那就用定时器
回复

使用道具 举报

ID:624769 发表于 2022-3-15 14:08 | 显示全部楼层
如果你用的 是 KEIL , 选择正确的芯片型号,以及设置了正确的晶振值之后……,

单独写一个 延时函数,编译后,Ctrl + F5, 然后运行到 延时函数前,看一下 左侧的 耗时 记住,然后继续运行到 延时函数结束, 记录左侧的耗时, 减一下,就是这个函数的耗费时间,以此为依据,酌情增减。51核的尽量用  while(--i);  可以确保编译出来时 DJNZ  那么只要看一下该芯片的 DJNZ指令的周期,就能算出确切的时间。
回复

使用道具 举报

ID:582255 发表于 2022-3-15 14:54 | 显示全部楼层
上面的这个延时,理论上是延时多少啊?12MHZ晶振
回复

使用道具 举报

ID:624769 发表于 2022-3-15 15:26 | 显示全部楼层
aktuan007 发表于 2022-3-15 14:54
上面的这个延时,理论上是延时多少啊?12MHZ晶振

不能光看晶振啊, 还有单片机型号阿, 同样这段代码,同样12MHz的晶振。
就说最常见的:
STC89C51, STC12C5608AD, STC15W408AS, STC8G1K08,  这4款单片机,跑出来的时间完全不一样。
回复

使用道具 举报

ID:582255 发表于 2022-3-15 15:47 | 显示全部楼层
188610329 发表于 2022-3-15 15:26
不能光看晶振啊, 还有单片机型号阿, 同样这段代码,同样12MHz的晶振。
就说最常见的:
STC89C51, STC ...

STC89C51的
回复

使用道具 举报

ID:624769 发表于 2022-3-15 16:36 | 显示全部楼层

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


选择 Y1  就是 STC89 对应时间。
回复

使用道具 举报

ID:624769 发表于 2022-3-15 16:55 | 显示全部楼层
最后给你补充一下,延时函数,你可以多层while函数嵌套,但是绝对不能用unsigned int, 必须要用unsigned char, 不然,你时间绝对算不准。
回复

使用道具 举报

ID:582255 发表于 2022-3-15 17:59 | 显示全部楼层
188610329 发表于 2022-3-15 16:55
最后给你补充一下,延时函数,你可以多层while函数嵌套,但是绝对不能用unsigned int, 必须要用unsigned ch ...

感谢感谢
回复

使用道具 举报

ID:896541 发表于 2022-3-16 11:03 | 显示全部楼层
单片机的延时程序通过执行指令来达到延时效果,这个时间等于执行的指令需要的时间,而一个指令需要的时间叫做指令周期,这个时间等于若干个机器周期。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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