找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1989|回复: 6
收起左侧

关于STC8G1K08A单片机用遥控器控制掉电唤醒的问题

[复制链接]
ID:921294 发表于 2022-11-17 15:28 | 显示全部楼层 |阅读模式
     最近有空刚学习掉电唤醒这一块,用遥控器能让单片机进入掉电模式,此时能控制P54脚输出的PWM停止不输出,但P54脚有时为高电平,有时也为低电平。P32脚(P32脚接接收头IR)在进入掉电模式时,立马为低电平,此时P32脚用导线触碰一下高电平(3—5V),可以唤醒单片机,但是再按遥控器不能进入掉电模式,关掉电源再打开,才能用遥控器能让单片机进入掉电模式。代码中这种用遥控器控制掉电唤醒的方法是不是行不通,因为只要P32在进入掉电模式时,立马为低电平,这时按遥控器,用示波器测此脚波形,一点反应都没有。有什么其它的好办法能用遥控器控制掉电唤醒?代码如下:

单片机源程序如下:
#include  "STC8xxxx.H"
#include  "pwm.h"
#include  "38KHZ.h"
#include  "IR.h"

#define IDL             0x01                    //PCON.0  IDLE(空闲)模式控制位
#define PD              0x02                    //PCON.1  时钟停振模式/掉电模式/停电模式 控制位
//sfr    INTCLKO     =   0x8f;
//#define EX2             0x10
//#define EX3             0x20
//#define EX4             0x40

void IR_RX_NEC(void);

void INT1_Isr() interrupt 0
{
   P32 = !P32;                                 //测试端口
}





void  main(void)
{
    P3M0 = 0x00;
    P3M1 = 0x00;
    P5M0 = 0x00;
    P5M1 = 0x00;
    pwm_int() ;
        hwKHZ_int();
        //exint1Init();
        
   AUXR = 0x80;    //Timer0 set as 1T, 16 bits timer auto-reload,
   TH0 = (u8)(Timer0_Reload / 256);
   TL0 = (u8)(Timer0_Reload % 256);
   ET0 = 1;    //Timer0 interrupt enable
   TR0 = 1;    //Tiner0 run

    cnt_1ms = SysTick / 1000;
    EA = 1;     //打开总中断
            
        
        while(1)
        {
          if(B_1ms)   //1ms到
                  {
                          B_1ms = 0;
                 if(B_IR_Press)                //有IR键按下
                {
                        switch(IR_code)
                        {
                                case 0x45:
                                    EX0 = 1;                                    //使能INT0中断,用于唤醒MCU
                                    
                    EA = 1;
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                // PCON = IDL;                                 //MCU进入IDLE模式
                  PCON = PD;                                  //MCU进入掉电模式
                    _nop_();
                    _nop_();
                    _nop_();
                    _nop_();
                                                  
                                        break;
                                
                                case 0x46:


                    IT0 = 1;                                    //使能INT1上升沿和下降沿中断
                //  IT1 = 1;                                    //使能INT1下降沿中断
                    EX0 = 1;                                    //使能INT1中断

                    EA = 1;

                    PCON = 0x02;                                //MCU进入掉电模式
                    _nop_();                                    //掉电模式被唤醒后,MCU首先会执行此语句
                                                                //然后再进入中断服务程序
                    _nop_();
                    _nop_();
                    _nop_();
                                 
                    break;
                        }
                        B_IR_Press = 0;                //清除IR键按下标志
                }
             }
                  if (P3^2==0)
                  {
                         pwm = PWM_DUTY *4.4/ 10;     //给PWM一个初值,这里为44%占空比
                         LoadPWM(pwm);
          }                          
                  else
                  {
                   pwm = PWM_DUTY *8.3/ 10;     //给PWM一个初值,这里为83%占空比
                   LoadPWM(pwm);                      //计算PWM重装值
                  
                  }
                 
        
        }
}




正常工作时的P54脚输出.jpg
掉电模式下的P54脚.jpg
掉电模式下的P32 IR脚输入.jpg
回复

使用道具 举报

ID:123289 发表于 2022-11-17 16:49 | 显示全部楼层
CPU掉电唤醒与遥控器控制无关!
何为【掉电】先说一说?CPU在何种情形下,是你所说的【掉电】呢?
何为【唤醒】再说一说?CPU在何种情形下,才能被唤醒呢?
弄清以上两个问题,就解了。

回复

使用道具 举报

ID:161164 发表于 2022-11-17 17:19 | 显示全部楼层
2022-11-17_171730.png 进入掉电/空闲模式前先把P32置1

