1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
在我们学习任何一款单片机的时候,串口外设毫无疑问是我们验证实验,理解配置,学习单片机的最直观体现。 :在我们开发实战中,通过串口通信给下位机发送命令,然后去执行命令这是很常见的操作。 /***************************************************************** *实验说明: *CC2530向上位机PC发送一个字符串,串口助手中显示; *上位机PC向CC2530通过串口助手发送一个数据命令; *然后CC2530先接收,然后判断并执行相应的命令; *****************************************************************/ #include #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!rn"); 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 != ' |