ZigBee-CC2530单片机 - 低功耗运行

发布者:Jinghua6666最新更新时间:2022-10-09 来源: csdn关键字:ZigBee  CC2530  单片机 手机看文章 扫描二维码
随时随地手机看文章

程序源码

#include "ioCC2530.h"

#define LED1 P1_0     // P1_0定义为P1_0

#define LED2 P1_1     // P1_0定义为P1_1

#define SW1  P1_2     //SW1端口宏定义


enum SYSCLK_SRC

{

    RC_16MHz,XOSC_32MHz

};


enum POWERMODE

{

    PM_IDLE,PM_1,PM_2,PM_3

};


/**************************************************************

函数名称:delay

功    能:软件延时

入口参数:time--延时循环执行次数

出口参数:无

返 回 值:无

**************************************************************/

void delay(unsigned int time)

{

    unsigned int i;

    unsigned char j;

    for(i = 0;i < time;i++)

        for(j = 0;j < 240;j++)

        {

            asm("NOP");//asm用来在C代码中嵌入汇编语言操作,汇

            asm("NOP");//编命令nop是空操作,消耗1个指令周期

            asm("NOP");

        }

}


/**************************************************************

函数名称:BlankLed

功    能:闪烁LED灯

入口参数:led--要进行闪烁的LED灯,取值1~4

出口参数:无

返 回 值:无

**************************************************************/

void BlankLed(unsigned char led)

{

    unsigned char i;

    switch(led)

    {

      case 1:

        for(i=0;i<=5;i++)

        {

            LED1 = 1;

            delay(500);

            LED1 = 0;

            delay(500);

        }

        break;

      case 2:

        for(i=0;i<=5;i++)

        {

            LED2 = 1;

            delay(500);

            LED2 = 0;

            delay(500);

        }

        break;

    }

}


/**************************************************************

函数名称:SystemClockSourceSelect

功能:选择系统时钟源(主时钟源)

入口参数:source

          XOSC_32MHz  32MHz晶体振荡器

          RC_16MHz    16MHz RC振荡器

出口参数:无

返回值:无

**************************************************************/

void SystemClockSourceSelect(enum SYSCLK_SRC source)

{

   unsigned char clkconcmd,clkconsta;

   if(source == RC_16MHz)

  {             

    CLKCONCMD &= 0x80;

    CLKCONCMD |= 0x49;       

  }

  else if(source == XOSC_32MHz)

  {

    CLKCONCMD &= 0x80;

  }  

    /* 等待所选择的系统时钟源(主时钟源)稳定 */

  clkconcmd = CLKCONCMD;    // 读取时钟控制寄存器CLKCONCMD

  do

  {

    clkconsta = CLKCONSTA;    // 读取时钟状态寄存器CLKCONSTA

  } while(clkconsta != clkconcmd); // 直到选择的系统时钟源(主时钟源)已经稳定 

}


/**************************************************************

函数名称:SetPowerMode

功能:设置功耗模式

入口参数:pm

          PM_IDLE  空闲模式

          PM_1     功耗模式PM1

          PM_2     功耗模式PM2

          PM_3     功耗模式PM3

出口参数:无

返回值:无

**************************************************************/

void SetPowerMode(enum POWERMODE pm)

{

  /* 空闲模式 */

  if(pm == PM_IDLE)

  {

    SLEEPCMD &= ~0x03;

  }

  /* 功耗模式PM3*/

  else if(pm == PM_3)

  {

    SLEEPCMD |= ~0x03;

  }

  /* 其他功耗模式,即功耗模式PM1或PM2*/

  else

  {

    SLEEPCMD &= ~0x03;

    SLEEPCMD |= pm;

  }

  /* 进入所选择的功耗模式 */

  PCON |= 0x01;                            

  asm("NOP");    

}


/**************************************************************

函数名称:SetSleepTime

功能:设置睡眠时间,即设置睡眠定时器的比较值。

入口参数:sec   唤醒功耗模式IDLE,PM1或PM2的时间。

出口参数:无

返回值:无

**************************************************************/

void SetSleepTime(unsigned short sec)

{

  unsigned long sleeptime = 0;

    /* 读取睡眠定时器的当前计数值 */

  sleeptime |= ST0;

  sleeptime |= (unsigned long)ST1 <<  8;

  sleeptime |= (unsigned long)ST2 << 16;

    /* 根据指定的睡眠时间计算出应设置的比较值 */

  sleeptime += ((unsigned long)sec * (unsigned long)32753);

    /* 设置比较值 */

  while((STLOAD & 0x01) == 0);  // 等待允许加载新的比较值

  ST2 = (unsigned char)(sleeptime >> 16);

  ST1 = (unsigned char)(sleeptime >> 8);

  ST0 = (unsigned char) sleeptime;  

 }


/**************************************************************

函数名称:initIO

功能:初始化系统IO

入口参数:无

出口参数:无

返回值:无

**************************************************************/

void initIO()

