标题: 关于延时函数 与 机器周期,问题请教。 [打印本页]

作者: csz9981    时间: 2017-1-15 22:15
标题: 关于延时函数 与 机器周期,问题请教。


void Delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
130*38=4940 个机器周期,就是10ms???  4940个机器周期,应该是  4940us  吧???


void Lcd1602_Delay1ms(uint c)   //误差 0us
{
    uchar a,b;
        for (; c>0; c--)
        {
                 for (b=199;b>0;b--)
                 {
                          for(a=1;a>0;a--);
                 }      
        }
            
}



200 个机器周期,就是1ms???  200 个机器周期,应该是  200us  吧???


我HC6800ES V2.0的板子,12MHZ的晶振,机器周期书上说是1us呀。

作者: 黄煌皇    时间: 2017-1-15 22:49
你可能需要先了解震荡周期、时钟周期、机器周期之间的关系
作者: 不倒翁.WZT    时间: 2017-1-16 07:19
标题: RE: 关于延时函数 与 机器周期,问题请教。
for(b=38;b>0;b--)并不是运行了38个周期,而是运行了38次,同理,for(a=130;a>0;a--)并不是运行了130个周期,而是运行了130次。这条指令可能是双周期指令,甚至更多。另外,10ms也就是随便一说。究竟延时是多少,可通过KEIL软件自带仿真功能测试一下。
作者: a627534198    时间: 2017-1-16 17:13
还与单片机所选的晶振有关系
作者: mengxia0510    时间: 2017-1-16 17:37
建议用定时器看看这个函数的运行时间
作者: jiajuntao    时间: 2017-1-17 08:28
延时时间,与单片机的时钟,指令,运行情况有关系,在熟悉资料的情况下,可以借助工具进行验证

作者: cam226390674    时间: 2017-1-18 14:19
需要先了解震荡周期
作者: lyl44    时间: 2017-1-18 14:20
双周期指令
作者: angmall    时间: 2017-1-27 17:32
void Delay10ms(void)   //误差 0us
{
    unsigned char a,b,c;
    for(c=1;c>0;c--)
        for(b=38;b>0;b--)
            for(a=130;a>0;a--);
}
计算分析:

程序共有三层循环

一层循环n:R5*2 = 130*2 = 260us DJNZ 2us

二层循环m:R6*(n+3) = 38*263 = 9994us DJNZ 2us + R5赋值 1us = 3us

三层循环: R7*(m+3) = 1*9997 = 9997us DJNZ 2us + R6赋值 1us = 3us

循环外: 5us 子程序调用 2us + 子程序返回 2us + R7赋值 1us = 5us

延时总时间 = 三层循环 + 循环外 = 9997+5 = 10002us =10.002ms

计算公式:延时时间=[(2*R5+3)*R6+3]*R7+5

//误差 2us

作者: ahshmj    时间: 2017-1-28 10:07
如果是12M的晶振,1个机器周期是1US,如果是6M晶振,1个机器周期是2US,4940*2个周期约等于10ms了。




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