找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2852|回复: 10
收起左侧

STC15单片机掉电模式请教

[复制链接]
ID:28752 发表于 2021-10-21 16:42 | 显示全部楼层 |阅读模式
想用stc15单片机做一个类似手电控制程序,单按键,循环显示不同闪烁频率,功能是实现了,但是因要用电池供电,工作电流7mA太大了,查了下stc只有掉电模式下才省电,下面代码,有以下疑问想咨询下各位大神,麻烦各位有时间时不吝赐教,谢谢!!!1,我的想法是外部中断口INT0/P3.2上接个开关到地,既做外部中断唤醒,又做按键计数,以实现按键循环功能,这样能行吗?
2,如果上面1条能行,我的按键扫描和功能执行程序要放在哪,int0的中断入口出么?即主程序直接进入掉电模式循环,中断唤醒后,执行所有按键循环1--2--3--跳出.??
3,有类似程序的能不能给我个参考...
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15F4K60S4 系列 INT0唤醒掉电模式举例--------------------------*/
  4. /*---------------------------------------------------------------------*/
  5. //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
  6. //假定测试芯片的工作频率为18.432MHz


  7. #include "reg51.h"

  8. #include "intrins.h"

  9. bit FLAG;                       //1:上升沿中断 0:下降沿中断

  10. sbit P10 = P1^0;
  11. //中断服务程序
  12. void exint0() interrupt 0       //INT0中断入口
  13. {
  14.     P10 = !P10;                 //将测试口取反
  15.     FLAG = INT0;                //保存INT0口的状态, INT0=0(下降沿); INT0=1(上升沿)
  16. }
  17. //-----------------------------------------------
  18. void main()
  19. {
  20.     IT0 = 0;                    //设置INT0的中断类型为上升沿和下降沿,上升沿和下降沿均可唤醒
  21. //  IT0 = 1;                    //设置INT0的中断类型为仅下降沿,下降沿唤醒

  22.     EX0 = 1;                    //使能INT0中断
  23.     EA = 1;
  24.     while (1)
  25.     {
  26.         PCON = 0x02;            //MCU进入掉电模式
  27.         _nop_();                //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
  28.         _nop_();
  29.     }
  30. }
复制代码
回复

使用道具 举报

ID:624769 发表于 2021-10-21 19:53 | 显示全部楼层
去年正好做过一个小东西,正好也是外部中断唤醒,外部中断执行,你可以参考一下,代码只有几行。

电子门铃STC15W100.rar (1.12 MB, 下载次数: 66)
回复

使用道具 举报

ID:28752 发表于 2021-10-21 20:44 | 显示全部楼层
188610329 发表于 2021-10-21 19:53
去年正好做过一个小东西,正好也是外部中断唤醒,外部中断执行,你可以参考一下,代码只有几行。

谢谢,我下下来研究下能不能看明白...
回复

使用道具 举报

ID:213173 发表于 2021-10-21 21:50 | 显示全部楼层
//适合STC15W系列
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
//-----------------------------------------------
sbit key  = P3^2;

sbit LED1  = P1^0;

uchar i;

void delayms(uint k)//1T
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=829;j>0;j--);
}

void main()
{
        IT0 = 1;//设置INT0的中断类型为下降沿唤醒
        EX0 = 1;//使能INT0中断
        EA  = 1;//开总中断                                                        
        while (1)
        {
                if(i==0)
                {
                        while(!key)       
                        {
                                LED1=~LED1;
                                delayms(100);
                        }
                }
                if(i==1)
                {
                        while(!key)       
                        {
                                LED1=~LED1;
                                delayms(400);
                        }
                }
                if(i==2)
                {
                        while(!key)       
                        {
                                LED1=~LED1;
                                delayms(1600);
                        }
                }
                LED1=1;
                PCON = 0x02;//MCU进入掉电模式
                _nop_();    //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
                _nop_();    //中断服务程序执行完再接着此句继续执行
        }
}

//-----------------------------------------
//中断服务程序
void exint0() interrupt 0       //INT0中断入口
{
        i=++i%3;
}
回复

使用道具 举报

