cc2540吧 关注:52贴子:141
  • 11回复贴,共1

CC2540学习记录

只看楼主收藏回复

1.GPIO输出控制实验-Led闪烁_流水灯
#include <ioCC2540.h>
typedef unsigned char uchar;
typedef unsigned int uint;
#define LED1 P1_0 //定义P1.0口为LED1控制端
#define LED2 P1_1 //定义P1.1口为LED2控制端
#define LED3 P1_4 //定义P1.4口为LED3控制端
#define LED4 P0_1 //定义P0.1口为LED4控制端
/*: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
* 入口参数: msec 延时参数,值越大,延时越久*/
void DelayMS(uint msec)
{
uint i,j;
for (i=0; i<msec; i++)
for (j=0; j<535; j++);
}
void LedOnOrOff(uchar mode) /* 点亮或熄灭所有LED灯 */
{
LED1 = mode;
LED2 = mode;
LED3 = mode;
LED4 = mode;
}
void InitLed(void) /* 设置LED灯相应的IO口*/
{
P1DIR |= 0x13; //P1.0、P1.1、P1.4定义为输出
P0DIR |= 0x02; //P0.1定义为输出
LedOnOrOff(0); //使所有LED灯默认为熄灭状态
}
void main(void)
{
uchar i;
InitLed(); //设置LED灯相关IO口
while(1) //死循环
{
LED1 = !LED1; //流水灯,初始化时LED为熄灭执行后则点亮
DelayMS(200);
LED2 = !LED2;
DelayMS(200);
LED3 = !LED3;
DelayMS(200);
LED4 = !LED4;
DelayMS(200);
LedOnOrOff(0); //使所有LED灯熄灭状态
DelayMS(500);
LED4 = !LED4;
DelayMS(200);
LED3 = !LED3;
DelayMS(200);
LED2 = !LED2;
DelayMS(200);
LED1 = !LED1; //流水灯,初始化时LED为熄灭执行后则点亮
DelayMS(200);
for (i=0; i<2; i++) //所有灯闪烁2次
{
LedOnOrOff(0); //关闭所有LED灯
DelayMS(200);
LedOnOrOff(1); //打开所有LED灯
DelayMS(200);
LedOnOrOff(0); //使所有LED灯熄灭状态
DelayMS(500);
}
}
}


