关于PIC单片机的“休眠”和“唤醒”

2020-02-06 10:13发布

关于PIC单片机的“休眠”和“唤醒”自己还是不太会用。希望各位大虾能给点指导。
现在主要是用PIC12F635单片机。用其中一个引脚GP0做为按键输入,其中一个引脚GP4作为输出。要达到的效果就是:平时都是“休眠”状态,当有按键按下时,单片机立即“唤醒”,GP4开始发出某段波形。就是想问一问这“休眠”与“唤醒”,具体怎么设置,希望有朋友写一小段用C的休眠和唤醒程序。让我能入个门。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
24条回答
cwl0580
2020-02-07 12:02
今天做了实验,发现休眠后RAM数据无法保存,也就是说所有变量都被清零了,静态全局变量也一样被清零!
“millwood0”和 “rainyss ”请看一下我的程序,看是不是程序问题!?

/////////////////////////////////////////////////////////////////////////////////////////////////
#include <pic.h>
#define uchar unsigned char

#define Weak_up  GP3  //I
#define LED   GP0        //o

//__CONFIG(0x06);//内部4M晶振,代码保护开,WDT开
__CONFIG(0x02);//内部4M晶振,代码保护开,WDT 0ff

//////////////////////////////////////////////////////////////////////////////////////////////////////////
static bit POWER_flag;//开关机标记
static uchar        Sleep_count;//休眠延时
//////////////////////////////////////////////////////////////////////////
////////////////////初始化程序//////////////////////////////////////////////
void Init(void)//初始化程序
{
       
        OPTION = 0x00;//T0分频:2;上拉开,唤醒开
    TRIS = 0x3E;//设置IO口方向3E:111110
        CM1CON0 = 0xF7;//电压比较器关
        ADCON0=0x00;  //AD关

        if(PD)//如果是上电复位
        {
               
                GPIO = 0x00;//输出口清零
                POWER_flag=1;//开机
                //LED=POWER_flag;//上电led亮
                LED=1;//上电led亮
        }
        else//如果不是上电复位
        {       
                if(GPWUF)//如果是电平变化唤醒
                {
                        GPWUF = 0;    //清除唤醒标志
                        Sleep_count=255;//休眠延时计数赋值
                        POWER_flag=!POWER_flag;//开关机标记取反
                        //LED=POWER_flag;//LED无法取反,一直亮,所以我认为无论什么复位,POWER_flag每次都被清零了
                        LED=!LED;//LED状态正常取反
                }
        }

}


void main()              //主程序
{
    Init();                                //初始化
       
    while (1)           //主循环
    {        
               
                if(Sleep_count)//进入休眠延时
                        Sleep_count--;
                else//进入休眠
                {       
                        if(Weak_up)        //进入休眠前读端口,这点很重要,否则不正常               
                        asm("sleep"); //休眠                                       
                }
        }

}

一周热门 更多>