标题: 看不懂毫秒的单片机延时程序,为什么不能这样(我的想法) [打印本页]

作者: ylthpl    时间: 2023-2-10 11:30
标题: 看不懂毫秒的单片机延时程序,为什么不能这样(我的想法)
void delay_ms(u16 ms)
{
        u16 i,j;
        for(i=ms;i>0;i--);
        for(j=110;j>0;j--);
}
我的想法:
void delay_ms(u16 ms)
{
while(us--);
}


作者: ylthpl    时间: 2023-2-10 11:31

void delay_ms(u16 ms)
{
        u16 i,j;
        for(i=ms;i>0;i--);
        for(j=110;j>0;j--);
}
我的想法:
void delay_ms(u16 ms)
{
while(ms--);
}

作者: a185980800    时间: 2023-2-10 12:19
这到微秒级了
作者: ldc2000    时间: 2023-2-10 12:53
ylthpl 发表于 2023-2-10 11:31
void delay_ms(u16 ms)
{
        u16 i,j;

那个U16你要是定义成长整型到是可以。
不考虑浪费资源和每次延时都得敲一堆数字的话,而且你这里的MS代表微秒
作者: munuc_w    时间: 2023-2-10 14:29
软件延时是不准的,是根据执行的指令周期计算延时时间,这要看编译后的汇编指令。
作者: yxtao    时间: 2023-2-10 15:52
这种延时是要看硬件来估算的,j=110那行本就是估算的结果,你写的那个估算这一步都没有,单片机咋知道你要延时多久

作者: 最后一个夏天1    时间: 2023-2-10 16:28
因为那是软件延时,人家那是通过计算次才得出来的,传入参数就可以得到粗略的延时。你的想法只是单纯延时
作者: Hephaestus    时间: 2023-2-10 16:55
没人发现第一个for语句后面多写了一个;导致延迟根本就不对吗?
作者: coody_sz    时间: 2023-2-10 22:02
楼主不理解一个循环的时间。
作者: hjc5035    时间: 2023-2-11 09:41


void delay_ms(u16 ms)
{
        u16 i,j;
        for(i=ms;i>0;i--)                                                   //;
        for(j=110;j>0;j--);
}

这才是ms毫秒的延时
这个延时是不是很精确取决于编译器将C语言转换成汇编后的汇编语言情况,还有时钟精确度,晶振一般精度高,RC精度要低。
作者: Marconi工作室    时间: 2023-2-11 18:44
可以,数据有范围的
作者: qsssuv    时间: 2023-2-11 19:41
不是说变量取名叫ms,它减1就真的是过去1ms了,哈哈
作者: cheney03    时间: 2023-2-13 09:28

void delay_ms(u16 ms)
{
        u16 i,j;
        for(i=ms;i>0;i--);
        for(j=110;j>0;j--);
}
这个是软件延时,要根据MCU的时机器周期计算。
u16的范围是0~65535,若ms为1ms,则最大可延时0~65535ms。
void delay_ms(u16 ms)
{
while(us--);
}
这个程序也有错,两个参数ms,us。若us为1us,则最大可延时0~65535us。
延时时间大于66ms,这个程序就不通用了,第一个程序也便于理解
精确延时请用定时器
作者: ankangyu    时间: 2023-2-17 14:02
机械延时,两个for嵌套更精准。
作者: ylthpl    时间: 2023-3-4 16:48
你们都好厉害我应该懂了




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