- /************************
- * 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();//接收并保存数据
- }
cc2530 串口实验--控制led灯
最新推荐文章于 2024-07-06 13:55:02 发布