ZIGBEE 电源控制之中断唤醒

/*
   此程序很简单,主要用到的是外部中断和电源管理
实验目的:通过按键触发外部中断,使单片机跳出休眠状态,LED 闪烁5
        主讲   王加辉
*/
#include
#define LED1 P1_0/* 定义端口*/
#define LED2 P1_1
void init_led()/* 此函数初始化LED */
{
  P1SEL&=~0X03;/*P1SEL P1 功能选择寄存器,主要用来设置P1I/O 各个端口为普通I/O 口或者是作为外设功能接口。
                 在这里我们只要P1_0 P1_1 口为普通的I/O 口即可*/
  P1DIR|=0X03;/*P1DIR P1 放向寄存器,主要功能是设置P1 各个口为输入口还是输出口,
                 LED 为输出设备,所以此处我们需要P1_0 P1_1 口为输出口*/
  P1INP&=~0X03;/*P1INP P1 输入模式寄存器,主要是设置P1 各个口的上拉是开还是关,此处无所谓开还是关*/
                /* 因为P1SEL P1INP 在复位后默认为0 ,所以我们可以不用配置,只要配置P1DIR 寄存器即可*/
  LED1=LED2=1;/* 关闭所有LED */
}
void init_interrupt()/* 外部中断初始化函数*/
{
  P0IEN|=0X10;/*P0 口中断掩码寄存器,主要是用来设置P0 口各个端口中断的开关,
                 因为我们这里用的键盘连的是P0.4 ,所以我们要开P0.4 的中断*/
  PICTL|=0X01;/*PICTL P 口中断控制寄存器,其主要功能请各位自己查看cc2530 数据手册,
                这里我们主要设置P0 口的中断触发方式为下降沿触发*/
  P0IE=1;/*P0IE IEN1 寄存器的第6 位,是用来设置P0 口的中断使能,即设置P0 口的中断开关*/
  P0IFG=0X00;/*P0 口各个端口的中断标志寄存器,中断发生是相应位会自动置一,中断发生后需要软件手动清零*/
  EA=1;   /* 开总中断*/
}
void delay_ms(int ti)/* 延时函数*/
{
  int i,j;
  for(i=0;i<ti;i++)< div="" style="word-wrap: break-word;">
    for(j=0;j<524;j++);
}
void sleep_select(int temp)/* 电源管理函数,我们这里比较简单,只设置了PM3*/
{
  if(temp<4)/* 根据temp 的值来改变供电模式*/
   {
     SLEEPCMD|=temp;/* 设置供电模式*/
     delay_ms(10);/* 延迟等待至少3ms*/
     PCON=0X01;/* 强行进入所选的电源模式*/
   }
  else
     PCON=0x00;/* 回到主动模式,即唤醒单片机*/
}
void main()
{
  int x=0;
  init_led();/* 初始化LED*/
  init_interrupt();/* 初始化外部中断*/
  while(1)
   {
       for(x=0;x<10;x++)/*LED 灯闪烁5 */
    {
      LED2=LED1=~LED1;
      delay_ms(200);
    }
     sleep_select(3);/* 进入电源管理函数,设置电源方式为PM3*/
   }
}
#pragma vector=P0INT_VECTOR/* 中断源*/
__interrupt void P0_ISR(void)/* 中断子程序*/
{
  sleep_select(4);/* 进入电源管理函数,唤醒单片机*/
  P0IFG=0;/* 清中断标志位*/
  P0IF=0;/* 清中断标志位,P0IF P0IFG 中有,在IRCON 中也有,大家可以查看手册*/
}
/* 因为电源管理的资料我也没有word 文档,字比较多,不好打出来,
详细请大家参考cc2530 数据手册里的53 页:电源管理简介,里面讲的很详细*/
/* 祝大家学的愉快*/
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值