{    

     P1SEL &= ~0x1F;     // 设置LED、SW1为普通IO口

     P1DIR |= 0x03 ;     // 设置LED为输出

     P1DIR &= ~0X04; //Sw1按键在 P1.2,设定为输入

     LED1 = 0;           //灭 LED

     LED2 = 0;           //灭 LED

     PICTL &= ~0x02;     //配置P1口的中断边沿为上升沿产生中断

     

     P1IFG &= ~0x04;     // 清除P1.2中断标志

     P1IF =0;            // 清除P1口中断标志

}


/**************************************************************

函数名称:ST_ISR

功能:睡眠定时器中断服务函数

入口参数:无

出口参数:无

返回值:无

**************************************************************/

#pragma vector=ST_VECTOR

__interrupt void ST_ISR(void)

{

    EA=0;          //关全局中断

    STIF=0;     //睡眠定时器中断标志清0

    STIE=0;    // 禁止睡眠定时器中断

    EA = 1;          // 使能全局中断


/**************************************************************

函数名称:main

功能:程序主函数

入口参数:无

出口参数:无

返回值:无

**************************************************************/

void main(void)

{

    SystemClockSourceSelect(XOSC_32MHz);  // 选择32MHz晶体振荡器作为系统时钟源(主时钟源)

    initIO();  //初始化IO 

    /* 使能全局中断 */

    EA = 1;

    while(1)

    {

        /* 功耗模式:主动模式 */

        LED1=0;  //LED1灯灭

        LED2=0;  //LED2灯灭

        

        /* 功耗模式:空闲模式 */

        BlankLed(1);            //LED1闪烁5次

        SetSleepTime(2);        // 设置睡眠时间为2秒

        IRCON &= ~0x80;         // 清除睡眠定时器中断标志

        IEN0 |= (0x01 << 5);    // 使能睡眠定时器中断

        SetPowerMode(PM_IDLE);  // 进入空闲模式

        

        /* 功耗模式:主动模式 */

        BlankLed(2);            //LED2闪烁5次        

        /* 功耗模式:PM1 */

        SetSleepTime(3);        // 设置睡眠时间为3秒

        IRCON &= ~0x80;         // 清除睡眠定时器中断标志

        IEN0 |= (0x01 << 5);    // 使能睡眠定时器中断

        SetPowerMode(PM_1);     // 进入功耗模式PM1

        

        /* 功耗模式:主动模式 */

        BlankLed(1);            //LED1闪烁5次

        /* 功耗模式:PM2 */

        SetSleepTime(4);        // 设置睡眠时间为4秒

        IRCON &= ~0x80;         // 清除睡眠定时器中断标志

        IEN0 |= (0x01 << 5);    // 使能睡眠定时器中断 

        SetPowerMode(PM_2);     // 进入功耗模式PM2 

        

        /* 功耗模式:主动模式 */

        BlankLed(2);            //LED2闪烁5次    

        /* 功耗模式:PM3 */    

        P1IEN |=0x04;           //使能P1.2中断

        IEN2 |= 0x10;           //使能P1口中断

        SetPowerMode(PM_3);     // 进入功耗模式PM3   

    } 

}



/**************************************************************

函数名称:EINT_ISR

功能:外部中断服务函数

入口参数:无

出口参数:无

返回值:无

**************************************************************/

#pragma vector=P1INT_VECTOR

__interrupt void EINT_ISR(void)

{

    EA = 0;           // 关闭全局中断

   /* 若是P1.2产生的中断 */

    if(P1IFG & 0x04)

    { 

        /* 等待用户释放按键,并消抖 */

       while(SW1 == 0);    //低电平有效

       delay(100);

       while(SW1 == 0);  

       

       P1IFG &= ~0x04;   // 清除P1.2中断标志

       P1IF =0;  // 清除P1口中断标志

       

       P1IEN &= ~ 0x04;  //禁止P1.2中断

       IEN2 &= ~ 0x10;  //禁止P1口中断  

    }

    EA = 1;          // 使能全局中断  

}


关键字:ZigBee  CC2530  单片机 引用地址:ZigBee-CC2530单片机 - 低功耗运行

上一篇:ZigBee-CC2530单片机 - 按键控制跑马灯的启停
下一篇:ZigBee-CC2530单片机 - DMA方式复制数据

推荐阅读最新更新时间:2024-11-11 14:22

平凡单片机教学 第十六讲 定时/计数器的方式控制字
从上一节我们已经得知,单片机中的定时/计数器都可以有多种用途,那么我怎样才能让它们工作于我所需要的用途呢?这就要通过定时/计数器的方式控制字来设置。 在单片机中有两个特殊功能寄存器与定时/计数有关,这就是TMOD和TCON。顺便说一下,TMOD和TCON是名称,我们在写程序时就可以直接用这个名称来指定它们,当然也可以直接用它们的地址89H和88H来指定它们(其实用名称也就是直接用地址,汇编软件帮你翻译一下而已)。 从图1中我们可以看出,TMOD被分成两部份,每部份4位。分别用于控制T1和T0,至于这里面是什么意思,我们下面介绍。 从图2中我们可以看出,TCON也被分成两部份,高4位用于定时/计数器,低4位则用于中断(我们
[单片机]
平凡<font color='red'>单片机</font>教学 第十六讲 定时/计数器的方式控制字
Maxim 全新Arm Cortex-M4F微控制器可有效提高设备正常运行时间
Maxim Integrated Products, Inc (NASDAQ: MXIM)宣布推出MAX32670低功耗Arm® Cortex®-M4微控制器(MCU),器件带有浮点运算单元,在有效降低功耗、缩小尺寸的同时,提高系统可靠性,理想用于工业、健康和及物联网(IoT)。器件通过误码校正(ECC)保护所有嵌入式存储器,包括闪存和SRAM,提供可靠性最高的MCU。 在许多工业和IoT应用中,高能量微粒或其他恶劣条件会破坏正常工作时的存储器,造成其位翻转(特别是当半导体工艺降至40nm,甚至更低的情况下)。从而中断MCU工作,并产生错误甚至危险的结果。为防止此类灾难性后果的发生,MAX32670利用ECC保护其整个存
[嵌入式]
Maxim 全新Arm Cortex-M4F<font color='red'>微控制器</font>可有效提高设备正常<font color='red'>运行</font>时间
基于PIC16F877单片机的多功能电子时钟
一、功能实现 本设计主要实现实时时钟显示,时间可调;实时温度显示,并具有超限报警功能,输出显示采用LCD1602。 二、仿真图 基于proteus的仿真 三、主程序 #include lian_pic.h #include DHT11.h #include ds1302.h #include key.h #include lcd12864.h #include control.h __CONFIG(HS&WDTDIS&LVPDIS&PWRTEN); //HS振荡,禁止看门狗,低压编程关闭,启动延时定时器 void Basic_Io_Init(void) { ADCON1=0x06; //PORTA,PORTE
[单片机]
基于PIC16F877<font color='red'>单片机</font>的多功能电子时钟
用51单片机设计的自动供水系统
  图1是水塔水位控制原理图。图中虚线表示允许水位变化的上下限。在正常情况下,应保持水位在虚线范围之内。为此,在水塔的不同高度安装固定不动的三根金属棒,以感知水位变化情况。其中A棒处于下限水位以下,C棒处于上限水位,B棒在下限水位处oA棒接+5V电源,B棒、C棒各通过一个电阻与模拟地相连。      水塔由电机带动水泵供水,单片机控制电机转动以达到对水位控制的目的。供水时,水位上升,当达到上限时,由于水的导电作用.B棒、C棒连通.+5V电源,因此,b、c两端均为高电平“1”状态。这时,应停止电机和水泵的工作,不再给水塔供水。      当水位降到下限时,B棒、C棒都不能与A棒导通,因此,b、c两端均为“0”状态。这时,应启动电机,
[单片机]
用51<font color='red'>单片机</font>设计的自动供水系统
如何用C51实现单片机和PLC之间通讯的实例
1、 HMI(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。 它有字母、汉字、图形和图片等不同的显示,界面简单友好。配有长寿命的薄膜按钮键盘,操作简单。它一般采用具有集成度高、速度快、高可靠且价格低等优点的单片机 作为其核心控制器,以实现实时快速处理。PLC和单片机结合不仅可以提PLC的数据处理能力,还可以给用户带来友好简洁的界面。本文以Modbus通讯协议为例,详细讨论了一个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。 2、Modbus通讯协议 Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信。 Mo
[单片机]
如何用C51实现<font color='red'>单片机</font>和PLC之间通讯的实例
单片机学习之一:单片机概述
在学习单片机之前,我们先把一些相关的简单概念给大家作一个入门性的介绍帮助同学们建立一个初步的概念。 一、什么是单片机 单片机(MCU-Micro Controller Unit),它是把组成微型计算机的各个功能部件:中央处理器(CPU)、随机存取存储器(RAM)、只读存储器(ROM或者EPROM)、I/O接口电路、定时器和计数器以及串行通讯接口等部件制作在一块集成的芯片中,构成一个完整的微型计算机。 CPU可以分为运算器,控制器和寄存器3个部分,其是单片机的核心。 存储器可以分为两类,ROM和RAM。RAM可以被CPU随机读写,断电后存储的内容消失;ROM中的数据只能被读取,一般用于存放固定的程序。
[单片机]
工程师STM32单片机学习基础手记(4):用PWM实现荧火虫灯(一)
  用PWM的方法实现荧火虫灯   上次提到要用Timer的PWM功能来实现荧火虫灯。当然还是找一个现成的例子来作个修改,这回要用到的例子在这里。      复制一份到自己练习用的文件夹中,建立工程。      先阅读readme.txt及源程序,了解一些基本信息。   从程序中可以知道:   (1) 使用TIM3   (2) 定时器的时钟频率是36MHz.   (3) PWM信号的频率是36KHz,这是通过TIM3的ARR来设置的。ARR的值是999,因此PWM的频率是36MHz/(999+1)=36KHz。   (4) 四个通道的占空比分别由TIM3_CCR1~TIM3_CCR4来确定,算式是:
[模拟电子]
工程师STM32<font color='red'>单片机</font>学习基础手记(4):用PWM实现荧火虫灯(一)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved