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

2020-02-06 10:13发布

关于PIC单片机的“休眠”和“唤醒”自己还是不太会用。希望各位大虾能给点指导。
现在主要是用PIC12F635单片机。用其中一个引脚GP0做为按键输入,其中一个引脚GP4作为输出。要达到的效果就是:平时都是“休眠”状态,当有按键按下时,单片机立即“唤醒”,GP4开始发出某段波形。就是想问一问这“休眠”与“唤醒”,具体怎么设置,希望有朋友写一小段用C的休眠和唤醒程序。让我能入个门。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
23条回答
rainyss
1楼-- · 2020-02-07 06:35
1.变量初始化不要在定义时做
2.初始化里作上电检测,非上电重启时跳过初始化
3.程序流程复杂时使用状态机实现,以便立即回到唤醒前状态.
cwl0580
2楼-- · 2020-02-07 09:55
非常感谢楼上两位,我照你们的办法试试!
cwl0580
3楼-- · 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"); //休眠                                       
                }
        }

}
rainyss
4楼-- · 2020-02-07 13:13
每次重新执行main()就初始化?楼上不是有人说过从休眠退出时就相当于重启,会执行main()不.
cwl0580
5楼-- · 2020-02-07 17:20
 精彩回答 2  元偷偷看……
millwood0
6楼-- · 2020-02-07 17:38
I am not going to write the code for you but here is an example where the pic wakes up from a wdt reset and retains its value.

============code====================

#include <htc.h>
#include "gpio.h"

__CONFIG(MCLRDIS & WDTEN & BORDIS & PWRTEN & INTIO);

#define LED_PORT                GPIO
#define LED_DDR                        TRISIO
#define LED_PINs                0xff

void mcu_init(void) {
        ANSEL=0x00;                        //all pins digital
        CMCON=0x07;                        //analog comparators off
        PSA=1;                                                                                //prescaller to wdt
//        PS2=1, PS1=1, PS0=1;                                                //prescaler to 1<<0b111. time-out period=18ms*128=2s
        PS2=0, PS1=1, PS0=1;                                                //prescaler to 1<<0b011. time-out period=18ms*8=160ms
        IO_CLR(LED_PORT, LED_PINs);        //led_pins low
        IO_OUT(LED_DDR, LED_PINs);
}

void
main(void)
{
        static unsigned char wdt_counter=0;
       
        mcu_init();
        while (1){
                //TODO Auto-generated main function
                if (!TO) {
                        //CLRWDT();                        //clear wdt status
                        wdt_counter++;                //if wdt reset
                        LED_PORT = wdt_counter;
                        while (1);                        //wait for the next wdt
                }
                //do something here
        }
}
==============end code==========================

一周热门 更多>