单片机的基本时序
单片机的基本时序与《汇编语言》中讲的一致,分为振荡周期,时钟周期(状态周期),机器周期,指令周期。晶振相当于提供给单片机一个基础时钟单元,在这个基础上进行一系列电子元器件的动作。单片机常见的晶振有12MHZ,11.0592MHZ,6MHZ。
T指令=(1——4)T机器=6T时钟=12T振荡
单片机延时的实现方式
- 软件实现
软件实现是指单片机连续多次执行同一条空语句。C语言中通常用带有_NOP_( )的语句实现,如Delay10us()、Delay25us()等子函数实现。
void Delay10us(){
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
_NOP_( );
}
Delay10us()函数中执行6次_NOP_()语句,主函数调用该子函数时,先执行一个LCALL指令(2us),然后执行6次_NOP_( )语句(6us),最后执行RET指令(2us),所以共需要10us。`
Delay40us(){
Delay10us();
Delay10us();
Delay10us();
Delay10us();
}
在Delay40us()中直接调用4次Delay10us()函数,得到的延时时间为42us,执行过程如下:执行循环时先执行一次LCALL指令(2us),内部每次为10us,共为42us,执行完最后一个子循环之后,直接返回主程序。
Delay80us(){
Delay40us();
Delay40us();
}
上面的程序总延时时间为86us。只有最内层函数执行RET指令,该指令直接返回上级函数或主函数。如果Delay80us()中执行8次Delay10us()函数,则总延时时间为82us。
- 定时器实现
单片机系统一般常选用11.0592MHZ、12MHZ、6MHZ的晶振,第一种更容易产生各种标准的波特率。若定时器工作为方式2,则可实现极短时间的精确延时;如使用其他定时方式,则要考虑重装定时初值的时间(重装定时器初值占用2个机器周期)。
实际应用中,采用中断方式,使用T/C延时从程序的执行效率和稳定性来考虑最佳。C51编写的中断服务程序编译后会自动增加PUSH ACC、PUSH PSW、 POP PSW、POP ACC语句,执行时占用4个机器周期,如果程序中还有计数值+1 的语句,则又会占用1个机器周期,计算定时器初值时需要从初值中将这些时间减去达到最小误差的目的。