找回密码
 立即注册

QQ登录

只需一步,快速开始

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

请教高手关于单片机的休眠问题

[复制链接]
跳转到指定楼层
楼主
请教一下高手,如何让单片机进入休眠以后,每隔一分钟启动一次,工作几秒钟以后再次进入休眠?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:386381 发表于 2018-10-5 21:45 来自手机 | 只看该作者
51单片机有休眠功能吗?
回复

使用道具 举报

板凳
ID:164602 发表于 2018-10-6 08:16 | 只看该作者
查单片机芯片手册就可以用程序去设置休眠了。不是所有的单片机都可以休眠的,例如:

这个不能休眠


这个可以。

回复

使用道具 举报

地板
ID:155507 发表于 2018-10-6 08:53 | 只看该作者
51单片机, 如 STC 系列单片机 ,可以进入休眠状态(或者掉电模式),待机方式(或者空闲模式),
掉电模式:为 时钟停止的 所有工作状态 全部停止, 可以 有部分 IO 口触发唤醒(连接按键的功能) , 可以 通过 软件 设置 标志位 进入掉电模式
空闲模式:为除了 CPU 不工作外,其余 都正常工作 如 定时器 等等,可以于 中断 及 部分 IO 口触发唤醒, 可以 通过 软件 设置 标志位 进入空闲模式
不是 所有 单片机 具有上述功能,要根据 单片机的 数据手册 标示。

单片机的型号不同,指令不同。你用什么型号的单片机?
回复

使用道具 举报

5#
ID:246251 发表于 2018-10-6 09:27 | 只看该作者
用的什么单片机?stm32 单片机的话休眠进STOP_MODE模式可以设置闹钟中断定时唤醒单片机
回复

使用道具 举报

6#
ID:330198 发表于 2018-10-6 10:35 | 只看该作者
首先单片机要有定时唤醒功能,就可以设置自动唤醒时间。要是没有这个功能的话,只能通过外中断唤醒了。
回复

使用道具 举报

7#
ID:403593 发表于 2018-10-6 15:32 | 只看该作者
是STC15W系列,我看了手册了,也试了一下官方的例程,是用的掉电唤醒定时器,但是它的定时时间太短了,最长只有200多毫秒。我试着加入了一个计数器,每次唤醒以后计数器加一,别的什么事都不干,直到总的延时时间够了再开始正式工作。这样做可不可以?不知道其他高手是怎么做的?
回复

使用道具 举报

8#
ID:155507 发表于 2018-10-6 23:49 | 只看该作者
  1. /*---------------------------------------------------------------------*/
  2. /* --- STC MCU Limited ------------------------------------------------*/
  3. /* --- STC15F4K60S4 系列 掉电唤醒定时器举例----------------------------*/
  4. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序        */
  5. /* 如果要在文章中应用此代码,请在文章中注明使用了STC的资料及程序        */
  6. /*---------------------------------------------------------------------*/

  7. //本示例在Keil开发环境下请选择Intel的8058芯片型号进行编译
  8. //若无特别说明,工作频率一般为11.0592MHz


  9. #include "reg51.h"
  10. #include "intrins.h"

  11. //-----------------------------------------------

  12. sfr P0M1 = 0x93;
  13. sfr P0M0 = 0x94;
  14. sfr P1M1 = 0x91;
  15. sfr P1M0 = 0x92;
  16. sfr P2M1 = 0x95;
  17. sfr P2M0 = 0x96;
  18. sfr P3M1 = 0xb1;
  19. sfr P3M0 = 0xb2;
  20. sfr P4M1 = 0xb3;
  21. sfr P4M0 = 0xb4;
  22. sfr P5M1 = 0xC9;
  23. sfr P5M0 = 0xCA;
  24. sfr P6M1 = 0xCB;
  25. sfr P6M0 = 0xCC;
  26. sfr P7M1 = 0xE1;
  27. sfr P7M0 = 0xE2;

  28. sfr WKTCL = 0xaa;                   //掉电唤醒定时器计时低字节
  29. sfr WKTCH = 0xab;                   //掉电唤醒定时器计时高字节

  30. sbit P10 = P1^0;
  31. sbit P11 = P1^1;

  32. char count=0;

  33. //-----------------------------------------------

  34. void main()
  35. {
  36.     P0M0 = 0x00;
  37.     P0M1 = 0x00;
  38.     P1M0 = 0x00;
  39.     P1M1 = 0x00;
  40.     P2M0 = 0x00;
  41.     P2M1 = 0x00;
  42.     P3M0 = 0x00;
  43.     P3M1 = 0x00;
  44.     P4M0 = 0x00;
  45.     P4M1 = 0x00;
  46.     P5M0 = 0x00;
  47.     P5M1 = 0x00;
  48.     P6M0 = 0x00;
  49.     P6M1 = 0x00;
  50.     P7M0 = 0x00;
  51.     P7M1 = 0x00;

  52.     WKTCL = 255;                     //设置唤醒周期为488us*(30719+1) = 15s
  53.     WKTCH = 0xF7;                   //使能掉电唤醒定时器
  54.    
  55.     while (1)
  56.     {
  57.         PCON = 0x02;                //进入掉电模式
  58.         _nop_();                    //掉电模式被唤醒后,直接从此语句开始向下执行,不进入中断服务程序
  59.         _nop_();
  60.          count++;
  61.          if(count >=4)
  62.         {
  63.           P11 = !P11;  // 每隔一分钟 取反测试口
  64.           count=0;
  65.         }
  66.         P10 = !P10;                 //掉电唤醒后,取反测试口
  67.     }
  68. }

