微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC89C52RC为什么不能进入掉电模式

STC89C52RC为什么不能进入掉电模式

时间:10-02 整理:3721RD 点击:
为学习单片机掉电模式以及唤醒,编写了一个小程序,开关直接接在P3.3外中断1引脚,在开关断开时可以进入掉电模式并且唤醒,但是开关一直关闭情况下,却怎么也进入不了,隔一段时间两个灯红-绿-红闪烁。我是新手,检查程序好像没问题啊,麻烦各位大神看下到底怎么回事,谢谢!1ms延时函数ys1ms()没有放上来
#include "STC89C52.H"
#include "intrins.h"
#define u8 unsigned char
#define u16 unsigned int
sbit R=P1^0;                    //红灯
sbit K=P3^3;                       //开关
sbit G=P0^3;                       //绿灯
u16 dscs;                                       
void HX() interrupt 2               //外中断1唤醒单片机
{
   PCON=0x00;
   G=0;                                //进入中断后绿灯会亮一下
   ys1ms(200);
   G=1;
}
void main()                        //主函数
{                                                               
        dscs=0;                        //定时次数清零
        IT1=1;                      //IT1下降沿触发
        EX1=0;                         //INT1中断关闭
        EA=1;                                   
        while(1)
        {
            dscs++;
                if(K==0)                        //开关闭合
                {
                   ys1ms(20);
                   if (K==0)
                   {
                          if (K==1)                    //开关断开,进入掉电状态
                         {
                         ys1ms(20);
                         if(K==1)
                         {
                                 EX1=1;        //开启INT1中断
                                 EA=1;
                                 _nop_();
                                 _nop_();
                                 PCON=0x02;
                                 _nop_();
                                 _nop_();
                                 _nop_();
                                 _nop_();
                                 dscs=0;
                                 EX1=0;
                         }
                  }                          
                  if (K==0 && dscs>=300 )           //开关闭合,一段时间后进入掉电状态
                  {
                         EX1 = 1;                     //开启INT1中断
                         R=0;
                         ys1ms(200);
                         R=1;                           //红灯亮一下
                         _nop_();
                         _nop_();
                         _nop_();
                         _nop_();
                         PCON=0x02;                   //进入掉电状态
                         _nop_();
                         _nop_();
                         _nop_();
                         _nop_();
                         dscs=0;
                         EX1=0;
                         R=0;                           //唤醒后红灯亮一下
                         ys1ms(200);
                         R=1;
                  }
            }
      }        
          if (K==1 || dscs>=600 )        //开关断开或者等待一段时间后进入掉电状态                                   
          {
             EX1 = 1;                      //开启INT1中断
             R=0;                               //红灯亮一下
             ys1ms(200);
             R=1;
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             PCON=0x02;                   //进入掉电状态
             _nop_();
             _nop_();
             _nop_();
             _nop_();
             dscs=0;                    //dscs清零
             EX1=0;
             R=0;                           //红灯亮一下
             ys1ms(200);
             R=1;
          }        
   }               
}

中断1一直低电平,按道理只是最多触发一次,但是现在不断的触发,不知道为什么

void main()                                                //主函数
{                                                               
        dscs=0;                                                //定时次数清零
    IT1=1;                      //IT1下降沿触发
        EX1=0;                                                 //INT1中断关闭
        EA=1;                                   
        while(1)
        {
       EX1 = 1;          //开启INT1中断
           R=0;
           ys1ms(200);
           R=1;                           //红灯亮一下
           _nop_();
           _nop_();
           _nop_();
           _nop_();
           PCON=0x02;                   //进入掉电状态
           _nop_();
           _nop_();
           _nop_();
           _nop_();
           dscs=0;
           EX1=0;
           R=0;                           //红灯亮一下
           ys1ms(200);
           R=1;
           dscs++;
        }
}
主函数改成这样的话,直接就是红-绿-红-绿一直闪烁

进入了掉电,是不是中断一直在唤醒呢?

应该是这样了,但是不应该触发中断的啊,外中断1一直低电平的

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top