嵌入式成长轨迹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 }