数码之家

 找回密码
 立即注册
搜索
查看: 3520|回复: 7

[C51] 用过STC15掉电功能的帮看看

[复制链接]
发表于 2019-11-27 20:37:04 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
原来用来控制灯的程序
发现关机状态下电流实在太大了,电池没几天就用完了。规格书没看明白,加了掉电程序。
现在加了,可以进掉电模式也可以唤醒,但没达到原来理想效果。那们大神帮改改。。。。。
原功能:长按开、关机;短按转换switch(n)的三种工作模式的
增加了进掉电功能后,出现问题:短按一下就开机了,且有时按键抖动一样,抬起按键会出现n的工作模式转换了。(原来没加前都是正常的)

#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)                  //长按开、关机
                        ON=~ON;                        
                if(count>key_L)                       
                        count=key_L+1;           
        }  
        else                                          
        {  
                if(count>key_S && count<key_L)   //短按转换工作模式
                {
                        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 希望长按唤醒并进入开机状态case 0模式
{
PCON=0;
ON=1;
n=0;
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(); //手动长按主动关机后进入掉电模式
                        }
                }
        }
}


发表于 2019-11-28 13:03:42 | 显示全部楼层
我搞过掉电,你可以参考一下我这个帖子。
http://bbs.mydigit.cn/read.php?tid=2395222
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-28 19:42:24 | 显示全部楼层
kindzhon 发表于 2019-11-28 13:03
我搞过掉电,你可以参考一下我这个帖子。
http://bbs.mydigit.cn/read.php?tid=2395222 ...

搞定了,谢谢。
回复 支持 反对

使用道具 举报

发表于 2019-12-3 17:14:47 | 显示全部楼层

怎么修改的说一下,谢谢
回复 支持 反对

使用道具 举报

发表于 2019-12-3 17:24:13 | 显示全部楼层
我以前是掉电唤醒后,单片机重启一次
回复 支持 反对

使用道具 举报

发表于 2020-3-27 22:06:10 | 显示全部楼层
呼叫楼主!解决了也来讲一下啊,让我们初学者学习学习。:mad:
回复 支持 反对

使用道具 举报

发表于 2020-3-28 08:42:29 | 显示全部楼层
简单,使用掉电模式以后,按键就只能通过中断触发状态,在中断里面加上长按短按就好了。不推荐在中断函数里进行判断长按短按,可以设个标志和松手检测
回复 支持 反对

使用道具 举报

发表于 2020-4-2 23:09:45 来自手机浏览器 | 显示全部楼层
楼主,有问题到论坛求助。解决了问,也应该在论坛上分享。
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-17 21:58 , Processed in 0.483601 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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