cc2530 串口实验--控制led灯


/************************
* project : PC机向cc2530发送指令,控制led的亮灭
            指令格式为“xy#”,其中x可以是B或Y,
            代表着蓝灯或黄灯。y可以是0或1,0代表
            关灯,1代表亮灯
*    时间 :2014年1月10
*    作者 :林少游
************************/
#include <ioCC2530.h>
#include <string.h>

#define YLED P1_0
#define BLED P1_1

#define LIGHTOPEN 1
#define LIGHTCLOSE 0

#define uint unsigned int 
#define uchar unsigned char

char ReceiveData[3];  //接收到的数据
int DataNumber=0;     //接收到的数据的长度
char temp;            //接收到的临时字符

void Delay(uint n);
void Led_Init();
void Usart0_Init();
void Usart0_Send_String(char *Data,int len);
void Usart0_Receive_String();
void Led_Contral(char *Data,int len);

/************************
* @brief : LED初始化函数
************************/
void Delay(uint n)
{
  uint i;
  for(i=0;i<n;i++);
  for(i=0;i<n;i++);
  for(i=0;i<n;i++);
  for(i=0;i<n;i++);
  for(i=0;i<n;i++);
}


/************************
* @brief : LED初始化函数
************************/
void Led_Init()
{
  P1DIR |= 0X03;    //P1.0,P1.1设置为输出
  YLED = LIGHTCLOSE;//黄灯灭
  BLED = LIGHTCLOSE;//蓝灯灭
}

/************************
* @brief : 串口初始化函数
************************/
void Usart0_Init()
{
  CLKCONCMD &= ~0X40;     //系统时钟源选择32MHz
  while(CLKCONSTA&0X40);  //等待晶振稳定
  CLKCONCMD &= ~0X47;     //时钟速度设置为32MHz
  
  PERCFG = 0X00;          //P0设置为外设
  P0SEL |= 0X3C;          //P1.2,P1.3,P1.4,P1.5设置为串口引脚映射
  P2DIR |= 0XC0;          //P0中的USART0的优先级最高
  
  U0CSR |= 0X80;          //选择UART模式
  U0GCR |= 9;
  U0BAUD|= 59;            //波特率选择为19200
  
  U0CSR |= 0X40;          //USART允许接收
  IEN0 |= 0X84;           //打开总中断开关和串口接收中断使能
  URX0IF = 0;             //串口接收中断标志位清零
  UTX0IF = 0;             //串口发送中断标志位清零
}

/************************
* @brief : Led灯控制函数
************************/
void Led_Contral(char *Data,int len)
{
  if(len == 3 && Data[0] != '#' && Data[1] != '#' && Data[2] == '#')
  {
    switch(Data[0])
    {
    case 'B':
    case 'b':
      BLED = (Data[1] == '1');
      Usart0_Send_String("蓝色灯被控制\n",sizeof("蓝色灯被控制\n"));
      break;
    case 'Y':
    case 'y':
      YLED = (Data[1] == '1');
      Usart0_Send_String("黄色灯被控制\n",sizeof("黄色灯被控制\n"));
      break;
    default:
      Usart0_Send_String("指令输入有误请重新输入\n",sizeof("指令输入有误请重新输入\n"));
    }
  }
  else
    Usart0_Send_String("指令输入有误,请重新输入\n",sizeof("指令输入有误,请重新输入\n"));
}

/*************************
* @brief : 串口发送函数
*  param :Data - 要发送的数据
           len - 要发送的数据的长度
*************************/
void Usart0_Send_String(char *Data,int len)
{
  uint i;
  for(i = 0; i < len; i++  )
  {
    U0DBUF = *Data++;     //将数据字符一个一个的填充到U0DBUF中(8个位)
    while(UTX0IF == 0);   //等待数据发送完毕
    UTX0IF = 0;           //串口发送中断标志位清零
  }
}

/*************************
* @brief : 串口数据接收
*************************/
void Usart0_Receive_String()
{
  if(temp != 0)       //接收到数据
    {
      if(temp != '#')
      {
        ReceiveData[DataNumber++] = temp;
      }
      else
      {
        ReceiveData[DataNumber++] = temp;
        Led_Contral(ReceiveData,DataNumber); //Led灯控制
        DataNumber = 0;//重新计数
      }
      if(DataNumber == 3)
      {
        Led_Contral(ReceiveData,DataNumber); //Led灯控制    
        DataNumber = 0;//重新计数
      }
      temp = 0;          
    }
}

/*************************
* @brief : 主函数
*************************/
main()
{
  Led_Init();
  Usart0_Init();
  while(1);
}

/*************************
* @brief : 中断服务程序--串口数据接收
*************************/
#pragma vector = URX0_VECTOR
__interrupt void URX0_ISR(void)
{
  URX0IF = 0;       //串口接收中断清零,准备下一次的数据接收
  temp = U0DBUF;    //将缓冲器中的数据保存到temp中
  Usart0_Receive_String();//接收并保存数据
  
}


  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要通过串口控制 LED ,您需要使用 CC2530 芯片来实现串口通信和 LED 控制。以下是基本的步骤: 1. 确保您已经连接了 CC2530 芯片和 LED 。 2. 创建一个新的工程,包括 CC2530 芯片和串口通信库。 3. 编写代码,实现串口通信和 LED 控制。您可以使用串口库来读取和发送数据。然后,根据收到的数据,您可以控制 LED 的状态。 4. 编译并上传代码到 CC2530 芯片上。 这里有一些示例代码,可以帮助您开始: ```c #include <ioCC2530.h> // 定义串口的波特率 #define BAUD_9600 0x0028 // 初始化串口 void uart_init() { PERCFG &= ~0x01; // 设置UART0在P0上 P0SEL |= 0x0C; // P0.2和P0.3设为外设 U0CSR |= 0x80; // UART模式 U0GCR |= 11; // 9600波特率 U0BAUD = BAUD_9600; U0CSR |= 0x40; // 允许接收 } // 发送一个字符到串口 void uart_send_char(char c) { while (!(U0CSR & 0x20)); // 等待发送缓冲区为空 U0DBUF = c; } // 发送一个字符串到串口 void uart_send_string(char* str) { while (*str != '\0') { uart_send_char(*str); str++; } } // 控制LED void control_led(int on) { if (on) { P1_0 = 1; } else { P1_0 = 0; } } void main() { uart_init(); while (1) { if (U0CSR & 0x01) { // 如果收到数据 char c = U0DBUF; if (c == '1') { // 打开LED control_led(1); uart_send_string("LED on!\r\n"); } else if (c == '0') { // 关闭LED control_led(0); uart_send_string("LED off!\r\n"); } } } } ``` 此代码将等待来自串口的数据。如果收到字符“1”,则打开 LED ,如果收到字符“0”,则关闭 LED 。它还会向串口发送消息以确认 LED 的状态。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值