標(biāo)準(zhǔn)51單片機(jī)是12T的,就是說12個時鐘周期(晶振周期,例如12M的,周期是1/12M,單位秒),機(jī)器做一個指令周期,剛好就是1/12M*12=1uS,常見指令例如_nop_就是一個周期,剛好1uS,其他的大多多于一個周期,乘除法更多。所以如果計算指令時間可以這樣算。
而現(xiàn)在很多51核的單片機(jī)工藝質(zhì)量上去后,頻率大大提高,增強(qiáng)型51有6T的,如果接12M的話,一個nop就只需要0.51uS,如果是STC的部分單片機(jī)1T的話,那只需要1/12uS。
單片機(jī)的晶振不是隨便選,要看技術(shù)手冊,看最高頻率,看支持類型等等。一般12M,接串口的話11.0592M。如果是PIC,很多4M,8M。
不是越高越好,對很多不需要大量處理,只是控制的情況,為了增加可靠性,降低編程難度,降低功耗,往往可選用低頻的,例如實時時鐘的32768晶振。
故 計算nT單片機(jī)的指令周期公式為:
T = 1/晶振周期*n
例如: 使用12M晶振的1T單片機(jī)的指令周期為: T = 1 / 12 * 1 = 1 / 12 us
/***********************************************************************/
/*******************下面是單片機(jī)的幾個周期的介紹****************/
/***********************************************************************/
(1)時鐘周期 又名 振蕩周期: 定義為時鐘頻率的倒數(shù),可以理解為單片機(jī)外界晶振的倒數(shù)。在一個時鐘周期內(nèi),CPU僅完成一個最基本的動作。對于某個單片機(jī)來講,若采用了1MHZ的時鐘頻率,則時鐘周期就是1us;若采用了4MHZ的時鐘頻率,則時鐘周期就是250ns。由于時鐘脈沖是CPU的基本工作脈沖,它控制著CPU的工作節(jié)奏。對于同一種單片機(jī),時鐘頻率越高,單片機(jī)的工作速度就越快。我們使用的STC89C系列單片機(jī)的時鐘范圍約在1——40MHZ。
(2)狀態(tài)周期:狀態(tài)周期是時鐘周期的兩倍。
(3)機(jī)器周期:單片機(jī)的基本操作周期,在一個操作周期內(nèi),單片機(jī)完成一項基本操作,如取指令、存儲器讀寫等。它由12個時鐘周期(6個狀態(tài)周期)組成。
(4)指令周期:它是指CPU執(zhí)行一條指令所需要的時間。一般一個指令周期含有1——4個機(jī)器周期。
/*****************************************************************/
/************1T和12T單片機(jī)的編程所需要注意的************/
/****************************************************************/
定時器部分不用改。1T單片機(jī)的計時器是兼容傳統(tǒng)12T單片機(jī)的。也就是說只是執(zhí)行一般的指令會快12倍,但是它的定時器卻是先進(jìn)行12分頻,再計時的,與原來的一樣。只是用軟件延時的話,就要改。
/****************************************************************/
/**************1T和12T單片機(jī)軟件延時程序?qū)嵗龑Ρ?******/
/*****************************************************************/
1.對于使用12M晶振的12T單片機(jī),如:STC90C52RC
延時n個10us的程序:
[objc] view plain copy print?
void DelayXus(unsigned char n)
{
while( n-- )
{
_nop_();
_nop_();
}
}
2.而對于使用12M晶振的1T單片機(jī),如:STC12C5206AD
延時n個1us的程序
[objc] view plain copy print?
void DelayXus(unsigned char n)
{
while( n-- )
{
_nop_();
_nop_();
}
}
對比可見,相同的程序在不同時鐘周期的單片機(jī)下延時是不同的,所以當(dāng)我們在不同時鐘周期的單片機(jī)中移植程序的時候要注意軟件延時需要修改成適當(dāng)?shù)某绦?,否則會造成不必要的錯誤。