51单片机的时钟(文末小惊喜)
初学单片机的人可能会有这样的疑问,单片机是怎么样工作的?它为什么能够按照我写的程序执行?而且一步都不会出错?这个问题想必困扰大家很久了,今天我就来跟大家聊聊为什么单片机能够工作。学过数字电子技术的同学可能知道时序电路这个东西,它是不是就是按照预定的步骤一步步的执行呢?每来一个脉冲,时序电路就会变换一次状态,只不过他的逻辑很简单,功能也很简单。但是呢,复杂的东西往往都是由简单的东西构成的。单片机也是这样的,每来一个脉冲,它内部的复杂时序电路就会变换状态,进而执行相应的操作。只不过单片机是个复杂的系统,各种时序电路,寄存器的组合,和我们数字电子技术学的时序电路完全不是一个等级,所以他的脉冲信号也多一些,下面我来给大家讲一下:
晶振
稍微了解一点51单片机的人都知道,51单片机最小系统中必不可少的部分是什么?电源、地、复位电路、晶振电路。好了就是这里,晶振!就是它提供了51单片机这个复杂时序电路的脉冲,是51单片机的心脏!,而XAL1和XAL2这两个引脚是时钟接入引脚,就是51的动脉。晶振产生的震荡输入到单片机中,就有了一个个脉冲信号,51内部的时序电路也就可以工作了。这一个个脉冲就叫做时钟信号,时钟信号的周期就叫做时钟周期,频率就叫做时钟频率。
时钟周期
时钟周期,又称为震荡周期,是为单片机提供定时信号的震荡源的周期,单片机最基本的时间单位,一般就是晶振电路得震荡周期。时钟频率越高,震荡周期越小,单片机运行速度越快,就如电脑的CPU什么可以加速到多少GHz一样。时钟周期Tosc=1/fosc.例如:震荡频率为12MHz的单片机即 fosc = 12MHz,那么震荡周期Tosc = 1/fosc= 1/12 us。有了时钟周期,就有了状态周期。
状态周期
状态周期是CPU从一个状态转换到另一状态所需要的时间。简单地说每个状态周期
Ts 分为两个震荡周期(时钟周期),即Ts = 2Tosc。然后就是机器周期。
机器周期
51单片机有固定的机器周期,一个机器周期包含六个状态例如,取指令、存储器读、存储器写等。即机器周期等于6个状态周期,而一个状态周期是2个时钟周期,因此一个机器周期又等于12个时钟周期。那么晶振频率为12MHz的单片机的机器周期 T = 12*Tosc = 1 us。
最后就是指令周期。
指令周期
顾名思义,指令周期就是执行一条指令所需的全部时间。MCS-51单片机的指令周期通常由 1 ~ 4 个机器周期组成。
讲到这里大家应该就明白了吧,时钟周期是最小的时间单位,一个状态周期是两个时钟周期,一个机器周期是6个状态周期,也就是12个时钟周期,而一个指令周期又是1-4个机器周期组成的。指令周期就是和51程序运行直接相关的。所以,小编认为,晶振是51单片机的“心脏”,而时钟信号呢,就是51单片机的“脉搏”。
小惊喜:
因为小编接触STC系列单片机比较多,所以特意整理了一些STC系列单片机的软件延时程序,希望可以帮到大家。
11.0592MHz晶振(延时1ms):
(1)Y1指令集,适用于SCT89C系列,STC90C系列、STC89LE系列、STC90LE系列
void Delay1ms() //11.0592MHz
{
unsigned char i, j;
_nop_();
i = 2;
j = 199;
do
{
while (--j);
} while (--i);
}
(2)Y3指令集,适用于STC12C系列、STC12LE系列、STC11F系列、STC11L系列、STC10F系列、STC10L系列、STC15F104E、STC15L104E、STC15F104EA、STC15L104EA
void Delay1ms() //11.0592MHz
{
unsigned char i, j;
nop();
i = 11;
j = 190;
do
{
while (–j);
} while (–i);
}
(3)Y5指令集,STC15F系列、STC15L系列、STC15W系列,但是不包Y3中的
void Delay1ms() //11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
_nop_();
i = 11;
j = 190;
do
{
while (--j);
} while (--i);
}
Y6指令集合,适用于STC8F系列、STC8A系列
void Delay1ms() //11.0592MHz
{
unsigned char i, j;
i = 15;
j = 90;
do
{
while (--j);
} while (--i);
}
这一期先分享到这里,后续再为大家整理更多的延时程序,希望能帮到大家。