乙個nop是延時多少 51微控制器的幾種精確延時

2021-10-16 05:52:23 字數 2289 閱讀 2002

實現延時通常有兩種方法:一種是硬體延時,要用到定時器/計數器,這種方法可以提高cpu的工作效率,也能做到精確延時;另一種是軟體延時,這種方法主要採用迴圈體進行。 今天主要介紹軟體延時,關於硬體延時,之後定時器部分再做詳細說明。

首先介紹微控制器的幾個週期

在電子技術中,脈衝訊號是乙個按一定電壓幅度,一定時間間隔連續發出的脈衝訊號。脈衝訊號之間的時間間隔稱為週期;而將在單位時間(如1秒)內所產生的脈衝個數稱為頻率。頻率是描述週期性迴圈訊號(包括脈衝訊號)在單位時間內所出現的脈衝數量多少的計量名稱;頻率的標準計量單位是hz(赫)。電腦中的系統時鐘就是乙個典型的頻率相當精確和穩定的脈衝訊號發生器。

指令週期:cpu執行一條指令所需要的時間稱為指令週期,它是以機器週期為單位的,指令不同,所需的機器週期也不同。對於一些簡單的的單位元組指令,在取指令週期中,指令取出到指令暫存器後,立即解碼執行,不再需要其它的機器週期。對於一些比較複雜的指令,例如轉移指令、乘法指令,則需要兩個或者兩個以上的機器週期。通常含乙個機器週期的指令稱為單週期指令,包含兩個機器週期的指令稱為雙週期指令。

時鐘週期:也稱為振盪週期,乙個時鐘週期 = 晶振的倒數。對於微控制器時鐘週期,時鐘週期是微控制器的基本時間單位,兩個振盪週期(時鐘週期)組成乙個狀態週期。

機器週期:微控制器的基本操作週期,在乙個操作週期內,微控制器完成一項基本操作,如取指令、儲存器讀/寫等。

機器週期=6個狀態週期=12個時鐘週期。

51微控制器的指令有單位元組、雙位元組和三位元組的,它們的指令週期不盡相同,乙個單週期指令包含乙個機器週期,即12個時鐘週期,所以一條單週期指令被執行所佔時間為12*(1/ 晶振頻率)= x μs。常用微控制器的晶振為11.0592mhz,12mhz,24mhz。其中11.0592mhz的晶振更容易產生各種標準的波特率,後兩種的乙個機器週期分別為1 μs和2 μs,便於精確延時。

接下來列出這三種不同的晶振的延時函式

1、 11.0592mhz

//n ms延時

void delay_ms(uint n)

2、12mhz晶振

//延時n毫秒void delay_ms(unsigned int n)

unsigned int i=0,j=0;

for(i=0;i

for(j=0;j<123;j++);

//延時n秒void delay_m(unsigned int n)

unsigned int i=0,j=0;

for(i=0;i

for(j=0;j<21738;j++);

//延時10*n微秒void delay_10um(unsigned int n)

while(n--);

3、24mhz晶振

//延時n毫秒

void delay_ms(unsigned int n)

while(--ms);       //--ms  ms=ms-1  

//5us 延時函式,自動適應主時鐘  #define main_fosc        11059200ul    //定義主時鐘hz  

void delay5us()  

#if main_fosc == 11059200  

_nop_();  

#elif main_fosc == 12000000  

_nop_();  

#elif main_fosc == 22118400  

_nop_(); _nop_(); _nop_();  

#elif  

微控制器中還可自動生成

延時100微秒

void delay100us()       

unsigned char i, j;

_nop_();

_nop_();

i = 2;

j = 15;

dowhile (--j);

} while (--i);

//100us

void delay100us()       

unsigned char i, j;

i = 2;

j = 39;

dowhile (--j);

} while (--i);

//100us

void delay100us()       

unsigned char i, j;

i = 3;

j = 82;

dowhile (--j);

} while (--i);

51微控制器延時函式

c程式中可使用不同型別的變數來進行延時設計。經實驗測試,使用unsigned char型別具有比unsigned int更優化的 在使用時應該使用unsigned char作為延時變數。以某晶振為12mhz的微控制器為例,晶振為12mhz即乙個機器週期為1us。一.500ms延時子程式 程式 voi...

51微控制器延時函式

c程式中可使用不同型別的變數來進行延時設計。經實驗測試,使用unsigned char型別具有比unsigned int更優化的 在使用時應該使用unsigned char作為延時變數。以某晶振為12mhz的微控制器為例,晶振為12mhz即乙個機器週期為1us。一.500ms延時子程式 程式 voi...

51微控制器延時計算

若時鐘晶振的振盪頻率為fosc,則振盪週期 tosc 1 fosc 如 晶振頻率為12mhz,則振盪週期 tosc 1 12us 對於不同的晶元採用的機器週期各不相同,主要分為 12t 6t 4t 1t等等。如51系列微控制器常見的12t機器週期,每個機器週期占用時間為 12 時鐘週期 依此類推,6...