cc2530 串口实验--控制led灯

[cpp]  view plain copy
  1. /************************ 
  2. * project : PC机向cc2530发送指令,控制led的亮灭 
  3.             指令格式为“xy#”,其中x可以是B或Y, 
  4.             代表着蓝灯或黄灯。y可以是0或1,0代表 
  5.             关灯,1代表亮灯 
  6. *    时间 :2014年1月10 
  7. *    作者 :林少游 
  8. ************************/  
  9. #include   
  10. #include   
  11.   
  12. #define YLED P1_0  
  13. #define BLED P1_1  
  14.   
  15. #define LIGHTOPEN 1  
  16. #define LIGHTCLOSE 0  
  17.   
  18. #define uint unsigned int   
  19. #define uchar unsigned char  
  20.   
  21. char ReceiveData[3];  //接收到的数据  
  22. int DataNumber=0;     //接收到的数据的长度  
  23. char temp;            //接收到的临时字符  
  24.   
  25. void Delay(uint n);  
  26. void Led_Init();  
  27. void Usart0_Init();  
  28. void Usart0_Send_String(char *Data,int len);  
  29. void Usart0_Receive_String();  
  30. void Led_Contral(char *Data,int len);  
  31.   
  32. /************************ 
  33. * @brief : LED初始化函数 
  34. ************************/  
  35. void Delay(uint n)  
  36. {  
  37.   uint i;  
  38.   for(i=0;i
  39.   for(i=0;i
  40.   for(i=0;i
  41.   for(i=0;i
  42.   for(i=0;i
  43. }  
  44.   
  45.   
  46. /************************ 
  47. * @brief : LED初始化函数 
  48. ************************/  
  49. void Led_Init()  
  50. {  
  51.   P1DIR |= 0X03;    //P1.0,P1.1设置为输出  
  52.   YLED = LIGHTCLOSE;//黄灯灭  
  53.   BLED = LIGHTCLOSE;//蓝灯灭  
  54. }  
  55.   
  56. /************************ 
  57. * @brief : 串口初始化函数 
  58. ************************/  
  59. void Usart0_Init()  
  60. {  
  61.   CLKCONCMD &= ~0X40;     //系统时钟源选择32MHz  
  62.   while(CLKCONSTA&0X40);  //等待晶振稳定  
  63.   CLKCONCMD &= ~0X47;     //时钟速度设置为32MHz  
  64.     
  65.   PERCFG = 0X00;          //P0设置为外设  
  66.   P0SEL |= 0X3C;          //P1.2,P1.3,P1.4,P1.5设置为串口引脚映射  
  67.   P2DIR |= 0XC0;          //P0中的USART0的优先级最高  
  68.     
  69.   U0CSR |= 0X80;          //选择UART模式  
  70.   U0GCR |= 9;  
  71.   U0BAUD|= 59;            //波特率选择为19200  
  72.     
  73.   U0CSR |= 0X40;          //USART允许接收  
  74.   IEN0 |= 0X84;           //打开总中断开关和串口接收中断使能  
  75.   URX0IF = 0;             //串口接收中断标志位清零  
  76.   UTX0IF = 0;             //串口发送中断标志位清零  
  77. }  
  78.   
  79. /************************ 
  80. * @brief : Led灯控制函数 
  81. ************************/  
  82. void Led_Contral(char *Data,int len)  
  83. {  
  84.   if(len == 3 && Data[0] != '#' && Data[1] != '#' && Data[2] == '#')  
  85.   {  
  86.     switch(Data[0])  
  87.     {  
  88.     case 'B':  
  89.     case 'b':  
  90.       BLED = (Data[1] == '1');  
  91.       Usart0_Send_String("蓝色灯被控制\n",sizeof("蓝色灯被控制\n"));  
  92.       break;  
  93.     case 'Y':  
  94.     case 'y':  
  95.       YLED = (Data[1] == '1');  
  96.       Usart0_Send_String("黄色灯被控制\n",sizeof("黄色灯被控制\n"));  
  97.       break;  
  98.     default:  
  99.       Usart0_Send_String("指令输入有误请重新输入\n",sizeof("指令输入有误请重新输入\n"));  
  100.     }  
  101.   }  
  102.   else  
  103.     Usart0_Send_String("指令输入有误,请重新输入\n",sizeof("指令输入有误,请重新输入\n"));  
  104. }  
  105.   
  106. /************************* 
  107. * @brief : 串口发送函数 
  108. *  param :Data - 要发送的数据 
  109.            len - 要发送的数据的长度 
  110. *************************/  
  111. void Usart0_Send_String(char *Data,int len)  
  112. {  
  113.   uint i;  
  114.   for(i = 0; i < len; i++  )  
  115.   {  
  116.     U0DBUF = *Data++;     //将数据字符一个一个的填充到U0DBUF中(8个位)  
  117.     while(UTX0IF == 0);   //等待数据发送完毕  
  118.     UTX0IF = 0;           //串口发送中断标志位清零  
  119.   }  
  120. }  
  121.   
  122. /************************* 
  123. * @brief : 串口数据接收 
  124. *************************/  
  125. void Usart0_Receive_String()  
  126. {  
  127.   if(temp != 0)       //接收到数据  
  128.     {  
  129.       if(temp != '#')  
  130.       {  
  131.         ReceiveData[DataNumber++] = temp;  
  132.       }  
  133.       else  
  134.       {  
  135.         ReceiveData[DataNumber++] = temp;  
  136.         Led_Contral(ReceiveData,DataNumber); //Led灯控制  
  137.         DataNumber = 0;//重新计数  
  138.       }  
  139.       if(DataNumber == 3)  
  140.       {  
  141.         Led_Contral(ReceiveData,DataNumber); //Led灯控制      
  142.         DataNumber = 0;//重新计数  
  143.       }  
  144.       temp = 0;            
  145.     }  
  146. }  
  147.   
  148. /************************* 
  149. * @brief : 主函数 
  150. *************************/  
  151. main()  
  152. {  
  153.   Led_Init();  
  154.   Usart0_Init();  
  155.   while(1);  
  156. }  
  157.   
  158. /************************* 
  159. * @brief : 中断服务程序--串口数据接收 
  160. *************************/  
  161. #pragma vector = URX0_VECTOR  
  162. __interrupt void URX0_ISR(void)  
  163. {  
  164.   URX0IF = 0;       //串口接收中断清零,准备下一次的数据接收  
  165.   temp = U0DBUF;    //将缓冲器中的数据保存到temp中  
  166.   Usart0_Receive_String();//接收并保存数据  
  167.     
  168. }  

你可能感兴趣的:(cc2530 串口实验--控制led灯)