标题: 单片机一个按键立马控制呼吸灯亮灭,为什么中断服务程序里面不能执行掉电模式? [打印本页]

作者: zhaomin253    时间: 2022-10-20 09:36
标题: 单片机一个按键立马控制呼吸灯亮灭,为什么中断服务程序里面不能执行掉电模式?
void main()
{
Timer0Init;
while(1)
        {
                PWM_huxi ();
  }
}

void T0 () interrupt 1
{
        TL0 = 0xCD;                //设置定时初值
        TH0 = 0xD4;                //设置定时初值
        num++;
        if(num==10)   //10ms
                {
               
         
         if(!K1)
         {
                  Delayms(20);
                 if(!K1)
                 {
                  
                  while(!K1);
            INT_CLKO |= 0x40; //打开INT4 外部中断 唤醒功能
                        num=0;
                        PCON=0X02;//进入掉电模式
                        Delayms(5);
                  
                 }
         }
         else num=0;
}
}
void Int4()  interrupt 16
{
        
                INT_CLKO &= 0xBF;        //中断清零
                        EA=0;
        IAP_CONTR=0X20; //直接复位程序重新执行
        
        }


作者: xia20    时间: 2022-10-20 09:57
当它运行到10毫秒时,你的按键要正好按下,请问你的手速有这么快吗?还是说你以什么方法实现的?如果你的“!K1”是人工操作的,这个要进入掉电模式就和你中奖的几乎也差不多了。
作者: zhaomin253    时间: 2022-10-20 10:04
xia20 发表于 2022-10-20 09:57
当它运行到10毫秒时,你的按键要正好按下,请问你的手速有这么快吗?还是说你以什么方法实现的?如果你的“ ...

人工按得,想法是 相当于是每10ms 扫描一次按键状态,好像怎么改时间中断服务函数里 都进不去 掉电
作者: 188610329    时间: 2022-10-20 10:11
既然,啥都没有所有都靠猜,那就瞎猜一下,你的K1  刚好接在 P3.0,
作者: zhaomin253    时间: 2022-10-20 10:20
188610329 发表于 2022-10-20 10:11
既然,啥都没有所有都靠猜,那就瞎猜一下,你的K1  刚好接在 P3.0,

是的 就是p3.0,掉电模式放主函数里就可以掉电,但是不能立即掉电,得等呼吸灯跑完,
放中断里想着应该可以立即掉电了吧又不能执行
作者: 188610329    时间: 2022-10-20 10:39
zhaomin253 发表于 2022-10-20 10:20
是的 就是p3.0,掉电模式放主函数里就可以掉电,但是不能立即掉电,得等呼吸灯跑完,
放中断里想着应该 ...

按键按下,又抬起后, (你要想稳定工作,必须抬起后!!!)设置一个标志, 比如 Poweroff = 1;
PWM函数,中检测到  if(Poweroff)  break;   跳出PWM函数。
最后,主函数中,
if(Poweroff)
{
   Poweroff  = 0;
   PCON      = 0x02;
}
作者: 人中狼    时间: 2022-10-20 10:41
按键释放后再掉电
作者: Y_G_G    时间: 2022-10-20 14:50
不能在中断函数中进入掉电模式
掉电模式唤醒过程:在掉电模式执行之后,被中断触发,程序马上进入中断
如果在中断模式中进入掉电模式:中断本身还没有返回,你就在当前模式进入了掉电模式,等到你再按下按键,又一次进入中断,而之前的中断并没有返回
整个过程都断套了.......至于会出什么问题,不知道,也不重要,你只要知道单片机乱了就行了
作者: zhaomin253    时间: 2022-10-20 15:25
Y_G_G 发表于 2022-10-20 14:50
不能在中断函数中进入掉电模式
掉电模式唤醒过程:在掉电模式执行之后,被中断触发,程序马上进入中断
如果 ...

哦原来如此,受教了,请问下,
那不用中断,如何才能控制一个程序在运行中途突然关机呢,(不切断电源,只软关断,比如一个信号),

作者: lkc8210    时间: 2022-10-20 16:26
zhaomin253 发表于 2022-10-20 15:25
哦原来如此,受教了,请问下,
那不用中断,如何才能控制一个程序在运行中途突然关机呢,(不切断电源, ...

用标志位,不要用1ms以上的delay
作者: zhaomin253    时间: 2022-10-20 16:56
lkc8210 发表于 2022-10-20 16:26
用标志位,不要用1ms以上的delay

请问 标志位是需要用 if判断的么,如果程序已经在一个if 语句里执行了,这时候标志位变化了,那还是得等到当前if语句执行完才能判断 标志位变化的if吧
作者: zhaomin253    时间: 2022-10-20 17:25
lkc8210 发表于 2022-10-20 16:26
用标志位,不要用1ms以上的delay

好像明白了,每执行一段程序就判断一下标志位,这样就可以比较快的关机了
作者: Y_G_G    时间: 2022-10-20 19:08
zhaomin253 发表于 2022-10-20 15:25
哦原来如此,受教了,请问下,
那不用中断,如何才能控制一个程序在运行中途突然关机呢,(不切断电源, ...

参考一下:
sbit        KEY=P3^2;                //按键开关
bit                ON;                                //开机状态标志位
unsigned char        time_10ms=0x00;        //按键10mS延时变

while(1)
        {                                                                                                                                                
                if((time_10ms>=5)&&KEY)                                        //按键没有按下,50mS进行一次处理
                {
                        if(!key_press)
                       {
                           ON=!ON;                                        //按键有效按下就开/关机
                           key_press=0;
                        }
                        if(!ON&&!key_press)                                                  //ON标志位补清除,按键已经处理,关机
                        {
                                PCON=0x02;                                                        //进入掉电模式
                                _nop_();_nop_();_nop_();_nop_();        //4个空指令
                                Mcu_Awaken();                                                  //单片机唤醒,自己可以写一些自己需要的功能                       
                        }
                        time_10ms=0x00;                                                        //清除时间
                }       
        }

void Int0_isr() interrupt 0        //外部中断0
{       
        key_press=1;                          //按下按键
        time_10ms=0x00;                          //从最后一次退出中断开始计时
        IE0=0;
}

void T0_isr() interrupt        1
{
        if(time_10ms<250)time_10ms++;        //每10mS,time_10ms++一次
}
time_10ms是定时器中断中++的全局变量.按键按下就清除
key_press是一个标示,按键中断按下就标志,随便按键怎么抖动,中断只做这两件事
主程序中的相关程序执行,永远是在if((time_10ms>=5)&&KEY)        这个条件下才会被执行的,这就是一个去抖动的效果




作者: yzwzfyz    时间: 2022-10-21 08:46
只问一个问题:
在中断服务程序中,执行了【掉电模式】之后。如何唤醒呢?




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1