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。
- 设置睡眠模式
与中断睡眠模式设置相同
void SysPowerMode(uchar mode)
{
if(mode < 4)
{
SLEEPCMD |= mode; //设置系统睡眠模式
PCON = 0x01; //进入睡眠模式 ,通过中断唤醒
}
else
PCON = 0x00; //通过中断唤醒系统
}
- 设置中断处理函数
#pragma vector = ST_VECTOR
__interrupt void ST_ISR(void)
{
STIF = 0; //清标志位
SysPowerMode(4); //进入正常工作模式
}
- 设置睡眠定时器
- 初始化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;
}
- 主函数
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;
}
总结
终于将单片机的部分基础知识学完了,下一步要进行组网了!