ID:401564 发表于 2021-10-21 22:57 | 显示全部楼层
思路:
1,P3.2按键唤醒或者关机,可以是双击或者长按,单击功能切换
2,每按下就进入中断,在中断中处理,先检测是不是掉电模式,或者是要不要唤醒
主程序给你参考一下
void main(void)
{
        Mcu_Rst();          //单片机复位
        Mcu_Awaken(); //单片机唤醒操作
        Stc8g_Adc_int();//stc8gadc初始化
        Tap6130_Start();  //耳放启动
//———————————————————————————————————————————————————————————————————          
        while(1)
        {                         
         if((USB==1)||(ON==1)) Battry_Voltage_Disp(ADC_VCC);        //电池电压处理
         if((USB==0)&&(ON==1))        Key_Disp();                                         //按键处理                 
         if((TWO_PRE==1)||(LONG_PRE==1))
                {                                       
                        ON=!ON;                                                                                //长按/双击有效
                        TWO_PRE=0;
                        LONG_PRE=0;
                        Mcu_Up=0;                                                                                //清除按键唤醒标志位
                        if(ON==1)                                                                          
                          {                                                       
                                        Delay_ms(300);                                                                //延时一定时间开机,没有为什么,就是达到某个效果而已,可有可无
                                        Tap6130_Start();                                                         //如果是按键开机,就启动耳放和蓝牙
                                        Stc8g_Adc_int();                                                        //stc8gadc初始化                        
                                }                               
                }
                else if(ONE_PRE==1)
                                {
                                   ONE_PRE=0;                                                                  //单击有效
                                   Mcu_Up=0;
                                   if(ON==1)Play();                                                                         //播放/暂停/接听/挂断                                  
                                }                          
                        else if((USB==0)&&(ON==0)&&(Mcu_Up==0))                //UBS在插着,就不关机
                                        {                               
                                                Delay_ms(300);                                                                //延时0.3秒关机
                                                Mcu_Sleep();                                                                //单片机进入掉电模式
                                                PCON=0x02;                                                                        //进入掉电模式
                                                _nop_();                               
                                                _nop_();
                                                _nop_();
                                                _nop_();
                                                _nop_();
                                                Mcu_Awaken();                                                                  //单片机唤醒
                                                if(USB==1)Stc8g_Adc_int();                                        //如果USB高电平,就表示是USB播放,stc8gadc初始化               
                                        }                                                               
        }                          
//———————————————————————————————————————————————————                               
}
回复

使用道具 举报

ID:956872 发表于 2021-10-22 00:40 来自手机 | 显示全部楼层
唤醒时首先关闭中断,按键就成普通按键了。进入掉电模式前打开外部中断,按键就能唤醒单片机了
回复

使用道具 举报

ID:28752 发表于 2021-10-22 11:07 | 显示全部楼层
wulin 发表于 2021-10-21 21:50
//适合STC15W系列
#include "reg51.h"
#include "intrins.h"

感谢回复,我试了下,这代码必须保持P3.2一直低才能完成功能...,不过也有启发了...
回复

使用道具 举报

ID:28752 发表于 2021-10-22 11:08 | 显示全部楼层
Y_G_G 发表于 2021-10-21 22:57
思路:
1,P3.2按键唤醒或者关机,可以是双击或者长按,单击功能切换
2,每按下就进入中断,在中断中处理,先检 ...

感谢回复,我仔细研究研究...
回复

使用道具 举报

ID:28752 发表于 2021-10-22 11:08 | 显示全部楼层
PEB188 发表于 2021-10-22 00:40
唤醒时首先关闭中断,按键就成普通按键了。进入掉电模式前打开外部中断,按键就能唤醒单片机了

多谢回复,我试着改改看看...
回复

使用道具 举报

ID:213173 发表于 2021-10-22 21:10 | 显示全部楼层
grb7906 发表于 2021-10-22 11:07
感谢回复,我试了下,这代码必须保持P3.2一直低才能完成功能...,不过也有启发了...

把死循环while(!key)改for循环即可解决松手问题。

评分

参与人数 1黑币 +10 收起 理由
ax6808 + 10

查看全部评分

回复

使用道具 举报

ID:28752 发表于 2021-10-22 21:54 | 显示全部楼层
wulin 发表于 2021-10-22 21:10
把死循环while(!key)改for循环即可解决松手问题。

麻烦有时间的话,能不能给一组循环的代码,我进死胡同了...,初学阶段...
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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