AT89s52單片機(jī)的掉電測試
SMOD:該位與串口通信有關(guān)。
SMOD=0; 串口方式1,2,3時,波特率正常。
SMOD=1; 串口方式1,2,3時,波特率加倍。
GF1,GF0:兩個通用工作標(biāo)志位,用戶可以自由使用。
PD:掉電模式設(shè)定位。
PD=0 單片機(jī)處于正常工作狀態(tài)。
PD=1 單片機(jī)進(jìn)入掉電(Power Down)模式,可由外部中斷或硬件復(fù)位模式喚醒,進(jìn)入掉電模式后,外部晶振停振,CPU、定時器、串行口全部停止工作,只有外部中斷工作。
IDL:空閑模式設(shè)定位。
IDL=0 單片機(jī)處于正常工作狀態(tài)。
IDL=1 單片機(jī)進(jìn)入空閑(Idle)模式,除CPU不工作外,其余仍繼續(xù)工作,在空閑模式下可由任一個中斷或硬件復(fù)位喚醒。
測試電路圖
測試程序如下:
#include
#include
sbit key = P3^3; //進(jìn)入掉電模式的按鍵
/*************************************
函數(shù)名稱:delay
函數(shù)功能:延時一段時間
**************************************/
void delay()
{
unsigned int i;
for(i=0;i<30000;i++) ;
}
/*************************************
函數(shù)名稱:delay20ms
函數(shù)功能:延時20ms
**************************************/
void delay20ms(void)
{
unsigned char i,j;
for(i=0;i<100;i++)
for(j=0;j<60;j++);
}
/*************************************
函數(shù)名稱:init
函數(shù)功能:初始化程序
**************************************/
void init()
{
EA=1; //開中斷總允許
EX0=1; //開外中斷1
IT0=1; //外中斷的下降沿觸發(fā)
}
/*************************************
函數(shù)名稱:keytest
函數(shù)功能:鍵盤程序,按下鍵進(jìn)入掉電模式
**************************************/
void keytest()
{
if(key==0)
{
delay20ms();
if(key==0)
{
PCON=PCON|0x02; //進(jìn)入掉電模式
}
while(!key);
}
}
/*************************************
函數(shù)名稱:main
函數(shù)功能:主函數(shù)
**************************************/
void main()
{unsigned char aa = 0xfe;
init();
while(1)
{//實(shí)現(xiàn)流水燈
P0=aa;
aa= _crol_(aa,1);
delay();
keytest(); //鍵盤掃描
}
}
/*************************************
函數(shù)名稱:Int0
函數(shù)功能:中斷服務(wù)程序
**************************************/
void Int0() interrupt 0 using 1
{
P0=0x00; //燈全亮
delay();
delay();
delay();
}
實(shí)驗(yàn)結(jié)果:單片機(jī)上電后,可以看到流水燈轉(zhuǎn)動;當(dāng)按下key鍵后流水燈停止,只有一盞燈亮著;當(dāng)按下接在P3.2口的按鍵,8盞燈全部亮了,然后流水燈接著原來的位置流動。而且,掉電后,通過按鍵觸發(fā)外部中斷喚醒單片機(jī),效果不錯,很容易觸發(fā)。
結(jié)論:AT89S52單片機(jī)從掉電模式經(jīng)外部中斷觸發(fā)喚醒后,首先執(zhí)行的是外部中斷服務(wù)程序,然后回到主程序中斷點(diǎn)位置繼續(xù)執(zhí)行。