1. 程式人生 > >微控制器 軟體延時時間控制

微控制器 軟體延時時間控制

微控制器 軟體延時時間控制

一、簡述

   記--通過程式碼方式實現軟體延時(不精確延時)。

二、指令週期

         微控制器需要一個時鐘訊號送給內部各個電路,才能使它們有節拍地協同工作。時鐘訊號的頻率是由外部震盪電路的晶振頻率決定的。

       外接晶振的頻率 = 時鐘訊號的頻率 = 工作頻率。(如24MHz,12MHz,11.0592MHz)

       震盪週期:為微控制器提供時鐘脈衝的振盪源的週期。

                          震盪週期 = 1/晶振頻率          (如晶振頻率是12MHz時,振盪週期 = 1/12MHz = (1/12)us)

       機器週期:51系列微控制器的一個機器週期由12個震盪週期組成。

                         機器週期 = 12 * 振盪週期      

                 (如晶振頻率是24MHz時,振盪週期 = 1/24MHz = (1/24)us,機器週期 = 12*(1/24)us = 0.5us)

                 (如晶振頻率是12MHz時,振盪週期 = 1/12MHz = (1/12)us,機器週期 = 12*(1/12)us = 1us)

                 (如晶振頻率是11.0592MHz時,振盪週期 = 1/12MHz = (1/11.0592)us,機器週期 = 12*(1/11.0592)us = 1.085us)

       指令週期:微控制器執行一條指令所用的時間。

                        一般來說,微控制器執行1個簡單的指令需要一個機器週期,執行復雜的指令需要兩個機器週期。

三、軟體延時

        通過一個迴圈來實現延時

       測試程式碼:

#include <reg51.h>

void delay(void)//延時函式
{
	unsigned char i;
	for(i=0; i<100; i++)
		;
}

void main(void)
{
	while(1)
	{
		//dosomething()
		delay();
	}
}

在Keil C51 環境下編譯後,點選"除錯"--"開始";在執行"檢視"--"反彙編",可以看到延時函式對應的彙編程式碼。

其中:

             CLR指令消耗1個機器週期

             MOV指令消耗1個機器週期

             INC指令消耗1個機器週期                                      

             CJNE指令消耗2個機器週期

根據迴圈條件,INC指令和CJNE指令總共要執行100次(0x64=100),共消耗機器週期(1+2)*100=300,

加上CLR指令和MOV指令,迴圈程式總共消耗機器週期:1+1+300=302

如果微控制器的晶振頻率為11.0592MHz,則機器週期 = 12*(1/11.0592)us = 1.085us。

那麼for迴圈程式耗時為302*1.085us=327.67us。

deley()函式用時:0.06607530s-0.000422209s=0.065653091s=65.653091ms=65653.091us   

(指令的執行時間不代表函式的執行時間。函式跳轉需要時間,開闢函式棧、臨時變數、回收棧資源等需要時間,因此c語言有內聯(inline)函式,巨集函式(帶參巨集)用來提高執行效率)。

兩層迴圈

#include <reg51.h>

void delay(void)//延時函式
{
	unsigned char i, j;
	for(i=0; i<100; i++)
		for(j=0; j<200; j++)
			;
}

void main(void)
{
	while(1)
	{
		//dosomething()
		delay();
	}
}

注:對於C語言編譯器,某些編譯器會進行程式碼優化,比如迴圈裡面什麼都沒做,編譯器有可能將迴圈去掉。

       軟體延時不精準:因為相當於是通過控制CPU做某一些預定消耗一定時間的動作,根據CPU執行完成判斷已經過去多長時間。但是CPU有可能在中途被其他程序強行佔用(優先順序高的程序),CPU被迫中斷當前執行,優先執行優先順序較高的任務,當執行完優先順序較高的任務,才回來繼續執行之前中斷的任務,那麼延時就會加長。比如想要延時1分鐘,我們預定執行A動作之後,剛好耗時1分鐘,那麼讓CPU執行這個動作就達到延時1分鐘。如果當CPU執行到一半時,突然有一個緊急任務S(優先順序高)發生,要求CPU立即處理,那麼CPU就會中斷當前任務A,優先處理緊急任務S,等待執行完畢,才回來繼續執行之前被中斷的任務A。那麼當A任務執行完畢,我們預期是從執行開始到結束消耗時間1分鐘,但是實際上已經過去不止1分鐘,因為中途被中斷了。所以軟體延時時間越長,容易被中斷,而且CPU不能長時間被一個程序獨佔,延時越不精準。

       要實現精確的延時可使用硬體延時:使用定時器/計數器。定時器/計數器是根據時鐘訊號脈衝計數的,是直接跟硬體晶振相關的。