找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5303|回复: 16
打印 上一主题 下一主题
收起左侧

用过STC15单片机的帮看一下,掉电模式

[复制链接]
跳转到指定楼层
楼主
ID:562338 发表于 2019-11-27 09:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原来用来控制灯的程序
发现关机状态下电流实在太大了,电池没几天就用完了。规格书没看明白,加了掉电程序。但没敢下载,听说如果错了可能连再下载都难的。
那们大神帮看一下,主要是进入掉电和叫醒部份。1.实现定时关机后进入掉电模式和主动关机进入掉电模式,2.长按按键唤醒功能
#include "stc15w.h"                       
#include <intrins.h>                     
#define uint unsigned int               
#define uchar unsigned char              
#define     MAIN_Fosc       11059200L   
#define key_S 80                           //短按(约20ms)
#define key_L key_S*100                    //长按(约2s)
sbit out=P1^5;                           //mos_pin_p15
sbit key = P3^2;                         //key_INTO
sbit ledL = P3^5;                        //led
sbit ledH = P3^6;                        //led            
uint Cnt250us=0,Cnt1s;                  //set_times
bit  ON=0;                              //on_off
uchar n=0;
/*pin_mode*/
void port_mode()                        
{
        P1M1 = 0x01;                    
        P1M0 = 0x20;               
                P3M0 = 0x00;
        P3M1 = 0x00;
        out=0;                    
}
void readkey(void)                                       
{
        static uint count=0;                        
        if(!key)   
        {  
                count++;  
                if(count==key_L)                  //long_key
                        ON=~ON;                        
                if(count>key_L)                       
                        count=key_L+1;           
        }  
        else                                          
        {  
                if(count>key_S && count<key_L)   //short_key
                {
                        if(ON==1)                       
                          n++;                        
                                                  n%=3;
                }
                count=0;                                 
        }   
}
void Timer0Init()                    //250微秒@11.0592MHz
{
        AUXR |= 0x80;                //1T_mode
        TMOD &= 0xF0;               
        TL0 = 0x33;                  
        TH0 = 0xF5;                  
        TF0 = 0;                     
        TR0 = 1;                     
}
/*
增加掉电模式,INTO P32 低电平复醒
*/
void power_low()        //掉电模式开启
{
ET0=0; //下降沿叫醒
EX0=1; //外部中断允许
EA=1;
PCON=0x02; //进入掉模式
_nop_();
_nop_();
_nop_();
_nop_();
}
void ex_int0()interrupt 0        //INT0_P32 长键或短键低电平时,唤醒并进入开机状态
{
PCON=0;
ON=1;
n=1;
Cnt250us=0;
}

void main()      
{
        port_mode();   
        Timer0Init();
        while(1)      
        {
                if(TF0==1)
                {
                        TF0=0;
                        readkey();
                        if(ON==1)
                        {
                                Cnt250us++;
                                if(Cnt250us>=4000)
                                {
                                        Cnt250us=0;
                                        Cnt1s++;
                                        if(Cnt1s>=28800) //8小时自动关机
                                        {
                                                Cnt1s =0;
                                                ON=0;
                                                ledH = 1;
                                                ledL = 1;
                                                out  = 0;
                                                                                                power_low();//8小时定时自动关机后进入掉电模式
                                        }

                                 }
                                switch(n)                         //每个档位的工作模式,三种灯工作模式
                                                                       {
                                                                            case 0 :ledH=0;ledL=1;break;
                                                                                case 1 :ledH=0;ledL=0;break;
                                                                                case 2 :ledH=1;ledL=0;break;
                                                                           }
                                                
                          }
                        else                          //关机状态
                        {
                                Cnt250us=0;
                                Cnt1s= 0;
                                ledH = 1;
                                ledL = 1;
                                out  = 0;
                                                                power_low(); //手动长按主动关机后进入掉电模式
                        }
                }
        }
}



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:401564 发表于 2019-11-27 11:24 | 只看该作者
放心好了,
如果是用内部RC时钟的话,进入掉电模式之后,时内部是不工作的,
钟是下载是要时钟的,再次下载的话,会由于时钟已经停止而下载不了
正确的下载方法:点击下载,然后用个镊子或者其它东西短路一下单片机的正负电源就可以了
我一直都是这样用的,完全没有问题
回复

使用道具 举报

板凳
ID:562338 发表于 2019-11-27 14:53 | 只看该作者
Y_G_G 发表于 2019-11-27 11:24
放心好了,
如果是用内部RC时钟的话,进入掉电模式之后,时内部是不工作的,
钟是下载是要时钟的,再次下载的 ...

帮我看一下,这样加对不对
回复

使用道具 举报

地板
ID:562338 发表于 2019-11-27 16:15 | 只看该作者
void ex_int0()interrupt 0        //INT0_P32 长键低电平时,唤醒并进入开机状态并进入N=1模式
{
PCON=0;
ON=1;
n=1;
Cnt250us=0;
}
是不是这里写得不对?
掉电和唤醒功能都可以实现了。但现在不是长按,变成短按就开了,还有抖动直接跳动n=2模式
回复

