关于pic10F202的睡眠与唤醒

[复制链接]
3024|9
 楼主| caoyonglu 发表于 2013-5-6 13:25 | 显示全部楼层 |阅读模式
pic, pi, ic
pic10f202该设置哪些标志位来唤醒和睡眠,为什么我设置多处睡眠,无法唤醒
ayb_ice 发表于 2013-5-6 15:58 | 显示全部楼层
睡眠前设置好唤醒源,一般通过IO下降沿唤醒
 楼主| caoyonglu 发表于 2013-5-6 16:05 | 显示全部楼层
pic10f202只有一个控制其电平变化的使能位,其他的什么都没有啊,也没有设置上升沿还是下降沿啊
 楼主| caoyonglu 发表于 2013-5-7 16:40 | 显示全部楼层

PIC10F202的睡眠与唤醒

本帖最后由 caoyonglu 于 2013-6-13 17:17 编辑

还是有问题啊
凌锋华 发表于 2013-5-27 17:32 | 显示全部楼层
怎样解决了?能分享一下原程序吗?我正遇到 这方面的难题!谢谢
 楼主| caoyonglu 发表于 2013-6-13 17:18 | 显示全部楼层
还是没有达到睡眠,依然耗电很严重
兰天白云 发表于 2013-6-13 17:28 | 显示全部楼层
caoyonglu 发表于 2013-6-13 17:18
还是没有达到睡眠,依然耗电很严重

如果IO口接一个1欧电阻,然后这个IO口输出高电平,那么在休眠时功耗也是很大的
opal11 发表于 2013-8-16 22:11 | 显示全部楼层
休眠前先断开IO引脚的耗电。
opal11 发表于 2013-8-19 19:30 | 显示全部楼层
以前做的一个LED控制开关,待机小于1uA
#include<pic.h>

#define uint unsigned int
#define uchar unsigned char

#define SW1 GP3
#define led1 GP1

__CONFIG(0x00000);

bit on,work,ing,b,q;                //b q释放状态位

uchar n,m,time;

void sys_init()
{
        OSCCAL &= 0xfe;       
        OPTION = 0x86;                        //关电平变化时唤醒 上拉 定时器0时钟 128分频
        TRISGPIO = 0x08;                //GP0输入 GP1 GP2输出
        on = 0;
        work = 0;
        ing = 0;
        time = 0;
        led1 = 1;
        q = 0;
}

void delay10ms()                        //按键消抖延时
{
        uchar i,j;
        for(i=5;i>0;i--)
                for(j=80;j>0;j--);       
}
void sos()
{
                if(TMR0==1)
                {
                        time++;       
                        TMR0 = 2;
                }
                if(time>=3)                //100ms               
                {
                        time = 0;
                        m++;
                        n++;
                        if(m<16)
                        {
                                if(m<3)
                                {
                                        led1 = 0;       
                                }
                                else if(m<5)
                                {
                                        led1 = 1;                               
                                }
                                else if(m<7)
                                {
                                        led1 = 0;                                       
                                }
                                else if(m<9)
                                {
                                        led1 = 1;                               
                                }
                                else if(m<11)
                                {
                                        led1 = 0;                                       
                                }
                                else
                                {
                                        led1 = 1;                                       
                                }
                        }
                        else if((m>15)&&(m<37))
                        {
                                if(m<20)
                                {
                                        led1 = 0;       
                                }
                                else if(m<22)
                                {
                                        led1 = 1;                               
                                }
                                else if(m<26)
                                {
                                        led1 = 0;                                       
                                }
                                else if(m<28)
                                {
                                        led1 = 1;                               
                                }
                                else if(m<32)
                                {
                                        led1 = 0;                                       
                                }
                                else
                                {
                                        led1 = 1;                                       
                                }
                        }                       
                        else if((m>36)&&(m<52))
                        {
                                if(m<39)
                                {
                                        led1 = 0;       
                                }
                                else if(m<41)
                                {
                                        led1 = 1;                               
                                }
                                else if(m<43)
                                {
                                        led1 = 0;                                       
                                }
                                else if(m<45)
                                {
                                        led1 = 1;                               
                                }
                                else if(m<47)
                                {
                                        led1 = 0;                                       
                                }
                                else
                                {
                                        led1 = 1;                                       
                                }
                        }
                        else if((m>51)&&(m<60))
                        {
                                led1 = 1;
                        }
                        else
                        {
                                m = 0;
                        }                                                       
                }
}

void main()
{       
        sys_init();
        for(;;)
        {
                if(work==0)
                {
                        if((SW1==0)&&(ing==0))                        //第一次触发
                        {
                                delay10ms();
                                if((SW1==0)&&(ing==0))
                                {
                                        led1 = 0;                               
                                        on = 1;
                                        ing = 1;
                                }
                        }
                        if(on==1)                                                //第一次触发释放
                        {
                                if(SW1==1)                                       
                                {
                                        delay10ms();
                                        if(SW1==1)
                                        {
                                                work = 1;
                                                on = 0;
                                        }
                                }
                        }
                        else                                                        //进入休眠模式
                        {
                                if(SW1==1)
                                {
                                        delay10ms();
                                        if(SW1==1)
                                        {
                                        //        STATUS |= 0x80;                //引脚电平变化时从休眠中唤醒导致的复位
                                                OPTION = 0x06;
                                                SLEEP();                        //引脚电平变化时从休眠中唤醒导致的复位
                                        }
                                }
                        }
                }
                else
                {
                        if(((SW1==0)&&(on==0))&&(q==0))        //第二次触发 判断是否长按两秒以上
                        {
                                delay10ms();
                                while((SW1==0)&&(on==0))
                                {       
                                        ing = 0;                                //非闪灯模式
                                        if(TMR0==1)
                                        {
                                                time++;       
                                                TMR0 = 2;
                                        }
                                        if(time>60)                                //2秒以上进入闪灯模式
                                        {
                                                on = 1;
                                                ing = 1;
                                                b = 1;
                                                m = 0;                                               
                                        }                                                                               
                                }
                                time = 0;
                        }
                        if((q==1)||(b==1))
                        {
                                if(SW1==1)                                        //触发释放
                                {
                                        delay10ms();
                                        if(SW1==1)
                                        {                                               
                                                q = 0;
                                                b = 0;
                                        }
                                }
                        }                       
                        if(on==1)                                                //闪灯模式
                        {                                               
                                sos();
                                if(b==0)
                                {
                                        if(SW1==0)
                                        {
                                                delay10ms();
                                                n = 0;                                                                                       
                                                while((SW1==0)&&(q==0))
                                                {       
                                                        ing = 0;                                        //关机模式                                                
                                                        sos();
                                                        if(n>20)                                //两秒以上进入闪灯正常模式
                                                        {
                                                                on = 0;
                                                                ing = 1;
                                                                b = 1;
                                                                led1 = 0;                                                       
                                                                q = 1;                                               
                                                        }                                                                               
                                                }
                                                n = 0;                                                                               
                                        }                                                                                                       
                                }
                        }
                        if(ing==0)                                        //关灯 进入休眠模式
                        {
                                led1 = 1;                       
                                work = 0;
                                ing = 1;
                                on = 0;
                                time = 0;
                        }                       
                }                       
        }
}

评论

你这个很牛的  发表于 2021-3-14 04:40
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

47

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部