嵌入式成长轨迹51 【Zigbee项目】【CC2430基础实验】【在PC用串口控制LED】


在PC上从串口向CC2430发数,即可控制 LED 灯的亮灭,控制数据的格式为“灯编号  开|关 #”,红色 LED 编号为1,绿色 LED 编号为2,0 是关灯,1 是开灯,如打开红色 LED 的命令是“11#”

void initUARTtest(void) ;
函数原型: 

 1 void initUARTtest(void) 
 2 { 
 3  
 4     CLKCON &= ~0x40;              //晶振 
 5     while(!(SLEEP & 0x40));      // 等待晶振稳定 
 6     CLKCON &= ~0x47;             //TICHSPD128 分频,CLKSPD 不分频 
 7     SLEEP |= 0x04;     // 关闭不用的RC振荡器 
 8  
 9     PERCFG = 0x00;       // 位置1 P0 口 
10     P0SEL = 0x3c;        //P0 用作串口 
11     P2DIR &= ~0XC0;                             //P0 优先作为串口0 
12  
13     U0CSR |= 0x80;        //UART 方式 
14     U0GCR |= 10;        //baud_e 
15     U0BAUD |= 216;       // 波特率设为57600 
16     UTX0IF = 0; 
17 } 

函数功能:初始化串口 0,将 I/O 映射到P0口,P0优先作为串口0 使用,UART 工作方式,波特率为57600。使用晶振作为系统时钟源。
 
void UartTX_Send_String(char *Data,int len); 
函数原型: 

 1 void UartTX_Send_String(char *Data,int len) 
 2 { 
 3   int j; 
 4   for(j=0;j<len;j++) 
 5   { 
 6     U0DBUF = *Data++; 
 7     while(UTX0IF == 0); 
 8     UTX0IF = 0; 
 9   } 
10 } 

函数功能:串口发字串,*Data 为发送缓存指针,len 为发送字串的长度,只能是在初始化函数void initUARTtest(void) 之后调用才有效。发送完毕后返回,无返回值。
 
void UART0_ISR(void) ;
函数原型:

1 __interrupt void UART0_ISR(void) 
2  { 
3   URX0IF = 0;    // 清中断标志 
4   temp = U0DBUF; 
5  } 

函数功能:一旦有数据从串口送到 CC2430,则立即进入中断,进入中断后将接收的数据先存放到temp 变量,然后在主程序中去处理接收到的数据。

  1 //main.c
  2 /*****************************************
  3 数据格式: 灯选择 开关 #
  4 10# 关RED LED
  5 11# 开RED LED
  6 20# 关GREEN LED
  7 21# 开GREEN LED
  8 *****************************************/
  9 #include <iocc2430.h>
 10 #include <string.h>
 11 
 12 #define uint unsigned int
 13 #define uchar unsigned char
 14 #define FALSE 0
 15 #define TURE 1
 16 
 17 //定义控制灯的端口
 18 #define led1 P1_0
 19 #define led2 P1_1
 20 
 21 void Delay(uint);
 22 void initUARTtest(void);
 23 
 24 uchar Recdata[3]="000";
 25 uchar RTflag = 1;
 26 uchar temp;
 27 uint  datanumber = 0;
 28 uint  stringlen;
 29 
 30 /****************************************************************
 31 *函数功能 :延时                        
 32 *入口参数 :定性延时                                    
 33 *返 回 值 :无                                                
 34 *说    明 :                                                    
 35 ****************************************************************/
 36 void Delay(uint n)
 37 {
 38     uint i;
 39     for(i=0;i<n;i++);
 40     for(i=0;i<n;i++);
 41     for(i=0;i<n;i++);
 42     for(i=0;i<n;i++);
 43     for(i=0;i<n;i++);
 44 }
 45 
 46 /****************************************************************
 47 *函数功能 :初始化串口1                                        
 48 *入口参数 :无                                                
 49 *返 回 值 :无                            
 50 *说    明 :57600-8-n-1                        
 51 ****************************************************************/
 52 void initUARTtest(void)
 53 {
 54 
 55     CLKCON &= ~0x40;              //晶振
 56     while(!(SLEEP & 0x40));      //等待晶振稳定
 57     CLKCON &= ~0x47;             //TICHSPD128分频,CLKSPD不分频
 58     SLEEP |= 0x04;          //关闭不用的RC振荡器
 59 
 60     PERCFG = 0x00;                //位置1 P0口
 61     P0SEL = 0x3c;                //P0用作串口
 62 
 63     U0CSR |= 0x80;                //UART方式
 64     U0GCR |= 10;                //baud_e
 65     U0BAUD |= 216;                //波特率设为57600
 66     UTX0IF = 1;
 67 
 68     U0CSR |= 0X40;                //允许接收
 69     IEN0 |= 0x84;                //开总中断,接收中断
 70 }
 71 
 72 /*****************************************
 73 *函数功能 :初始化P1口为输出
 74 *入口参数 :无
 75 *返 回 值 :无
 76 *说    明 :无
 77 *****************************************/
 78 void Init_LED_IO(void)
 79 {
 80       //P1 out
 81     P1DIR |= 0x03;                 //P1控制LED
 82     led1 = 1;
 83     led2 = 1;                //关LED
 84 }
 85 
 86 
 87 /****************************************************************
 88 *函数功能 :主函数                                
 89 *入口参数 :无                            
 90 *返 回 值 :无                        
 91 *说    明 :无                            
 92 ****************************************************************/
 93 void main(void)
 94 {    
 95         uchar ii;
 96 
 97         Init_LED_IO();
 98     initUARTtest();
 99 
100     while(1)
101     {
102           if(RTflag == 1)            //接收
103           {
104             if( temp != 0)
105             {
106                 if((temp!='#')&&(datanumber<3))
107                 {                               //’#‘被定义为结束字符
108                                                 //最多能接收3个字符
109                   Recdata[datanumber++] = temp;
110                 }
111                 else
112                 {
113                   RTflag = 3;                   //进入改变小灯的程序
114                 }
115                 if(datanumber == 3)RTflag = 3;
116               temp  = 0;
117             }
118           }
119           if(RTflag == 3)
120           {
121             if(Recdata[0]=='1')
122             {
123               if(Recdata[1]=='0')led1 = 1;      // 10# 关红色LED
124               else
125                 led1 = 0;                       // 11# 开红色LED
126             }
127 
128              if(Recdata[0]=='2')
129             {
130               if(Recdata[1]=='0')led2 = 1;      // 20# 关绿色LED
131               else
132                 led2 = 0;                       // 21# 开绿色LED
133             }
134             RTflag = 1;
135             for(ii=0;ii<3;ii++)Recdata[ii]=' '; //清除刚才的命令
136             datanumber = 0;                     //指针归位
137           }
138         }//while
139 }
140 
141 /****************************************************************
142 *函数功能 :串口接收一个字符                    
143 *入口参数 : 无                        
144 *返 回 值 :无                
145 *说    明 :接收完成后仍然允许接收        
146 ****************************************************************/
147 #pragma vector = URX0_VECTOR
148  __interrupt void UART0_ISR(void)
149  {
150      URX0IF = 0;                //清中断标志
151     temp = U0DBUF;
152         led1=0;
153  }
原文地址:https://www.cnblogs.com/zeedmood/p/2666933.html