51单片机学习——delay函数

delay函数

常用于不太精确定时器数量少时的替代

delay函数

while循环
for循环

while循环

while(bool)  
    {  
        statement  
    }

bool判断 :bool认为非零和非空的值假定为 true,把零或 null 假定为 false。null一个内部为空的容器可看作0。
while先判断后循环,为false时,statement模块不被执行,跳出while循环。

while(xms--)
{
            _nop_()
    i = 2;
    j = 199;
    do
    {
        while(--j);
    }while(--i);
}

xms--
既xms = xms-1 先赋值定义再运算,该函数在while 和 for 循环中依旧适用。

do
{
       statement
}while(bool);

do while 循环
do while 循环先进行{stament}的运算再进行while判断。即bool判断为false也先执行statement一次。

计算原理

机器周期:单片机的基本操作周期,在一个操作周期内,单片机完成一项基本操作,如取指令、存储器读/写等。

机器周期=6个状态周期=12个时钟周期。

时钟周期(振荡周期) = 晶振的倒数。时钟周期是单片机的基本时间单位,两个振荡周期(时钟周期)组成一个状态周期。

指令周期:CPU执行一条指令所需要的时间称为指令周期,它是以机器周期为单位的。

状态周期:在8051单片机中把一个时钟周期定义为一个节拍(用P表示),二个节拍定义为一个状态周期(用S表示)。一个状态周期等于两个时钟周期。
C语言中没有_nop_()函数。在51C中一般包含在#include "intrins.h" 头文件中。该函数是在51单片机中用的延时函数,表示执行一条没有什么意义的指令,延时一个指令周期,有的指令周期是两个或两个以上的机械周期,但是_nop_()指令需要的只是一个机械周期也就是12个时钟周期(震荡周期)。
以STM89c51rc单片机为例,它有固定的机器周期,一个机器周期包含六个状态例如,取指令、存储器读、存储器写等。即机器周期等于6个状态周期,而一个状态周期是2个时钟周期,因此一个机器周期又等于12个时钟周期。那么晶振频率为12MHz的的单片机的机器周期 T = 12*Tosc = 1 us。如果只用的是12MHZ的晶振,那么 一个机械周期就是1us;也就是说:_nop_(); 指令的延迟时间为 1us。 而对于晶振频率为11.0592MHz的的单片机_nop_();指令的延迟时间需2个机器周期为 2us(实际为2.1701us)
延时时间=机器周期xms2(for循环执行所需的机器周期)
显然219912/11.059222=1,727.4305556微秒=1.727ms却被认为为1ms,

可见delay函数因晶振的不同而发生误差,是一种不精确的延时

posted @ 2024-04-12 16:43:30 solity_top 阅读(82) 评论(0)
发表评论
昵称
邮箱
网址