ZigBee入门-CC2530-实验(五)-串口通信控制LED代码

:在我们学习任何一款单片机的时候,串口外设毫无疑问是我们验证实验,理解配置,学习单片机的最直观体现。
:在我们开发实战中,通过串口通信给下位机发送命令,然后去执行命令这是很常见的操作。

/*****************************************************************
*实验说明:
*CC2530向上位机PC发送一个字符串,串口助手中显示;
*上位机PC向CC2530通过串口助手发送一个数据命令;
*然后CC2530先接收,然后判断并执行相应的命令;
*****************************************************************/

#include <ioCC2530.h>

#define uint unsigned int
#define uchar unsigned char

#define LED1 P1_0       //定义P1_0为LED1的控制引脚
#define LED2 P1_1       //定义P1_1为LED2的控制引脚

void Init_LED();        //声明LED初始化函数
void Init_Uart0();      //声明串口0初始化函数
void Init_Cfg_32M();    //声明初始化32M时钟初始化函数
void UR0SendByte(unsigned char Byte);//声明发送一个字节初始化函数
void UR0SendString(unsigned char *str);//声明发送字符串初始化函数
void Execute_CMD();     //声明执行上位机命令初始化函数 

char RxBuf;             //定义接收缓冲区
char Rx_flag;           //定义串口接收标志位
/*====================主函数入口====================*/
void main()
{
  Init_LED();           //初始化LED端口
  Init_Uart0();         //初始化串口0
  Init_Cfg_32M();       //初始化32M晶振
  
  UR0SendString(" Hello ZigBee!\r\n");
  
  while(1)
  {
    if(Rx_flag == 1)    //是否接收到上位机指令
    {
      Execute_CMD();    //判断并执行上位机指令
    }
  }
}
/*===================LED初始化函数==================*/
void Init_LED()
{
  P1SEL &= ~0x03;       //将P1_0和P1_1设置为通用I/O端口功能
  P1DIR |= 0x03;        //将P1_0和P1_1的端口设置为输出
  LED1 = 0;             //关闭LED1灯
  LED2 = 0;             //关闭LED2灯
}
/*==================32M晶振初始化函数===============*/
void Init_Cfg_32M()
{
  CLKCONCMD &= ~0x40;       //系统时钟源选择:外部32MHz 。
  while(!(SLEEPSTA & 0x40));//等待晶振稳定
  CLKCONCMD &= ~0x47;       //128分频 CLKSPD不发分频
  SLEEPCMD |= 0x04;         //关闭不用的RC振荡器
}
/*==================串口0初始化函数=================*/
void Init_Uart0()
{
  PERCFG = 0X00;      //外设控制寄存器USART 0 的IO位置:
  P0SEL  = 0X0C;      //设置P0_2,P_3为外设功能
  P2DIR &=~0XC0;      //设置P0口优先为UART0,即串口0优先级最高
  
  U0CSR |= 0XC0;      //设置为UART模式
  
  U0GCR |= 10;        //查表
  U0BAUD|= 216;       //设置波特率为57600
  
  U0UCR |= 0x80;      //无流控,8位数据位,清空缓冲区
  
  UTX0IF = 0;         //串口0TX发送中断标志位清0
  URX0IF = 0;         //串口0RX接收中断标志位清0
  
  URX0IE = 1;         //开串口0接收中断
  EA = 1;             //开总中断
}
/*=================串口0接收中断函数=================*/
#pragma vector = URX0_VECTOR
__interrupt void URX0_ISR()
{
  URX0IF = 0;           //清中断标志位
  RxBuf = U0DBUF;       //将缓冲寄存器的数据给读出来
  Rx_flag = 1;          //接收标志位置1
}
/*================串口0发送一个字节函数==============*/
void UR0SendByte(unsigned char Byte)
{
  U0DBUF = Byte;        //将要发送的一个字节数据写入U0DBUF
  while(!UTX0IF);       //等待TX中断标志,即数据发送完成
  UTX0IF = 0;           //清除TX中断标志,准备下一次发送
}
/*================串口0发送字符串函数================*/
void UR0SendString(unsigned char *str)
{
  while(*str != '\0')     
  {
    UR0SendByte(*str++);  //逐个发送字符串中的字节
  }
}
/*================执行上位机指令函数=================*/
void Execute_CMD()
{
  Rx_flag = 0;      //清0接收标志位
  switch(RxBuf)     //通过上位机发送的命令,判断并执行
  {
  case 0xE1:        //如果PC发送00xE1 则点亮LED1 并串口发送字符串
    LED1 = 1;
    UR0SendString("The LED1 is Open!\r\n");
    break;
  case 0xE2:        //如果PC发送0xE2 则熄灭LED1 并串口发送字符串
    LED1 = 0;
    UR0SendString("The LED1 is Closed!\r\n");
    break;
  case 0xF1:        //如果PC发送0xF1 则点亮LED2 并串口发送字符串
    LED2 = 1;
    UR0SendString("The LED2 is Open!\r\n");
    break;
  case 0xF2:        //如果PC发送0xF2 则熄灭LED2 并串口发送字符串
    LED2 = 0;
    UR0SendString("The LED2 is Closed!\r\n");
    break;
  }
}

如果大家觉得实验中一些寄存器的配置不是很明白,大家就拿出咱们吃饭的家伙CC2530的数据手册来把实验中出现的寄存器在手册中查找,去理解,数据手册网上多的是。
啃骨头,要好好啃,使劲啃,啃到底,才能啃到精髓嘛~~

我会每天更新一篇ZigBee入门-CC2530-的基础实验,让大家学习Zigbee技术不在是从入门到“入土”,而是从入门到巅峰~!!!

欢迎大家的留言和评论我会在看到的第一时间内答复。

看完后感觉得到帮助的小伙伴,要点点赞哦~

给笔者一些动力嘛!谢谢啦~

原创文章 13 获赞 10 访问量 547

猜你喜欢

转载自blog.csdn.net/weixin_45636395/article/details/105825534