回复

使用道具 举报

ID:1034262 发表于 2022-11-17 17:59 | 显示全部楼层
进入睡眠(掉电)模式前,先关闭PWM,并将IO输出确定的电平,否则睡眠时关闭时钟,PWM会停止,此时可能高也可能低。
睡眠不会影响任何IO的状态,也不影响内存,所以睡眠前一定要处理好IO。
回复

使用道具 举报

ID:403593 发表于 2022-11-20 09:44 | 显示全部楼层
请教一下楼主,这个示波器用起来怎样?
回复

使用道具 举报

ID:921294 发表于 2022-11-20 20:12 | 显示全部楼层
目前我觉得还可以,可以接双探头,测PWM波形,遥控器波形还是很方便的,可以保存波形,目前我只用到这些,也很方便携带。
回复

使用道具 举报

ID:921294 发表于 2022-11-23 17:19 | 显示全部楼层
    非常感谢以上几位朋友能在百忙中看一下我目前遇到的问题,并给出宝贵的意见。今天由于早下班有时间将程序修改了一下,改用一个按键K1接P32来控制(按键K1一脚按P32,另一脚接地)进入掉电模式和唤醒。长按进入掉电模式,短按唤醒单片机。功能现在是能实现了,短按唤醒单片机没有问题,一按就立马实现。长按进入掉电模式有一点小问题,有1/3的时候不能实现,也就是3次有可能有1次不能进入掉电模式,看波形情况是按下去P54脚没有波形,松开就有波形,再按1到2次就可以了。搞了一个多小时还没有好,请朋友们看下问题出在哪里?
    #include  "STC8xxxx.H"
#include  "pwm.h"
#include  "38KHZ.h"
//#include  "IR.h"

#define IDL             0x01                    //PCON.0  IDLE(空闲)模式控制位
#define PD              0x02                    //PCON.1  时钟停振模式/掉电模式/停电模式 控制位

sbit k1  =P3^2;//STC8G1K08A此脚为外部中断INT0,在非掉电模式下做按键用,按一次改变一次状态。

u16 jishu=0,ksj=0;





//void IR_RX_NEC(void);

void INT0_Isr() interrupt 0
{
//P32 = !P32;                                 //测试端口

                     EA=1;
                IT0=1;
                EX0=1;
                PCON=0x00;                             
}



void timer0 (void) interrupt 1
{
        TL0 = 0xE0;                //设置定时初始值
            TH0 = 0xB1;                //设置定时初始值
        jishu++;
}




void  main(void)
{
    P3M0 = 0x00;
    P3M1 = 0x00;
        P3PU |= 0x04;
    P5M0 = 0x00;
    P5M1 = 0x00;
    pwm_int() ;
        hwKHZ_int();

       
    AUXR |= 0x80;                //定时器时钟1T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xE0;                //设置定时初始值
        TH0 = 0xB1;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时       
        ET0 = 1;
        EA = 1;
       
       
       
       
        while(1)
        {
            if(jishu==10) //如果到了10次,说明10ms秒时间
              {
                if(k1==0)
                        {
//                                                 
                        ksj++;
                        if(1000>ksj>200)                               //长按按键标志
                             
                                                                                                                   
                       
                    ksj=0;
                    IE0  = 0;                                        //将INT0中断请求标志位清"0"                           
                    IT0 = 1;                                    //使能INT1 0 上升沿和下降沿中断 1下降沿中断               
                    EX0 = 1;                                    //使能INT1中断
                    EA = 1;                 
                    PCON = 0x02;                                //MCU进入掉电模式
                    _nop_();                                    //掉电模式被唤醒后,MCU首先会执行此语句
                                                               //手册中写到,唤醒会执行中断命令后一条语句之后转向中断
                                                               //然后再进入中断服务

                    _nop_();
                    _nop_();
                    _nop_();
                                        _nop_();//
                                        _nop_();
                                        _nop_();
                                }                                                                                          
                                   jishu=0;                                        //重新计数       
                                             
                                }   


                               
                  if (P5^5==0)
                  {
                         pwm = PWM_DUTY *4.4/ 10;     //给PWM一个初值,这里为44%占空比
                         LoadPWM(pwm);
          }                          
                  else
                  {
                   pwm = PWM_DUTY *8.3/ 10;     //给PWM一个初值,这里为83%占空比
                    LoadPWM(pwm);                //计算PWM重装值
                  
                  }
                 
       
        }
}
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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