重點學習51單片機工作在睡眠模式。
1、進入“睡眠模式”的方法
通過將PCON寄存器中的PDWN置1,則CPU會進入“睡眠模式”。在“睡眠模式”中,晶振將停止工作,因此,定時器和串口都將停止工作,只有外部中斷繼續工作。如果單片機電源引腳VCC有2.0伏以上,則RAM 中的數據仍將保存。
退出“睡眠模式”(低功耗模式),有兩種方法:
1)、外部中斷會讓CPU退出“睡眠模式”。
2)、CPU復位引腳出現高電平,引起CPU復位,也會讓CPU退出“睡眠模式”。
2、外部中斷會讓CPU退出“睡眠模式”
程序如下:
#define?Enter_PDWN_Mode() ?PCON=PCON|0x02 ?//進入“睡眠模式”
#define?Exit_PDWN_Mode() ??PCON &= ~0x02; ???//CPU退出“睡眠模式”
sbit?LED = P1^0;??//低電平點亮LED
//函數功能:設置int0和int1為下降沿中斷方式;
void EXT_int0_and_int1_initialization()
{ IT0=1; ?//設置int0為下降沿觸發方式;
??IT1=1; ?//設置int1為下降沿觸發方式;
??//IT0=0; ?//設置int0為低電平觸發方式;
??//IT1=0; ?//設置int1為低電平觸發方式;
??EX0=1; ?//允許int0中斷;
??EX1=1; ?//允許int1中斷;
??EA=1; ??//開總中斷允許位;
}
#define?OSC_FREQ ?????????12000000L ?????//定義晶振頻率為12MHz;
#define?T0_Load_Value ??????(65536-50000) ??//配置T0為50000us中斷一次;
//函數功能: 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; ????????????????//開總中斷允許位;
}
//函數功能:int0中斷服務函數,在雙擊P3.2腳時會進入int0中斷服務函數;
void?int0_interrupt_service_function() interrupt?0
{
LED=0;//點燈
??Exit_PDWN_Mode();//CPU退出“睡眠模式”
}
//函數功能:int1中斷服務函數,在雙擊P3.3腳時會進入int1中斷服務函數;
void?int1_interrupt_service_function() interrupt?2
{
??LED=0;//點燈
??Exit_PDWN_Mode();//CPU退出“睡眠模式”
}
//函數功能: Timer0的中斷服務函數,每50000us中斷一次;
void?timer0_interrupt_program() interrupt?1 using 1
{ TL0=T0_Load_Value; ????//手動裝載初值;
??TH0=T0_Load_Value>>8;
??LED=~LED;
}
}
//函數功能:11.0592MHz延時100us
void?Delay100us(void)
{
unsigned char?i;
i = 50;
while?(i>0){i--;}
}
void?Delay_ms(unsigned char?x)
{
??unsigned char i;
while?(x)
{
??for(i=0;i<10;i++)Delay100us();
x--;
}
}
void?main(void)
{
??EXT_int0_and_int1_initialization();
timer0_initializtion(); //Timer0初始化;
LED=1;//關燈
??Delay_ms(1000);Delay_ms(1000);Delay_ms(1000);
Enter_PDWN_Mode();
//進入“睡眠模式”
//等待外部中斷
while(1)
{
Delay100us();
}
}