复制代码
回复

使用道具 举报

9#
ID:403593 发表于 2018-10-7 17:10 | 只看该作者

感谢回答!跟我想的大致一样,这是我的程序,基本也是根据官方例程修改的。

void main()
{
    WKTCL = 500;        //设置唤醒周期为488us*(49+1) = 250ms
    WKTCH = 0x80;        //使能掉电唤醒定时器
   
    while (1)
    {
                if(INT0)
                {
                        if(time < 1000)time ++;
                                else
                                {
                                        time = 0;
                                        LED = 0;
                                        Delay1ms(1000);
                                        LED = 1;
                                }               
                 }

                 else LED = 0;

        PCON = 0x02;        //进入掉电模式
        _nop_();                  //掉电模式被唤醒后,直接从此语句开始向下执行,不进入中断服务程序
        _nop_();
    }
}
回复

使用道具 举报

10#
ID:403593 发表于 2018-10-7 17:12 | 只看该作者
    WKTCL = 500;        //设置唤醒周期为488us*(49+1) = 250ms
    WKTCH = 0x80;        //使能掉电唤醒定时器
这里第二句,我还以为就是使能定时器用的。。。还纳闷呢,为啥高位不能调节,只能调节低位。。。
回复

使用道具 举报

11#
ID:403593 发表于 2018-10-7 17:52 | 只看该作者
但是您写的程序,低位255+高位的0xf7也不等于30719啊,这个数是怎么得出来的呢?我找遍数据手册也没有找到有关掉电唤醒定时器的详细介绍,就是一段历程而已,请问这个时间是怎么计算的?
回复

使用道具 举报

12#
ID:155507 发表于 2018-10-7 18:01 | 只看该作者

WKTCL = 500;   出错了

WKTCL 是8位的 是一个字节。范围(0-255)
回复

使用道具 举报

13#
ID:401564 发表于 2018-10-7 23:04 | 只看该作者
可以配合看门狗使用

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

14#
ID:155507 发表于 2018-10-7 23:19 | 只看该作者
WKTCL和WKTCH共同组成15位唤醒定时器,WKTEN 是用来作为定时器开关的
设置WKTCH=0xF7;WKTCL=0xFF; 定时15S
对 {WKTCH[6:0], WKTCL[7:0]}写入77FFH(即30719)。


STC15wSleep.png (205.02 KB, 下载次数: 60)

STC15wSleep.png

STC15wSleep01.png (112.89 KB, 下载次数: 51)

STC15wSleep01.png
回复

使用道具 举报

15#
ID:403593 发表于 2018-10-8 11:35 | 只看该作者
angmall 发表于 2018-10-7 23:19
WKTCL和WKTCH共同组成15位唤醒定时器,WKTEN 是用来作为定时器开关的
设置WKTCH=0xF7;WKTCL=0xFF; 定时15S ...

太感谢了!根据你发来的截图上的页码,我找到了相应的内容,也知道这个时间是怎么计算的了!谢谢谢谢!
回复

使用道具 举报

16#
ID:84465 发表于 2018-10-8 23:06 | 只看该作者
同问:
我自学单片机汇编语言,用STC11F02的单片机和RDA5807做了一个收音机,
11F02控制段扫数码管来显示接收频率值。调试时发现,段扫显示板干扰收音机的接收。
把单片机断电,收音效果就好了。
现在想:利用STC单片机的掉电(或是休眠)功能,让收音机开机工作一两分钟后,
进入掉电(或是休眠)状态。
再利用单片机的P3.3和P3.4脚按键,进行外部中断唤醒。
请教高手坛友,应该怎么做?
回复

使用道具 举报

17#
ID:403593 发表于 2018-10-9 09:53 | 只看该作者
ln7812 发表于 2018-10-8 23:06
同问:
我自学单片机汇编语言,用STC11F02的单片机和RDA5807做了一个收音机,
11F02控制段扫数码管来显示 ...

其实你这个很好做,单片机发送完数据以后直接进入休眠,没必要一两分钟以后在休眠,发送完以后就可以立即进入休眠,顺便把数码管也关闭,剩下的事情就交给RDA5807和功放电路来做就好了,需要调整音量或者频率的时候再重新唤醒,11系列正好有4个外部中断,都可以唤醒单片机。这样既没有干扰,也会大幅度降低损耗,很适合做电池供电的东西。至于程序,可以参考官方的例程来做。
回复

使用道具 举报

18#
ID:84465 发表于 2018-10-9 22:48 | 只看该作者
这一生只为你 发表于 2018-10-9 09:53
其实你这个很好做,单片机发送完数据以后直接进入休眠,没必要一两分钟以后在休眠,发送完以后就可以立即 ...

感谢坛友指教。
如果是单片机发送完数据就直接进入休眠,那就是数码管通电一闪就灭了,调整频率不方便。
让它延迟一两分钟进入休眠,就是为了调整方便的。
就是这个延迟延迟一两分钟的程序,
是采取让单片机发送完数据后进行循环执行,还是利用定时器延迟执行,
因为水平菜,所以请教高手指点迷津
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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