找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15W408AS单片机掉电定时器的使用问题

  [复制链接]
跳转到指定楼层
楼主
ID:283037 发表于 2018-3-1 08:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请教大神,我用STC15W408AS读取温度,串口输出,因为需要节能,所以想要输出一次温度值后进入掉电模式,再用定时器唤醒。
掉电、唤醒部分的程序基本按手册上复制的,可是单片机还是一直不停的输出温度值,进不了掉电模式。
帮忙看一下是哪里不对,感谢。
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. //----------------------------------
  4. sfr WKTCL = 0xaa; //掉电唤醒定时器计时低字节
  5. sfr WKTCH = 0xab; //掉电唤醒定时器计时高字节
  6. sbit P10 = P1^0; //掉电测试口
  7. //------------------------------------------

  8.   
  9. void main()  
  10. {
  11.         WKTCL = 9999;                        //设置唤醒周期=488us*(9999+1)
  12.         WKTCH = 0x80;                //使能掉电唤醒定时器


  13.         delayms(10000);

  14.         while(1)
  15.         {   if(MIC==0)   
  16.                 {
  17.                 delayus(100);
  18.                   if(MIC==0)
  19.                     {  
  20.                         init();              
  21.                     delayms(1000);        
  22.       
  23.                         SendString("temperature is ");
  24.                     delayms(1000);
  25.                         temp=read_temp();       //读取温度  


  26.                        if(temp/10000 == 1)                                            //如果万位为1,则表示温度为负
  27.                 serial_send_byte('-');
  28.                 serial_send_byte(temp%10000/1000+'0');     //十位
  29.                 serial_send_byte(temp%1000/100+'0');         //个位
  30.                 serial_send_byte('.');
  31.                 serial_send_byte(temp%100/10+'0');         //小数点后第一位
  32.                 serial_send_byte(temp%10+'0');                 //小数点后第二位
  33.                 SendString("℃\r\n");

  34. //----------------------------------------------

  35.                 PCON= 0x02;                 //进入掉电模式
  36.                 _nop_();         //中断唤醒后从此开始执行。
  37.                               
  38.                 _nop_();
  39.                
  40.                 P10 = !P10;         //唤醒后取反测试口
  41. //---------------------------------------------------------               
  42.                        
  43.                        
  44.                        
  45.                         }  
  46.                 }   
  47.                
  48.         }

  49. }
复制代码


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

使用道具 举报

沙发
ID:213173 发表于 2018-3-1 15:39 | 只看该作者
本帖最后由 wulin 于 2018-3-1 17:00 编辑

WKTCL = 9999;??? 8位寄存器最大范围只能设置0~255!WKTCH是高7位寄存器,其最高位用作使能控制,WKTCL是低8位寄存器,合计最大定时值32767,约16秒。
并且只能字节操作不能位操作
WKTCL = 0xFF;                        //低8位值
WKTCH= 0x80+0x7F;                //使能掉电唤醒定时器 +高7位值

评分

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

查看全部评分

回复

使用道具 举报

板凳
ID:283037 发表于 2018-3-1 21:37 | 只看该作者
wulin 发表于 2018-3-1 15:39
WKTCL = 9999;??? 8位寄存器最大范围只能设置0~255!WKTCH是高7位寄存器,其最高位用作使能控制,WKTCL ...

感谢。我想要实现每休眠10分钟发送一次数据, 是不是只有重复进入掉电模式,有没有其它办法。
回复

使用道具 举报

地板
ID:213173 发表于 2018-3-2 09:14 | 只看该作者
alewe 发表于 2018-3-1 21:37
感谢。我想要实现每休眠10分钟发送一次数据, 是不是只有重复进入掉电模式,有没有其它办法。

长时间休眠只有重复进入掉电模式,单次最大设置数32767,也就是32766+1,约16秒
WKTCL = 0xFE;          // 低8位值,我在楼上回复有点错误。
WKTCH= 0x80+0x7F;  //使能掉电唤醒定时器 +高7位值
测试程序可以这样改:
void main()
{
        unsigned char i;
        WKTCL = 0xfe;                        //设置唤醒周期为488us*(32766+1)≈16s
        WKTCH = 0xff;
       
        while(1)
        {
                i=38;                                //16s*38=10min  注:内部低频振荡器误差较大需要修正
                while(i--)
                {
                        PCON = 0x02;        //进入掉电模式
                        _nop_();                        //掉电模式被唤醒后,直接从此语句开始向下执行,不进入中断服务程序
                        _nop_();
                }
                P10 = !P10;                        //掉电唤醒后,取反测试口       
        }
}
回复

使用道具 举报

5#
ID:283037 发表于 2018-3-2 10:30 | 只看该作者
wulin 发表于 2018-3-2 09:14
长时间休眠只有重复进入掉电模式,单次最大设置数32767,也就是32766+1,约16秒
WKTCL = 0xFE;         ...

已经调试成功,非常感谢您。
回复

使用道具 举报

6#
ID:468762 发表于 2019-1-19 21:15 来自手机 | 只看该作者
alewe 发表于 2018-3-1 21:37
感谢。我想要实现每休眠10分钟发送一次数据, 是不是只有重复进入掉电模式,有没有其它办法。

你好,能上传程序不?我想下载
回复

使用道具 举报

7#
ID:155507 发表于 2019-1-20 06:31 | 只看该作者
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. sfr WKTCL=0xAA;   //掉电唤醒定时器计时低字节
  4. sfr WKTCH=0xAB;   //掉电唤醒定时器计时高字节
  5. sfr P6=0xE8;
  6. void main()
  7. {
  8.         unsigned char i;
  9.                 //长时间休眠只有重复进入掉电模式,单次最大设置数32767,也就是32766+1,约16秒
  10.         WKTCL = 0xfe;        //设置唤醒周期为488us*(32766+1)≈16s
  11.         WKTCH = 0xff;        //使能掉电唤醒定时器  +高7位值
  12.         
  13.         while(1)
  14.         {
  15.                 i=38;      //16s*38=10min  注:内部低频振荡器误差较大需要修正
  16.                 while(i--)
  17.                 {
  18.                         PCON = 0x02;        //进入掉电模式
  19.                         _nop_();                        //掉电模式被唤醒后,直接从此语句开始向下执行,不进入中断服务程序
  20.                         _nop_();
  21.                 }
  22.                 P6=~P6;                        //掉电唤醒后,取反测试口        
  23.         }
  24. }
复制代码
回复

使用道具 举报

8#
ID:525244 发表于 2019-9-24 17:32 来自手机 | 只看该作者
wulin 发表于 2018-3-2 09:14
长时间休眠只有重复进入掉电模式,单次最大设置数32767,也就是32766+1,约16秒
WKTCL = 0xFE;         ...

掉电唤醒之后需要继续设置唤醒定时器吧
回复

使用道具 举报

9#
ID:975054 发表于 2021-10-31 18:09 | 只看该作者
感谢感谢!我也试试,正好低功耗改进
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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