生活上有很多東西都搭載著單片機而進行工作的,而且有相當一部分的設備、儀器、產(chǎn)品都是靠蓄電池來提供電源的,往往這些靠蓄電池供電的設備、儀器、產(chǎn)品都能夠用上一大段時間。例如我們經(jīng)常接觸到的遙控器,假若MCU一直不停地運行,不出一段時間,電池的能量會很快耗光。當然在8051系列單片機搭載的系統(tǒng)中,不光有單片機需要耗電,同時還有其他外圍部件耗電的,因此,我們在適當?shù)臅r候關閉設備的運行同時將8051系列單片機的運行模式進入空閑模式或者掉電模式,以節(jié)省不必要的能源,達到低功耗的目的。
平時8051系列單片機正常工作的電流為4毫安~7毫安;當8051系列單片機進入掉電模式下,它的工作電流小于1微安。由此可見,低功耗設備的功耗控制很有必要在適當?shù)臅r候將8051系列單片機運行在掉電模式。
【例子】要求MCU默認進入掉電模式,通過按鍵中斷來喚醒MCU,閃爍LED燈一段時間,然后MCU重新進入掉電模式。
中斷喚醒代碼:
1#include"stc.h"23#defineLED_PORTP2//定義LED控制端口為P2口45/********************************************6*函數(shù)名稱:Delay7*輸入:無8*輸出:無9*說明:延時一段時間10********************************************/11voidDelay(void)12{13unsignedchari,j;1415for(i=0;i<130;i++)16for(j=0;j<255;j++);17}18/********************************************19*函數(shù)名稱:PCONToPD20*輸入:無21*輸出:無22*說明:設置MCU模式為掉電模式23********************************************/24voidPCONToPD(void)25{26PCON=0x02;27}28/********************************************29*函數(shù)名稱:EXTInit30*輸入:無31*輸出:無32*說明:外部中斷初始化33********************************************/34voidEXTInit(void)35{36EX1=1;//允許外部中斷1中斷37IT1=0;//低電平觸發(fā)38EA=1;//允許所有中斷39}40/********************************************41*函數(shù)名稱:main42*輸入:無43*輸出:無44*說明:函數(shù)45********************************************/46voidmain(void)47{48unsignedchari;4950EXTInit();//外部中斷初始化5152while(1)53{54for(i=0;i<20;i++)//循環(huán)閃爍LED燈55{56LED_PORT=~LED_PORT;57Delay();58}5960PCONToPD();//進入掉電模式61}62}63/********************************************64*函數(shù)名稱:EXT1IRQ65*輸入:無66*輸出:無67*說明:外部中斷1中斷服務函數(shù)68********************************************/69voidEXT1IRQ(void)interrupt270{71//空操作,用于中斷喚醒MCU72}73
代碼分析
PCONToPD函數(shù)主要將當前單片機正常工作模式轉變?yōu)榈綦娔J剑?jié)省能耗。
在main函數(shù)中,進入while(1)死循環(huán)之前首先要對外部中斷進行初始化,當進入while(1)后第
一步首先進行LED閃爍操作,第二步就是將單片機正常工作模式轉變?yōu)榈綦娔J?,那么這時LED燈保持當前狀態(tài),直到單片機的工作方式為正常方式才會發(fā)生變化,即通過中斷來喚醒單片機,從掉電模式轉變?yōu)檎9ぷ髂J健?/p>
外部中斷1中斷服務函數(shù)EXT1IRQ中是空操作,其實這個函數(shù)是可有可無的,為什么這樣說呢?因為當外部中斷1被觸發(fā)時,單片機的內部機制會將其喚醒,從掉電模式轉變?yōu)檎9ぷ髂J?。所以外部中?中斷服務函數(shù)屬于軟件處理部分,在進入該函數(shù)之前,單片機模式已經(jīng)變更了。