PIC16F877A 的sleep mode
扫描二维码
随时随地手机看文章
power down mode也就是sleep mode,状态位PD被清零;程序中加入sleep()便可以使IC进入sleep mode。在sleep mode下,若watchdog使能,则watchdog被清除后,继续工作;oscillator停止工作;IO口保持进入sleep mode时的状态;MCLR 许要设置为逻辑高电平。从sleep mode醒来的几种方式:1、外部MCLR的reset;2、若watchdog使能,可以利用watchdog唤醒,TO bit被清;3、INT唤醒,portB口有外部中断的功能;另外在datasheet中也讲解到利用外部中断(如下几种可以唤醒device)从sleep mode唤醒后,如果GIE=0被清除,device执行sleep后的一条语句;如果GIE=1使能,唤醒后执行sleep后的一条句子后,进入中断地址0x0004H 处执行中断内容。通常在sleep后增加一条NOP()指令。另外在datasheet中提到在执行sleep指令前、过程中、以及之后如有中断,也可能不能使PD设置为0,使device进入sleep mode。所以最好在执行sleep mode前对PD位进行一下检查。下面的例程实现的功能是:正常工作时blink LED(RA0控制),外部中断控制是否进入sleep mode,进入sleep mode时,LED保持亮的状态。再次RB0 外部中断触发后,awake up device,LED灯继续闪烁。#include /SLEEP工作方式,单片机进入休眠,可以节省电源,提高A/D转换精度(此时AD转换必须选择内部RC作为A/D转换的时钟源) //SLEEP工作方式相爱,芯片的振荡器停诊,因此没有系统时钟。在刚进入休眠工作模式下,如看门狗定时器是能状态,系统会自动把看门狗定时器的当前计数值清零 //使其重新计数,在SLEEP模式下,I/O端口保持执行SLEEP指令之前的状态。 //INTCON.GIE=1时,唤醒SLEEP计数之后,先执行SLEEP之后的一条语句,然后进入中断服务程序若不希望执行SLEEP之后的那条语句,可加上NOP指令 //INTCON.GIN=0,则唤醒SLEEP,但不进入中断。 //INTCON.INTE=0,则不管GIE为何值,按键时都不能唤醒SLEEP //INT中断与休眠 #include __CONFIG(0X3F39);//调试用 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;//设置RB0/RB1为输出 LED1=0; LED2=0; INTE=1;//中断控制寄存器INTCON的位4INTE(INT引脚中断使能) GIE=1;//位7全局中断使能 SLEEP();//进入休眠工作方式 NOP();//SLEEP之后要加上NOP语句 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(); }