:在我们学习任何一款单片机的时候,串口外设毫无疑问是我们验证实验,理解配置,学习单片机的最直观体现。
:在我们开发实战中,通过串口通信给下位机发送命令,然后去执行命令这是很常见的操作。
/*****************************************************************
*实验说明:
*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技术不在是从入门到“入土”,而是从入门到巅峰~!!!
欢迎大家的留言和评论我会在看到的第一时间内答复。
看完后感觉得到帮助的小伙伴,要点点赞哦~