320|2

4

帖子

0

资源

一粒金砂(初级)

STC15W104 掉电唤醒弄不了 请教大佬帮忙看看 [复制链接]

#include <STC15.H>
#define const_voice_short 20 //蜂鸣器短叫的持续时间
#define const_voice_long 140 //蜂鸣器长叫的持续时间
/* 注释一:
* 调整抖动时间阀值的大小,可以更改按键的触发灵敏度。
* 去抖动的时间本质上等于累计定时中断次数的时间。
*/
#define const_key_time1 50 //短按的按键去抖动延时的时间

void initial_myself();
void initial_peripheral();
void delay_long(unsigned int uiDelaylong);
void T0_time(); //定时中断函数
void key_service(); //按键服务的应用程序
void key_scan(); //按键扫描函数 放在定时中断里
void power_low();

sbit key_sr1=P3^2; // S1 键

sbit k00=P3^3; //MOS管输出控制引脚

unsigned char ucKeySec=0; //被触发的按键编号
unsigned int uiKeyTimeCnt1=0; //按键去抖动延时计数器
unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志

unsigned int uiVoiceCnt=0; //蜂鸣器鸣叫的持续时间计数器
unsigned int uiCountK00=0; //继电器输出持续时间计数器

void main()
{  
  unsigned int i=0;
  P3M0 = 0x08;    // 端口P3.3    推挽 其余双向
  P3M1 = 0x00;
  k00=0;    //
  initial_myself();
  delay_long(100);
  initial_peripheral();
  while(1)
  {
   key_service(); //按键服务的应用程序
   power_low();

   }     
  }

void key_scan()//按键扫描函数 放在定时中断里
{
  if(key_sr1==1)//IO口高电平 说明按键没有按下 及时清零一些标志
    {  ucKeyLock1=0;
       uiKeyTimeCnt1=0;
    }
  else if(key_sr1==0)
    {
     uiKeyTimeCnt1++;
     if(uiKeyTimeCnt1>const_key_time1)
       {
            uiKeyTimeCnt1=0;
         ucKeyLock1=1;
         ucKeySec=1; //    触发1号按键
       }  
    }
}

 void key_service() //第三区 按键服务的应用程序
{
  switch(ucKeySec) //按键服务状态切换
  {
   case 1:// 1 号键的短按 对应朱兆祺学习板的 S1 键
   
   ucKeySec=0; //响应按键服务处理程序后,按键编号清零,避免一致触发
   uiCountK00=0;
   k00=!k00;    //亮灯高电平
   break;
  }
}

void T0_time() interrupt 0
 {
  TF0=0; //清除中断标志
  TR0=0; //关中断
  key_scan(); //按键扫描函数
  TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
  TL0=0x2f;
  TR0=1; //开中断
 }

void delay_long(unsigned int uiDelayLong)
{
  unsigned int i;
  unsigned int j;
  for(i=0;i<uiDelayLong;i++)
   {
    for(j=0;j<500;j++) //内嵌循环的空指令数量
    {
     ; //一个分号相当于执行一条空语句
    }
   }
}

void initial_myself() //第一区 初始化单片机
{
  
  PCON =0x02;
  TMOD=0x01; //设置定时器 0 为工作方式 1
  TH0=0xf8; //重装初始值(65535-2000)=63535=0xf82f
  TL0=0x2f;
}

void initial_peripheral() //第二区 初始化外围
{
EA=1; //开总中断
ET0=1; //允许定时中断
TR0=1; //启动定时中断
}
void power_low()        //掉电唤醒
{
  if(k00==0&&key_sr1==1)
{
IT0=1;
ET0=0; //
EX0=1; //
EA=1;
PCON=0x02; //
delay_long(100);

}
}
void ex_int0()interrupt 2        //INT0_P32
{
    key_scan();
    PCON=0;
    ET0=1;
}

此帖出自51单片机论坛

回复

4

帖子

0

资源

一粒金砂(初级)

一直实现不了掉电唤醒  哪位大佬帮看看哪里出的问题

回复

1万

帖子

143

资源

版主

掉电模式的唤醒纯粹是配置问题,仔细看器件手册。

个人签名上传了一些书籍资料,也许有你想要的:http://download.eeworld.com.cn/user/chunyang

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

最新文章 更多>>
    关闭
    站长推荐上一条 1/7 下一条

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区知春路23号集成电路设计园量子银座1305 电话:(010)82350740 邮编:100191

    电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表