PIC16F877A 的sleep mode
power down mode也就是sleep mode,狀態(tài)位PD被清零;程序中加入sleep()便可以使IC進(jìn)入sleep mode。在sleep mode下,若watchdog使能,則watchdog被清除后,繼續(xù)工作;oscillator停止工作;IO口保持進(jìn)入sleep mode時(shí)的狀態(tài);MCLR 許要設(shè)置為邏輯高電平。從sleep mode醒來(lái)的幾種方式:1、外部MCLR的reset;2、若watchdog使能,可以利用watchdog喚醒,TO bit被清;3、INT喚醒,portB口有外部中斷的功能;另外在datasheet中也講解到利用外部中斷(如下幾種可以喚醒device)從sleep mode喚醒后,如果GIE=0被清除,device執(zhí)行sleep后的一條語(yǔ)句;如果GIE=1使能,喚醒后執(zhí)行sleep后的一條句子后,進(jìn)入中斷地址0x0004H 處執(zhí)行中斷內(nèi)容。通常在sleep后增加一條NOP()指令。另外在datasheet中提到在執(zhí)行sleep指令前、過(guò)程中、以及之后如有中斷,也可能不能使PD設(shè)置為0,使device進(jìn)入sleep mode。所以最好在執(zhí)行sleep mode前對(duì)PD位進(jìn)行一下檢查。下面的例程實(shí)現(xiàn)的功能是:正常工作時(shí)blink LED(RA0控制),外部中斷控制是否進(jìn)入sleep mode,進(jìn)入sleep mode時(shí),LED保持亮的狀態(tài)。再次RB0 外部中斷觸發(fā)后,awake up device,LED燈繼續(xù)閃爍。#include /SLEEP工作方式,單片機(jī)進(jìn)入休眠,可以節(jié)省電源,提高A/D轉(zhuǎn)換精度(此時(shí)AD轉(zhuǎn)換必須選擇內(nèi)部RC作為A/D轉(zhuǎn)換的時(shí)鐘源) //SLEEP工作方式相愛,芯片的振蕩器停診,因此沒有系統(tǒng)時(shí)鐘。在剛進(jìn)入休眠工作模式下,如看門狗定時(shí)器是能狀態(tài),系統(tǒng)會(huì)自動(dòng)把看門狗定時(shí)器的當(dāng)前計(jì)數(shù)值清零 //使其重新計(jì)數(shù),在SLEEP模式下,I/O端口保持執(zhí)行SLEEP指令之前的狀態(tài)。 //INTCON.GIE=1時(shí),喚醒SLEEP計(jì)數(shù)之后,先執(zhí)行SLEEP之后的一條語(yǔ)句,然后進(jìn)入中斷服務(wù)程序若不希望執(zhí)行SLEEP之后的那條語(yǔ)句,可加上NOP指令 //INTCON.GIN=0,則喚醒SLEEP,但不進(jìn)入中斷。 //INTCON.INTE=0,則不管GIE為何值,按鍵時(shí)都不能喚醒SLEEP //INT中斷與休眠 #include __CONFIG(0X3F39);//調(diào)試用 void DELAY_I(unsigned int); void interrupt INT_ISR(void); #define LED1 RB1 #define LED2 RB2 void main(void) { OPTION=0b1001101;//RB0/INT下降沿中斷 TRISB=0b11111001;//設(shè)置RB0/RB1為輸出 LED1=0; LED2=0; INTE=1;//中斷控制寄存器INTCON的位4INTE(INT引腳中斷使能) GIE=1;//位7全局中斷使能 SLEEP();//進(jìn)入休眠工作方式 NOP();//SLEEP之后要加上NOP語(yǔ)句 LED1=1;//喚醒后LED1亮 while(1); //等待中斷 } void interrupt INT_ISR(void) { char x; if(INTF) { LED2=1; DELAY_I(30); INTF=0; } } void DELAY_I(unsigned int n) { unsigned int j; char k; for(j=0;j for(k=246;k>0;k--) NOP(); }