當前位置:首頁 > 嵌入式培訓 > 單片機學習 > 單片機教程 > 單片(pian)機(ji)延(yan)(yan)時方法(fa) 51單片(pian)機(ji)精確延(yan)(yan)時操作詳解(jie)
 單片機(ji)延時方法 51單片機(ji)精確延時操作(zuo)詳解
							時間:2018-07-25      來源:未知(zhi)
							單片機(ji)延時方法 51單片機(ji)精確延時操作(zuo)詳解
							時間:2018-07-25      來源:未知(zhi) 
							單片機延時方(fang)法(fa) 51單片機精確延時操作詳解
實(shi)現延時(shi)的(de)(de)方法有兩(liang)種:一(yi)種是(shi)(shi)硬件(jian)延時(shi),另一(yi)種是(shi)(shi)計時(shi)器(qi)/計數器(qi)。該方法既能(neng)提(ti)高CPU的(de)(de)效率,又能(neng)實(shi)現準確的(de)(de)延時(shi),另一(yi)方面是(shi)(shi)軟件(jian)延時(shi)。該方法主要采用循環體。今(jin)天主要介(jie)紹軟件(jian)延時(shi),對硬件(jian)延時(shi),然(ran)后對定時(shi)器(qi)部(bu)分(fen)進行詳(xiang)細的(de)(de)說明。
單片機周(zhou)期(qi)介紹:
在電子技術中(zhong),脈(mo)沖信號(hao)(hao)是(shi)一個按一定(ding)電壓幅度,一定(ding)時(shi)間間隔連續發出的(de)(de)脈(mo)沖信號(hao)(hao)。脈(mo)沖信號(hao)(hao)之(zhi)間的(de)(de)時(shi)間間隔稱為周(zhou)期(qi);而將在單位時(shi)間(如1秒)內所產(chan)生(sheng)的(de)(de)脈(mo)沖個數(shu)稱為頻率(lv)。頻率(lv)是(shi)描述(shu)周(zhou)期(qi)性循環信號(hao)(hao)(包括脈(mo)沖信號(hao)(hao))在單位時(shi)間內所出現的(de)(de)脈(mo)沖數(shu)量(liang)多少的(de)(de)計量(liang)名稱;頻率(lv)的(de)(de)標準(zhun)計量(liang)單位是(shi)Hz(赫)。電腦中(zhong)的(de)(de)系統時(shi)鐘就是(shi)一個典型(xing)的(de)(de)頻率(lv)相當(dang)精確和穩(wen)定(ding)的(de)(de)脈(mo)沖信號(hao)(hao)發生(sheng)器(qi)。
指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)周(zhou)(zhou)(zhou)(zhou)期(qi):CPU執(zhi)行一條指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)所需(xu)要的(de)(de)時間稱(cheng)為指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)周(zhou)(zhou)(zhou)(zhou)期(qi),它是(shi)以(yi)機(ji)器(qi)(qi)周(zhou)(zhou)(zhou)(zhou)期(qi)為單(dan)位(wei)的(de)(de),指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)不同,所需(xu)的(de)(de)機(ji)器(qi)(qi)周(zhou)(zhou)(zhou)(zhou)期(qi)也不同。對(dui)于(yu)一些簡單(dan)的(de)(de)的(de)(de)單(dan)字節指(zhi)(zhi)(zhi)(zhi)令(ling)(ling),在(zai)取(qu)(qu)指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)周(zhou)(zhou)(zhou)(zhou)期(qi)中,指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)取(qu)(qu)出到指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)寄存器(qi)(qi)后,立即(ji)譯碼執(zhi)行,不再(zai)需(xu)要其它的(de)(de)機(ji)器(qi)(qi)周(zhou)(zhou)(zhou)(zhou)期(qi)。對(dui)于(yu)一些比較復雜的(de)(de)指(zhi)(zhi)(zhi)(zhi)令(ling)(ling),例如轉移指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)、乘(cheng)法指(zhi)(zhi)(zhi)(zhi)令(ling)(ling),則需(xu)要兩(liang)個(ge)或者(zhe)兩(liang)個(ge)以(yi)上的(de)(de)機(ji)器(qi)(qi)周(zhou)(zhou)(zhou)(zhou)期(qi)。通(tong)常(chang)含一個(ge)機(ji)器(qi)(qi)周(zhou)(zhou)(zhou)(zhou)期(qi)的(de)(de)指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)稱(cheng)為單(dan)周(zhou)(zhou)(zhou)(zhou)期(qi)指(zhi)(zhi)(zhi)(zhi)令(ling)(ling),包含兩(liang)個(ge)機(ji)器(qi)(qi)周(zhou)(zhou)(zhou)(zhou)期(qi)的(de)(de)指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)稱(cheng)為雙周(zhou)(zhou)(zhou)(zhou)期(qi)指(zhi)(zhi)(zhi)(zhi)令(ling)(ling)。
1、時鐘(zhong)周(zhou)(zhou)期(qi):也(ye)稱為振(zhen)(zhen)蕩周(zhou)(zhou)期(qi),一個(ge)(ge)時鐘(zhong)周(zhou)(zhou)期(qi) = 晶(jing)振(zhen)(zhen)的(de)倒數。對于單片機(ji)時鐘(zhong)周(zhou)(zhou)期(qi),時鐘(zhong)周(zhou)(zhou)期(qi)是單片機(ji)的(de)基本時間單位,兩個(ge)(ge)振(zhen)(zhen)蕩周(zhou)(zhou)期(qi)(時鐘(zhong)周(zhou)(zhou)期(qi))組成一個(ge)(ge)狀態周(zhou)(zhou)期(qi)。
2、機器周期:單片(pian)(pian)機的基本操(cao)作(zuo)周期,在(zai)一個(ge)操(cao)作(zuo)周期內(nei),單片(pian)(pian)機完(wan)成(cheng)一項基本操(cao)作(zuo),如取指令、存儲器讀/寫等(deng)。
3、機器周期=6個狀態周期=12個時鐘(zhong)周期。
51單(dan)(dan)片機的(de)(de)指(zhi)(zhi)令有(you)單(dan)(dan)字節、雙字節和(he)三字節的(de)(de),它們的(de)(de)指(zhi)(zhi)令周(zhou)(zhou)期(qi)(qi)不盡相同,一個(ge)單(dan)(dan)周(zhou)(zhou)期(qi)(qi)指(zhi)(zhi)令包含一個(ge)機器(qi)周(zhou)(zhou)期(qi)(qi),即12個(ge)時(shi)鐘(zhong)周(zhou)(zhou)期(qi)(qi),所(suo)以一條單(dan)(dan)周(zhou)(zhou)期(qi)(qi)指(zhi)(zhi)令被執行所(suo)占時(shi)間為12*(1/ 晶(jing)振(zhen)頻率)= x μs。常用單(dan)(dan)片機的(de)(de)晶(jing)振(zhen)為11.0592MHz,12MHz,24MHz。其中11.0592MHz的(de)(de)晶(jing)振(zhen)更容易產生各種標準的(de)(de)波特率,后兩種的(de)(de)一個(ge)機器(qi)周(zhou)(zhou)期(qi)(qi)分別(bie)為1 μs和(he)2 μs,便(bian)于精(jing)確延時(shi)。
接下來(lai)列出這三種不同的(de)晶振(zhen)的(de)延時(shi)函數(shu)
1、 11.0592MHz
//N ms延(yan)時(shi)
void delay_ms(uint n)
{
uint i,j;
for(i=n;i>0;i–)
for(y=114;y>0;y–);
}
2、12MHz晶振(zhen)
//延時n毫秒
void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
  for(i=0;i
for(j=0;j<123;j++);
}12345678
//延時(shi)n秒
void delay_m(unsigned int n)
{
unsigned int i=0,j=0;
  for(i=0;i
for(j=0;j<21738;j++);
}12345678
//延時10*n微(wei)秒
void delay_10um(unsigned int n)
{
while(n--);
}12345
3、24MHz晶(jing)振
//延時(shi)n毫秒
void delay_ms(unsigned int n)
{
unsigned int i=0,j=0;
for(i=0;i
//延時(shi)n秒
void delay_s(unsigned int n)
{
unsigned int i=0,j=0;
  for(i=0;i
for(j=0;j<54053;j++);
} 1234567
//延(yan)時10*n微秒
void delay_10us(unsigned int n)
{
unsigned int i=0;
char j=0;
  for(i=0;i
for(j=0;j<2;j++);
} 12345678
建(jian)議大家封裝為頭文件,可以方便的調用。
接下來介(jie)紹幾個自動適應主時鐘的延時函數
//參數:ms,要延時的ms數,自動(dong)適應主(zhu)時鐘
#define MAIN_Fosc 11059200UL //定(ding)義主時(shi)鐘HZ
typedef unsigned int INT16U;
void delay_ms(INT16U ms) //INT16U 等(deng)價于 unsigned int
{
INT16U i;
do{
i=MAIN_Fosc/9600;
while(--i); //96T per loop
}while(--ms); //--ms ms=ms-1
} 123456789101112
//5us 延(yan)時函(han)數,自動適應(ying)主時鐘
#define MAIN_Fosc 11059200UL //定義(yi)主時(shi)鐘HZ
void delay5us()
{
#if MAIN_Fosc == 11059200
_nop_();
#elif MAIN_Fosc == 12000000
_nop_();
#elif MAIN_Fosc == 22118400
_nop_(); _nop_(); _nop_();
#elif
} 12345678910111213
單片機(ji)中還可自動生成
//11.0592MHZ延時100微秒
void Delay100us() //@11.0592MHz
{
unsigned char i, j;
_nop_();
_nop_();
i = 2;
j = 15;
do
{
while (--j);
} while (--i);
}
1234567891011121314
//100US
void Delay100us() //@12.000MHz
{
unsigned char i, j;
i = 2;
j = 39;
do
{
while (--j);
} while (--i);
}
123456789101112
//100US
void Delay100us() //@24.000MHz
{
unsigned char i, j;
i = 3;
j = 82;
do
{
while (--j);
} while (--i);
}

