标题: 单片机延时函数疑问 [打印本页]

作者: Mang0    时间: 2023-4-17 13:57
标题: 单片机延时函数疑问
1.void delay(uint x)           //延时函数
{
     uint i,j;
         for(i=x;i>0;i--)
            for(j=0;j<110;j++);  
}
2.void Delay(unsigned int k)                //@11.0592MHz
{
        unsigned char i, j;

for(;k>0;k--)
        i = 2;
        j = 103;
                do
                {
         while (--j);
        } while (--i);
}
想问问for循环和do循环有什么区别,下面一个是stc里面的延时函数。
同时问问为什么第二个能延时1ms?i和j都代表什么?


作者: Hephaestus    时间: 2023-4-17 15:26
具体到你的代码,for和while循环没有区别。i和j代表延迟时间。
作者: man1234567    时间: 2023-4-17 16:06
实际上这些所谓的延时就是让系统空转,由于不同的芯片在不同的主频下速度不同,如果要非常精确的延时你懂的(通常用外接晶振+示波器辅助)。
两者最直观的区别是:for循环是先判断后执行,do循环是先执行后判断。
作者: Mang0    时间: 2023-4-18 13:04
man1234567 发表于 2023-4-17 16:06
实际上这些所谓的延时就是让系统空转,由于不同的芯片在不同的主频下速度不同,如果要非常精确的延时你懂的 ...

明白了
作者: Mang0    时间: 2023-4-18 13:07
Hephaestus 发表于 2023-4-17 15:26
具体到你的代码,for和while循环没有区别。i和j代表延迟时间。

那他这个i和j怎么算出来延时1ms的呢?
作者: Hephaestus    时间: 2023-4-18 13:24
Mang0 发表于 2023-4-18 13:07
那他这个i和j怎么算出来延时1ms的呢?

不用算,实测就行了。
作者: li64331218    时间: 2023-4-18 13:46
仿真的时候看一下下边运行时间,执行每条语句应该有时间显示,从而估算变量的数值
作者: angmall    时间: 2023-4-18 14:33
毫秒级延时直接用定时器
看性能需要,性能高要求的用中断吧,别让他傻等,本来51性能就不好,傻等的话更没效率了
还有硬件不同的情况,就需要重新实测了。比如晶振频率不同,CPU内核速度不同,STC8H单片机就比STC15快了很多了比89系列快了十几倍了。
作者: rctty    时间: 2023-4-18 14:53
强制延时不可靠,不同单片机频率不一样这个i,j的值就会不一样,一般可以用示波器测量翻转的IO口来测出i,j的值,还有一个风险点,强制延时可能会被中断干扰,精确延时应该用定时器进行延时
作者: Y_G_G    时间: 2023-4-18 22:09
1,长延时不要用软件来进行延时,要学会用定时器
2,如果是简单程序,不想折腾,可以直接复制STC下载器的代码,那个很准确的
3,就算是一样品牌的单片机,就像STC,不同型号单片机之间,一样的C代码,延时的时间都是不一样的
4,C语言的循环和实际的延时时间没有什么对等的关系,不存在"怎么计算延时"这一说法,除非是单片机公司专用的编译环境提供的延时函数,像PIC这样的,它就有专用的延时函数
作者: 杨广老贼    时间: 2023-4-19 01:21
并没有什么区别
作者: gb302    时间: 2023-4-19 08:59
机器周期、指令周期、时钟周期这些了解一下,你就明白了
作者: ankangyu    时间: 2023-4-19 10:35
for是知道循环次数的情况下使用,while是不知道循环次数的情况下用,for是执行完循环继续执行其他指令,while是不满足循环条件才退出执行,如果满足循环条件则一直执行循环
作者: Mang0    时间: 2023-4-19 15:19
谢谢各位的解答,统一表达一下谢意




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