Zigbee自学第四天

Zigbee自学

记录学习过程中的一些想法,硬件设备和学习资料均来自安联德(淘宝)



一、系统睡眠

1.中断睡眠

在这里插入图片描述

void SysPowerMode(uchar mode) 
{ 
    if(mode > 0 && mode < 4) 
    {  
        SLEEPCMD |= mode;    //设置系统睡眠模式 
        PCON = 0x01;         //进入睡眠模式 ,通过中断唤醒
    } 
    else 
        PCON = 0x00;         //主动/空闲模   通过中断唤醒系统 
}
  • 设置系统工作模式,通过设置SLEEPCMD和PCON。
    在这里插入图片描述
  • 中断函数
#pragma vector = P0INT_VECTOR 
__interrupt void P0_ISR(void) 
{ 
    if(P0IFG > 0) 
    { 
        P0IFG = 0;           //清标志位
    } 
    
    P0IF = 0; 
    SysPowerMode(4);         //正常工作模式
} 

2.定时器唤醒

  • 睡眠定时器是一个24 位的定时器,运行在一个32kHz 的时钟频率(可以是RCOSC 或XOSC)上。定时器在复位之后立即启动,如果没有中断就继续运行。定时器的当前值可以从SFR 寄存器ST2:ST1:ST0 中读取。
  • ST 中断的中断使能位是IEN0.STIE,中断标志是IRCON.STIF
  1. 设置睡眠模式
    与中断睡眠模式设置相同
void SysPowerMode(uchar mode) 
{ 
    if(mode < 4) 
    {  
        SLEEPCMD |= mode;    //设置系统睡眠模式 
        PCON = 0x01;         //进入睡眠模式 ,通过中断唤醒
    } 
    else 
        PCON = 0x00;         //通过中断唤醒系统 
}
  1. 设置中断处理函数
#pragma vector = ST_VECTOR 
__interrupt void ST_ISR(void) 
{ 
    STIF = 0;          //清标志位
    SysPowerMode(4);   //进入正常工作模式
} 
  1. 设置睡眠定时器

在这里插入图片描述

  • 初始化STX寄存器及中断使能
void InitSleepTimer(void) 
{ 
    ST2 = 0x00; 
    ST1 = 0x00; 
    ST0 = 0x00; 
    EA = 1;     //开中断 
    STIE = 1;   //睡眠定时器中断使能 0: 中断禁止     1: 中断使能
    STIF = 0;   //睡眠定时器中断标志 0: 无中断未决   1: 中断未决
}
  • 定时函数,设置睡眠时间
    晶振时钟频率为32.768 kHz,也是2的15次方,多以每1秒会跳动32768次。
void Set_ST_Period(uint sec) 
{ 
    ulong sleepTimer = 0; 
    
    sleepTimer |= ST0; 
    sleepTimer |= (ulong)ST1 <<  8; 
    sleepTimer |= (ulong)ST2 << 16; 
    sleepTimer += ((ulong)sec * (ulong)32768); 
    ST2 = (uchar)(sleepTimer >> 16); 
    ST1 = (uchar)(sleepTimer >> 8); 
    ST0 = (uchar) sleepTimer; 
}
  1. 主函数
void main(void)
{   
    uchar i=0;  
      
    InitLed();		         //设置LED灯相应的IO口     
    InitSleepTimer();        //初始化休眠定时器
    
    while(1)
    {
        for (i=0; i<6; i++)  //LED1闪烁3次提醒用户将进入睡眠模式
        {
            LED1 = ~LED1;
            DelayMS(500);
        }

        Set_ST_Period(5);   //设置睡眠时间,睡眠5秒后唤醒系统
        SysPowerMode(2);    //重新进入睡眠模式PM2
    }
}

二.看门狗

在这里插入图片描述

1.看门狗程序初始化

void Init_Watchdog(void) 
{ 
    WDCTL = 0x00;       //打开IDLE才能设置看门狗,设置定时间隔
    WDCTL |= 0x08;      //打开看门狗
}

2.喂狗程序,清空定时器

void FeetDog(void) 
{ 
    WDCTL = 0xa0;       //清除定时器。当0xA跟随0x5写到这些位,定时器被清除
    WDCTL = 0x50; 
}

在这里插入图片描述


总结

终于将单片机的部分基础知识学完了,下一步要进行组网了!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值