使用道具 举报

5#
ID:401564 发表于 2019-11-27 19:19 | 只看该作者
我是用汇编的,C不会
在开启EA全局中断之前,最好了先清除一下标志位,虽然INT0的中断标志位是会自动清除的,但那是在程序响应中断之后才自动清除的
如果不清除的话,可能会引起逻辑上的错误
回复

使用道具 举报

6#
ID:562338 发表于 2019-11-27 19:44 | 只看该作者
试了一下,可以掉电和唤醒,但是短按就醒了(原来是长按开机的),而且有抖动,醒了后会跳到别的n=2模式。
回复

使用道具 举报

7#
ID:401564 发表于 2019-11-28 08:26 | 只看该作者
void ex_int0()interrupt 0
在中断函数里面还要进行检测的,单片机只有低电平唤醒,下降沿或者上升沿唤醒,没有长按唤醒这个功能
只能是你自行设定的
在你设定为下降沿唤醒之后,只要INT0有下降沿,程序就马上进入void ex_int0()interrupt 0 中断函数中,执行完这个函数的代码就去执行 power_low()之后的语句
你可以在 power_low()再加上检测是否是长按的语句,如果不是长按,就再次进入掉电模式.
只有长按才能返回去检测while循环
大概就是这个样子的了,C我只能看明白两三成,汇编的思路就是这样子的
回复

使用道具 举报

8#
ID:562338 发表于 2019-11-28 09:08 | 只看该作者
Y_G_G 发表于 2019-11-28 08:26
void ex_int0()interrupt 0
在中断函数里面还要进行检测的,单片机只有低电平唤醒,下降沿或者上升沿唤醒, ...

谢谢你。换了一种思路,感觉效果可以了。在测试不知道有没有BUG。
回复

使用道具 举报

9#
ID:562338 发表于 2019-11-28 09:18 | 只看该作者
修改了一下,初步感觉可以了。
readkey()
里把 if(!key)修改成 if(key==0)
/*
增加掉电模式,INTO P32 低电平复醒
*/
void power_low()        //掉电模式开启
{  if(ON==0&key==1)  //满足关机状态且没按KEY时才进入掉电
{
ET0=0; //下降沿叫醒
EX0=1; //外部中断允许
EA=1;
PCON=0x02; //进入掉模式
_nop_();
_nop_();
_nop_();
_nop_();readkey()  //唤醒后去执行 按键部份
}
}
void ex_int0()interrupt 0        //INT0_P32 长键或短键低电平时,唤醒并进入开机状态
{
PCON=0;            //这个好像有没有都一样,还没读透规格书
Timer0Init(void)   //只做初始化一下定时,这样改,待测定时功能正不正常
}

回复

使用道具 举报

10#
ID:478802 发表于 2019-12-21 10:36 | 只看该作者
我按照这个方法,但是老是唤醒不了,偶尔能唤醒,哪里问题
回复

使用道具 举报

11#
ID:562338 发表于 2019-12-30 22:56 | 只看该作者
wszx158 发表于 2019-12-21 10:36
我按照这个方法,但是老是唤醒不了,偶尔能唤醒,哪里问题

我刚开始也是,后来改了一下,正常了
回复

使用道具 举报

12#
ID:403593 发表于 2019-12-31 09:31 | 只看该作者
没有办法长按唤醒,只要是按键按下,有上升沿或者下降沿,就会进入中断,唤醒单片机。可以做短按开机,长按关机。
回复

使用道具 举报

13#
ID:130230 发表于 2020-1-3 16:52 | 只看该作者
掉电和下载程序没啥关系。。。stc由个坑爹的地方是下载软件里面有个选项是某个引脚是低电平才能下载吗,那个要是点上了就坑爹了。
回复

使用道具 举报

14#
ID:586438 发表于 2020-3-8 19:21 | 只看该作者
最近在研究掉电唤醒   前来学习
回复

使用道具 举报

15#
ID:586438 发表于 2020-3-9 16:46 | 只看该作者
楼主能不能把修改好的程序分享一下  非常感谢
回复

使用道具 举报

16#
ID:562338 发表于 2020-3-19 20:29 | 只看该作者
如痴百感生 发表于 2020-3-9 16:46
楼主能不能把修改好的程序分享一下  非常感谢

/*
增加掉电模式,INTO P32 低电平复醒
*/
void power_low()        //掉电模式开启
{
  if(ON==0&&key==1)
{
IT0=1;
ET0=0; //下降沿叫醒
EX0=1; //外部中断允许
EA=1;
PCON=0x02; //进入掉模式
_nop_();
_nop_();
_nop_();
_nop_();
readkey();
}
}
void ex_int0()interrupt 0        //INT0_P32 长键或短键低电平时,唤醒并进入开机状态
{
Timer0Init();
}
回复

使用道具 举报

17#
ID:25310 发表于 2020-3-20 10:11 | 只看该作者
多搞几个唤醒中断,防止一个中断唤不醒。INT1  ,INT0 啥的有空的都用上。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表