找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2408|回复: 13
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:863657 发表于 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; //直接复位程序重新执行
        
        }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

使用道具 举报

板凳
ID:863657 发表于 2022-10-20 10:04 | 只看该作者
xia20 发表于 2022-10-20 09:57
当它运行到10毫秒时,你的按键要正好按下,请问你的手速有这么快吗?还是说你以什么方法实现的?如果你的“ ...

人工按得,想法是 相当于是每10ms 扫描一次按键状态,好像怎么改时间中断服务函数里 都进不去 掉电
回复

使用道具 举报

地板
ID:624769 发表于 2022-10-20 10:11 | 只看该作者
既然,啥都没有所有都靠猜,那就瞎猜一下,你的K1  刚好接在 P3.0,
回复

使用道具 举报

5#
ID:863657 发表于 2022-10-20 10:20 来自触屏版 | 只看该作者
188610329 发表于 2022-10-20 10:11
既然,啥都没有所有都靠猜,那就瞎猜一下,你的K1  刚好接在 P3.0,

是的 就是p3.0,掉电模式放主函数里就可以掉电,但是不能立即掉电,得等呼吸灯跑完,
放中断里想着应该可以立即掉电了吧又不能执行
回复

使用道具 举报

6#
ID:624769 发表于 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;
}
回复

使用道具 举报

7#
ID:384109 发表于 2022-10-20 10:41 | 只看该作者
按键释放后再掉电
回复

使用道具 举报

8#
ID:401564 发表于 2022-10-20 14:50 | 只看该作者
不能在中断函数中进入掉电模式
掉电模式唤醒过程:在掉电模式执行之后,被中断触发,程序马上进入中断
如果在中断模式中进入掉电模式:中断本身还没有返回,你就在当前模式进入了掉电模式,等到你再按下按键,又一次进入中断,而之前的中断并没有返回
整个过程都断套了.......至于会出什么问题,不知道,也不重要,你只要知道单片机乱了就行了
回复

使用道具 举报

9#
ID:863657 发表于 2022-10-20 15:25 | 只看该作者
Y_G_G 发表于 2022-10-20 14:50
不能在中断函数中进入掉电模式
掉电模式唤醒过程:在掉电模式执行之后,被中断触发,程序马上进入中断
如果 ...

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

使用道具 举报

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

用标志位,不要用1ms以上的delay
回复

使用道具 举报

11#
ID:863657 发表于 2022-10-20 16:56 | 只看该作者
lkc8210 发表于 2022-10-20 16:26
用标志位,不要用1ms以上的delay

请问 标志位是需要用 if判断的么,如果程序已经在一个if 语句里执行了,这时候标志位变化了,那还是得等到当前if语句执行完才能判断 标志位变化的if吧
回复

使用道具 举报

12#
ID:863657 发表于 2022-10-20 17:25 来自触屏版 | 只看该作者
lkc8210 发表于 2022-10-20 16:26
用标志位,不要用1ms以上的delay

好像明白了,每执行一段程序就判断一下标志位,这样就可以比较快的关机了
回复

使用道具 举报

13#
ID:401564 发表于 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)        这个条件下才会被执行的,这就是一个去抖动的效果



回复

使用道具 举报

14#
ID:123289 发表于 2022-10-21 08:46 | 只看该作者
只问一个问题:
在中断服务程序中,执行了【掉电模式】之后。如何唤醒呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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