找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机系统的暂停与恢复问题

[复制链接]
跳转到指定楼层
楼主
ID:811381 发表于 2022-5-16 21:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想做个系统,要求单片机在任意时刻,按下按键系统暂停,再次按下按键的时候恢复继续执行。我用了2种方法都有问题。
方法一:中断和按键用的同一个引脚(部分程序,中断开启在初始化中做了)
bit temp;
sbit key=P3^2;
void int0() interrupt 0
{
       temp=1;
       while(temp==1)
       {
               if(key==0)
              {
                      delay(10);
                      if(key==0)
                     {
                            temp=0;
                            while(key==0);
                     }
              }
       }
}
方法二:掉电模式
void int0() interrupt 0      
{   
        uint x=0;
        IT0=0;
        EX0=0;
        while(k1==0)
        {
                x++;
                delay(10);
                if(x>=1000)
                {
                         PCON=0;
                }                  
        }
        if(x<1000)
        {
                IT0=1;
                EX0=1;
                PCON=0x02;
                delay(10);
        }              
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:811381 发表于 2022-5-16 21:43 | 只看该作者
方法二是参考的其他朋友的程序
回复

使用道具 举报

板凳
ID:123289 发表于 2022-5-17 10:28 | 只看该作者
做个奇偶控制器,为奇CPU进行休眠,为偶CPU退出休眠。
奇偶控制器的奇偶,由按键产生中断的奇偶次数控制。
回复

使用道具 举报

地板
ID:584814 发表于 2022-5-17 13:47 | 只看该作者
什么问题呢 ? 是按下键后没人送茶么 ?
回复

使用道具 举报

5#
ID:624769 发表于 2022-5-17 13:54 | 只看该作者
单片机, 是不存在暂停的, 要起到看上去"暂停"的效果, 要么让他 在一个地方 傻跑, 要么休眠。你的两个思路都对,但是代码都有问题。

方法一:中断和按键用的同一个引脚(部分程序,中断开启在初始化中做了)
注意: IT0 =1
sbit key=P3^2;
void int0() interrupt 0
{

       unsigned char i;
       while((IE0) || (!key))
       {
               IE0 = 0;
               i = 200;
               while(--i);
       }  //消抖 & 释放按键
       while(!IE0);        //暂停现象
       while((IE0) || (!key))
       {
               IE0 = 0;
               i = 200;
               while(--i);
       }  //消抖 & 释放按键
}


方法二:掉电模式    注意: IT0 =1
由于,STC15系列,部分机型 中断中用PCON = 0x02; 会有意外,所以,掉电模式最好配合主程序使用。

bit Pause_Stats;
sbit key=P3^2;


void int0() interrupt 0      //必须要有
{   

               EX0 = 0;   //关中断
}

void main()
{
       unsigned char i;
     IT0 = 1;
     EX0 = 0;   //关中断
     EA  = 1;
  while(1)
  {
         if(IE0)
         {
               while((IE0) || (!key))
              {
                       IE0 = 0;
                       i = 200;
                       while(--i);
               }  //消抖 & 释放按键
                EX0 = 1;     //开中断
                 PCON=0x02;      //休眠           
                _nop_();
                _nop_();
                while((IE0) || (!key))
               {
                       IE0 = 0;
                       i = 200;
                       while(--i);
                }  //消抖 & 释放按键
           }
}
回复

使用道具 举报

6#
ID:811381 发表于 2022-5-17 16:06 | 只看该作者
188610329 发表于 2022-5-17 13:54
单片机, 是不存在暂停的, 要起到看上去"暂停"的效果, 要么让他 在一个地方 傻跑, 要么休眠。你的两个思路都 ...

谢谢,我研究下
回复

使用道具 举报

7#
ID:811381 发表于 2022-5-25 14:18 | 只看该作者
188610329 发表于 2022-5-17 13:54
单片机, 是不存在暂停的, 要起到看上去"暂停"的效果, 要么让他 在一个地方 傻跑, 要么休眠。你的两个思路都 ...

您好,您的方法一,进入中断后标志位不是自动清零的么?为什么还要手动IE0=0呢?然后当IE0=0时就原地等待,那么再次按下按键时,怎么退出中断返回继续执行的呢?没太懂,您的程序我验证了,就是没太明白您的设计思想
回复

使用道具 举报

8#
ID:811381 发表于 2022-5-25 14:28 | 只看该作者
188610329 发表于 2022-5-17 13:54
单片机, 是不存在暂停的, 要起到看上去"暂停"的效果, 要么让他 在一个地方 傻跑, 要么休眠。你的两个思路都 ...

请教您下,方法二中, 中断唤醒的时候自动对PCON清零么?不需要手动对PCON清零么?
回复

使用道具 举报

9#
ID:624769 发表于 2022-5-25 14:30 | 只看该作者
的事发生的 发表于 2022-5-25 14:18
您好,您的方法一,进入中断后标志位不是自动清零的么?为什么还要手动IE0=0呢?然后当IE0=0时就原地等待 ...

是的,IE0 会自动清0,但是98%以上的按键会有 “抖动” 所以 IE0 会又被置1,所以手动 清IE0 ,以及 判断IE0 都是为了一个目的,那就是“消抖”, 大多数牵涉到按键的代码,如果能确保 按键 不会有 “抖动”, 那么,代码都会简洁的多。
回复

使用道具 举报

10#
ID:624769 发表于 2022-5-25 14:35 | 只看该作者
的事发生的 发表于 2022-5-25 14:28
请教您下,方法二中, 中断唤醒的时候自动对PCON清零么?不需要手动对PCON清零么?

PCON = 0x02; 即给 PCON.1   位 置1 这个动作,只有1瞬间,作用是让单片机休眠,但是,PCON.1 永远不会变成1, 即任何时候,你读 PCON.1 得到的 都是0, 所以,不存在给 PCON.1 清零的问题。
回复

使用道具 举报

11#
ID:811381 发表于 2022-5-26 17:54 | 只看该作者
188610329 发表于 2022-5-25 14:30
是的,IE0 会自动清0,但是98%以上的按键会有 “抖动” 所以 IE0 会又被置1,所以手动 清IE0 ,以及 判断I ...

中断中while(!IE0);这条语句是等待 ,就死到中断里面了,再次按下按键,IE0还是为零,怎么实现的再次按下按键跳出中断返回继续执行程序的呢?
回复

使用道具 举报

12#
ID:811381 发表于 2022-5-26 17:55 | 只看该作者
明白了,非常感谢您的解惑
回复

使用道具 举报

13#
ID:624769 发表于 2022-5-26 20:02 | 只看该作者
的事发生的 发表于 2022-5-26 17:54
中断中while(!IE0);这条语句是等待 ,就死到中断里面了,再次按下按键,IE0还是为零,怎么实现的再次按下 ...

=>中断中while(!IE0);这条语句是等待 ,就死到中断里面了,再次按下按键,IE0还是为零,怎么实现的再次按下按键跳出中断返回继续执行程序的呢?
程序死在 while(!IE0);  达到你要的“暂停”效果,直到你再次按下按键后,打破这个死循环,然后进行后面的消抖后,跳出中断。程序恢复运行。
回复

使用道具 举报

14#
ID:811381 发表于 2022-5-27 16:55 | 只看该作者
188610329 发表于 2022-5-26 20:02
=>中断中while(!IE0);这条语句是等待 ,就死到中断里面了,再次按下按键,IE0还是为零,怎么实现的再次按 ...

哦,我以为第一次进入中断暂停死到里面了,下次按键打断中断,进去后IE0仍为0,还退不出来中断。看起来是我对具体的过程理解有误,非常感谢您的解惑
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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