1楼2015-03-27 23:00回复
    按下按键S1控制LED1.LED2.LED3实现跑马灯效果
    #include <ioCC2540.h>
    typedef unsigned char uchar;
    typedef unsigned int uint;
    #define LED1 P1_0 // 定义P1.0口为LED1控制端
    #define LED2 P1_1 // 定义P1.1口为LED2控制端
    #define LED3 P1_4 // 定义P1.4口为LED3控制端
    #define KEY1 P0_1 // 定义P0.1口为S1控制端
    #define ON 1
    #define OFF 0
    /****************************************************************************
    * 名 称: DelayMS()
    * 功 能: 以毫秒为单位延时,系统时钟不配置时默认为16M(用示波器测量相当精确)
    * 入口参数: msec 延时参数,值越大,延时越久
    * 出口参数: 无
    ****************************************************************************/
    void DelayMS(uint msec)
    {
    uint i,j;
    for (i=0; i<msec; i++)
    for (j=0; j<535; j++);
    }
    /****************************************************************************
    * 名 称: LedOnOrOff()
    * 功 能: 点亮或熄灭所有LED灯
    * 入口参数: mode为1时LED灯亮 mode为0时LED灯灭
    * 出口参数: 无
    ****************************************************************************/
    void LedOnOrOff(uchar mode)
    {
    LED1 = mode;
    LED2 = mode;
    LED3 = mode;
    }
    /****************************************************************************
    * 名 称: InitLed()
    * 功 能: 设置LED相应的IO口
    * 入口参数: 无
    * 出口参数: 无
    ****************************************************************************/
    void InitLed(void)
    {
    P1DIR |= 0x13; // P1.0、P1.1、P1.4定义为输出
    LedOnOrOff(0); // 使所有LED灯默认为熄灭状态
    }
    /****************************************************************************
    * 名 称: InitKey()
    * 功 能: 设置按键相应的IO口
    * 入口参数: 无
    * 出口参数: 无
    ****************************************************************************/
    void InitKey(void)
    {
    P0SEL &= ~0x02; //设置P0.1为普通IO口
    P0DIR &= ~0x02; //按键接在P0.1口上,设P0.1为输入模式
    P0INP &= ~0x02; //打开P0.1上拉电阻
    }
    /****************************************************************************
    * 名 称: KeyScan()
    * 功 能: 读取按键状态
    * 入口参数: 无
    * 出口参数: 0为抬起 1为按键按下
    ****************************************************************************/
    uchar KeyScan(void)
    {
    if (KEY1 == 0)
    {
    DelayMS(10); //延时10MS去抖
    if (KEY1 == 0)
    {
    while(!KEY1); //松手检测
    return 1; //有按键按下
    }
    }
    return 0; //无按键按下
    }
    /****************************************************************************
    * 程序入口函数
    ****************************************************************************/
    void main(void)
    {
    InitLed(); //设置LED灯相应的IO口
    InitKey(); //设置按键S1相应的IO口
    while(1)
    {
    DelayMS(2);
    if (KeyScan()) //扫描按键当前状态,按下时执行跑马灯效果
    {
    LED1 = ON; //点亮LED1
    DelayMS(500);
    LED1 = OFF; //熄灭LED1
    LED2 = ON;
    DelayMS(500);
    LED2 = OFF;
    LED3 = ON;
    DelayMS(500);
    LED3 = OFF;
    }
    }
    }


    2楼2015-04-02 23:56
    回复
      #include <ioCC2540.h>
      typedef unsigned char uchar;
      typedef unsigned int uint;
      #define LED1 P1_0 // P1.0 口控制 LED1
      #define KEY1 P0_1 // P0.1 口控制 S1
      void DelayMS(uint msec)
      {
      uint i,j;
      for (i=0; i<msec; i++)
      for (j=0; j<535; j++);
      }
      void InitLed(void)
      {
      P1DIR |= 0x01; //P1.0 定义为输出口
      LED1 = 0; //LED1 灯灭
      }
      void InitKey()
      {
      P0IEN |= 0x2; // P0.1 设置为中断方式 1:中断使能
      PICTL |= 0x2; //下降沿触发
      IEN1 |= 0x20; //允许 P0 口中断;
      P0IFG = 0x00; //初始化中断标志位
      EA = 1; //打开总中断
      }
      #pragma vector = P0INT_VECTOR
      __interrupt void P0_ISR(void)
      {
      DelayMS(10); //延时去抖
      LED1 = ~LED1; //改变 LED1 状态
      P0IFG = 0; //清中断标志
      P0IF = 0; //清中断标志
      }
      void main(void)
      {
      InitLed(); //设置 LED 灯相应的 IO 口
      InitKey(); //设置 S1 相应的 IO 口
      while(1)
      {
      }
      }


      3楼2015-04-13 23:21
      回复
        有cc2540的一些实例程序吗?


        4楼2015-04-18 13:55
        回复


          来自Android客户端5楼2015-04-19 12:47
          回复
            uart.串口通信
            #include <ioCC2540.h>
            #include <string.h>
            typedef unsigned char uchar;
            typedef unsigned int uint;
            #define UART0_RX 1
            #define UART0_TX 2
            #define SIZE 4
            char RxBuf;
            char UartState;
            uchar count;
            char RxData[SIZE]; //存储发送字符串
            void DelayMS(uint msec)
            {
            uint i,j;
            for (i=0; i<msec; i++)
            for (j=0; j<1070; j++);
            }
            void InitUart(void)
            {
            PERCFG = 0x00; //外设控制寄存器 USART 0的IO位置:0为P0口位置1
            P0SEL = 0x0c; //P0_2,P0_3用作串口(外设功能)
            P2DIR &= ~0xC0; //P0优先作为UART0
            U0CSR |= 0x80; //设置为UART方式
            U0GCR |= 11;
            U0BAUD |= 216; //波特率设为115200
            UTX0IF = 0; //UART0 TX中断标志初始置位0
            U0CSR |= 0x40; //允许接收
            IEN0 |= 0x84; //开总中断允许接收中断
            }
            void UartSendString(char *Data, int len)
            {
            uint i;
            for(i=0; i<len; i++)
            {
            U0DBUF = *Data++;
            while(UTX0IF == 0);
            UTX0IF = 0;
            }
            }
            #pragma vector = URX0_VECTOR
            __interrupt void UART0_ISR(void)
            {
            URX0IF = 0; // 清中断标志
            RxBuf = U0DBUF;
            }
            void main(void)
            {
            CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
            while(CLKCONSTA & 0x40); //等待晶振稳定为32M
            CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
            InitUart(); //调用串口初始化函数
            UartState = UART0_RX; //串口0默认处于接收模式
            memset(RxData, 0, SIZE);
            while(1)
            {
            if(UartState == UART0_RX) //接收状态
            {
            if(RxBuf != 0)
            {
            if((RxBuf != '#')&&(count < 4))//以'#'为结束符,一次最多接收50个字符
            RxData[count++] = RxBuf;
            else
            {
            if(count >= 4) //判断数据合法性,防止溢出
            {
            count = 0; //计数清0
            memset(RxData, 0, SIZE);//清空接收缓冲区
            }
            else
            UartState = UART0_TX; //进入发送状态
            }
            RxBuf = 0;
            }
            }
            if(UartState == UART0_TX) //发送状态
            {
            U0CSR &= ~0x40; //禁止接收
            UartSendString(RxData, count); //发送已记录的字符串。
            U0CSR |= 0x40; //允许接收
            UartState = UART0_RX; //恢复到接收状态
            count = 0; //计数清0
            memset(RxData, 0, SIZE); //清空接收缓冲区
            }
            }
            }


            6楼2015-04-19 17:26
            回复
              大神,有没有传感器接入的示例程序?求共享


              IP属地:浙江7楼2015-04-23 18:44
              回复
                #ifndef _UART_H_
                #define _UART_H_
                extern void Uart_Init(void);
                extern void Uart_Print(char *p, int len);
                #endif
                #include<ioCC2540.h>
                //#include "uart.h"
                void Uart_Init(void)
                {
                CLKCONCMD&=~(1<<6); //外设控制寄存器 USART 0的IO位置:0为P0口位置1
                while(CLKCONSTA&(1<<6));
                CLKCONCMD&~((1<<6)|(7<<0));
                PERCFG=0x00;
                P0SEL|=(0xf<<2); //P0_2,P0_3用作串口(外设功能)]
                P2DIR&=~(3<<6); //P0优先作为UART0
                U0CSR|=1<<7; //设置为UART方式
                U0GCR|=11;
                U0BAUD|=216; //波特率设为115200
                UTX0IF|=0; //UART0 TX中断标志初始置位0
                U0CSR|=1<<6; //允许接收
                }
                void Uart_Print(char *p,int len)
                {
                unsigned int i;
                for(i=0;i<len;i++)
                {
                U0DBUF=*p++;
                }
                while(!UTX0IF);
                U0DBUF=0x0A;
                while(!UTX0IF);
                UTX0IF=0;
                }
                #include"uart.h"
                void main(void)
                {
                Uart_Init();
                while(1)
                {
                Uart_Print("uart_test",9);
                }
                }


                IP属地:广东8楼2015-05-14 00:04
                回复






                  9楼2015-05-18 22:40
                  回复
                    我想用定时器1 输出PWM对四路电机调速 有类似程序吗 谢啦


                    来自iPhone客户端10楼2015-07-11 23:12
                    回复
                      看门狗
                      #include <ioCC2540.h>
                      typedef unsigned char uchar;
                      typedef unsigned int uint;
                      #define LED1 P1_0 // P1.0口控制LED1
                      #define LED2 P1_1 // P1.1口控制LED2
                      void DelayMS(uint msec)
                      {
                      uint i,j;
                      for (i=0; i<msec; i++)
                      for (j=0; j<535; j++);
                      }
                      void InitLed(void)
                      {
                      P1DIR |= 0x03; //P1.0、P1.1定义为输出
                      LED1 = 0; //默认LED灯为熄灭状态
                      LED2 = 0;
                      }
                      void Init_Watchdog(void)
                      {
                      WDCTL = 0x00; //打开IDLE才能设置看门狗
                      WDCTL |= 0x08; //定时器间隔选择,间隔一秒
                      }
                      void FeetDog(void)
                      {
                      WDCTL = 0xa0; //清除定时器。当0xA跟随0x5写到这些位,定时器被清除
                      WDCTL = 0x50;
                      LED2 = 1; //系统不复位LED2灯长亮
                      }
                      void main(void)
                      {
                      InitLed();//调用初始化函数
                      LED1=1;
                      LED2=1;
                      DelayMS(300);
                      LED1=0;
                      LED2=0;
                      DelayMS(300);
                      LED1=1;
                      LED2=1;
                      DelayMS(300);
                      LED1=0;
                      LED2=0;
                      DelayMS(300);
                      LED1=1;
                      LED2=1;
                      DelayMS(300);
                      Init_Watchdog();
                      while(1)
                      {
                      LED1 = ~LED1; //仅指示作用。
                      DelayMS(300);
                      //FeetDog(); //喂狗系统将不再主动复位,LED1灯不闪烁,LED2长亮
                      //注释FeetDog函数时系统不断复位,LED1灯闪烁
                      }
                      }


                      IP属地:广东11楼2015-09-20 20:14
                      回复
                        继电器做开关
                        #include<ioCC2540.h>
                        typedef unsigned char uchar;
                        typedef unsigned int uint;
                        #define JDQ_PIN P1_3
                        void DelayMS(uint msec)
                        {
                        uint i,j;
                        for(i=0; i<msec; i++)
                        for(j=0; j<535; j++);
                        }
                        void main(void)
                        {
                        P1DIR |= 0x08; //P1.3定义为输出口
                        while(1) //死循环,继电器间隔3秒开关一次
                        {
                        JDQ_PIN = 0; //继电器断开
                        DelayMS(3000);
                        JDQ_PIN = 1; //继电器吸合
                        DelayMS(3000);
                        }
                        }


                        IP属地:广东12楼2015-09-20 22:03
                        回复