找回密码
 立即注册

QQ登录

只需一步,快速开始

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

MCU仿真可以进入休眠,烧录到板子上反倒不可以了,这是为什么?

[复制链接]
跳转到指定楼层
楼主
ID:582403 发表于 2023-6-27 16:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
昨天搞了个流水灯,跑仿真的时候,进入休眠是正常的,每次都会进去,只有按键中断唤醒。可烧到板子上的时候,休眠状态下,静态电流居然400ua,很明显是没有进去,找了很久都找不到问题,有没有大佬帮帮我啊!!跪了orz

单片机MCU源程序如下:
  1. 这是按键的
  2. void Key_Scan(void)
  3. {
  4.            if(S1 == 0)
  5.            {
  6.                       if(Key_Flag)
  7.                       {
  8.                                  Old_flag = S1;
  9.                                  gKeyCnt++;
  10.                           if(gKeyCnt > 0&&gKeyCnt < 20)
  11.                    {
  12.                        if(gKeyValue < 10)
  13.                                      {
  14.                                                 gKeyValue++;
  15.                                                        Key_Flag = 0;
  16.                                      }
  17.                                             else
  18.                                             {
  19.                                                        gKeyValue = 1;
  20.                                                        Key_Flag = 0;
  21.                                             }
  22.       //--------处理键值-------------------------
  23.                               switch(gKeyValue)
  24.                        {
  25.                                                 case 0:                  
  26.                                                     break;
  27.                                                 case 1:        
  28.                                                 {
  29.                                                     Red = 0;
  30.                                                     break;
  31.                                                 }
  32.                                                 case 2:
  33.                                                 {
  34.                                                            Green = 0;
  35.                                                     break;
  36.                                                 }
  37.                                   case 3:
  38.                                                 {
  39.                                                            Red = 1;
  40.                                                     break;
  41.                                                 }
  42.                                                 case 4:
  43.                                                 {
  44.                                                            Blue = 0;
  45.                                                     break;
  46.                                                 }
  47.                                                 case 5:
  48.                                                 {
  49.                                                            Green = 1;
  50.                                                     break;
  51.                                                 }
  52.                                                 case 6:
  53.                                                 {
  54.                                                            Red = 0;
  55.                                                            break;
  56.                                                 }                                       
  57.                                   case 7:
  58.                                                 {
  59.                                                            Green = 0;
  60.                                              break;  
  61.                                                 }
  62.                                   case 8:
  63.                                                 {
  64.                                                            Auto_Flag = 1;
  65.                                                            Green = 1;
  66.                                                            Blue = 1;
  67.                                              break;  
  68.                                                 }  
  69.                                   case 9:
  70.                                                 {
  71.                                                            Auto_Flag = 0;
  72.                                                            Breath_Flag = 1;
  73.                                              break;  
  74.                                                 }
  75.                                   case 10:
  76.                                                 {
  77.                                                            Breath_Flag = 0;
  78.                                                            Sleep_Flag = 0;
  79.                                              break;  
  80.                                                 }         
  81.                        }
  82.                                  }
  83.                                  else
  84.                                  {
  85.                                             gKeyCnt = 0;
  86.                                  }
  87.                       }
  88.            Delay_Off();
  89.            }
  90.            else
  91.            {
  92.                       gKeyCnt = 0;
  93.                       Key_Flag = 1;
  94.            }
  95. }
  96. 这是主函数:
  97.           while (1)
  98.            {  
  99.                       Key_Scan();
  100.                       if(Auto_Flag)
  101.                       {
  102.                                  Auto_Color();
  103.                       }
  104.                       else if(Breath_Flag)
  105.                       {
  106.                                  Breath();
  107.                       }
  108. //-----------------睡眠------------------
  109.                           if(Sleep_Flag == 0)
  110.                           {
  111.                                      Sleep_Flag=1;
  112.                                      GIE = 0;
  113.                 P1KBCR = 0x20;             //使能键盘中断位
  114.                                             KBIE = 1;
  115.                                      Nop();
  116.                                      Nop();
  117.                                             Stop(); //睡眠
  118.                                      Nop();
  119.                                      Nop();
  120.                                             P1KBCR = 0x00;
  121.                                      KBIE = 0;
  122.                                      GIE = 1;                     
  123.                           }

  124.            }
  125. 中断里什么都没加,只为了唤醒,其他都是灯的闪烁功能了。
复制代码


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

使用道具 举报

沙发
ID:213173 发表于 2023-6-28 07:34 | 只看该作者
单片机休眠,自身耗电是uA级的,但不代表外围电路不耗电。这取决于你的电路设计和编程。单片机休眠之前把当前状态保存,关闭外设,进入休眠。唤醒后恢复之前保存的状态。以下是一键开关机的掉电模式函数,供参考。
  1. void Shutdown()//掉电模式函数
  2. {
  3.         if(allow)
  4.         {
  5.                 P1=0xff;                //关闭LED显示
  6.                 //关闭所有在用硬件,减小能耗
  7.                 EX0 = 1;                //打开中断
  8.                 PCON = 0x02;//MCU进入掉电模式
  9.                 _nop_();    //掉电模式被唤醒后,首先执行此语句,然后再进入中断服务程序
  10.                 _nop_();    //中断服务程序执行完再接着此句继续执行
  11.                 EX0 = 0;                //关闭中断
  12.                 while(!key);//等待按键松手,防止按键扫描程序误读
  13.                 //打开所有在用硬件,恢复正常运行
  14.                 P1=~Temp;                //恢复LED显示
  15.                 allow=0;                //清0
  16.         }
  17. }
复制代码
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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