重點學習51單片機工作在空閑模式。
1、進入空閑模式的方法
通過將PCON寄存器中的IDLE置1,CPU就會進入空閑模式。在空閑模式中,程序停止執行,RAM中的數據仍然保持,晶振繼續工作,但與CPU斷開,定時器和串行口繼續工作。一旦定時器中斷、串口中斷,外部中斷或復位,CPU將退出空閑模式,執行完中斷程序后,CPU將從程序原來停止的地方繼續執行。
電源控制寄存器PCON: SMOD,-,-,-,GF1,GF0,PDWN,IDLE
SMOD:串行口通訊波特率控制位;
GF1:通用標志位1;
GF0:通用標志位2;
PDWN:低功耗標志位,置位,則進入低功耗模式;
IDLE:空閑標志位,置位,則進入空閑模式;
2、使用定時器0中斷令CPU退出空閑模式
程序如下:
如果將main()中的“timer0_initializtion();”屏蔽掉,程序運行時,CPU無法從“空閑模式”退出,LED燈一直熄滅。若使用main()中的“timer0_initializtion();”,CPU進入空閑模式后,當定時器0產生中斷,CPU會退出“空閑模式”,執行完定時器中斷后,LED燈就被點亮。
#define?Enter_IDLE_Mode() ?PCON=PCON|0x01
#define?OSC_FREQ ?????????12000000L ?????//定義晶振頻率為12MHz;
#define?T0_Load_Value ??????(65536-50000) ??//配置T0為50000us中斷一次;
sbit?LED = P1^0;??//低電平點亮LED
//函數功能: Timer0的中斷服務函數,每50000us中斷一次;
void?timer0_interrupt_program() interrupt?1 using 1
{ TL0=T0_Load_Value; ????//手動裝載初值;
??TH0=T0_Load_Value>>8;
}
}
//函數功能: Timer0初始化;
void?timer0_initializtion(void)
{ TMOD&= 0xF4; ?????????//設置GATE0=0,即不允許外部INT0腳控制Timer0;
??TMOD|= 0x01; ????//配置Timer0為方式1(16位定時器);
??TL0=T0_Load_Value; ???//手動裝載初值;
??TH0=T0_Load_Value>>8;
??TR0=1; ???????????????//當GATE0=0時,TR0=1,表示啟動T0開始工作;
??ET0=1; ???????????????//允許Timer0中斷;
??EA=1; ????????????????//開總中斷允許位;
}
void?main(void)
{
timer0_initializtion(); //Timer0初始化;
//若屏蔽掉“timer0_initializtion();”,則LED一直熄滅。
//若使用“timer0_initializtion();”,則LED會被點亮。
LED=1;//關燈
??Enter_IDLE_Mode();
//進入空閑模式
//等待定時器中斷
LED=0;//開燈??
while(1)
{ _nop_();
}
}