串口应用
串口数据的接收与发送
1 #include "ioCC2530.h" 2 3 /*====================初始化系统时钟函数======================*/ 4 void Init_Clock_32MHz() 5 { 6 CLKCONCMD &= ~0x40; //选择系统时钟源为32MHZ晶振 0100 0000->1011 1111 7 while(CLKCONSTA & 0x40); //等待晶振稳定 0100 0000 8 CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ 0100 0111->1011 1000 9 } 10 11 /*======================初始化串口0函数=======================*/ 12 void Init_Uart0() 13 { 14 //端口相关的配置 15 PERCFG = 0x00; //串口0的引脚映射到位置1,即P0_2和P0_3 16 P0SEL = 0x0C; //将P0_2和P0_3端口设置成外设功能 17 //波特率相关的配置 18 U0BAUD = 59; //32MHz的系统时钟产生9600BPS的波特率 19 U0GCR = 8; //16MHz---9; 32MHz---8 20 //串口属性相关的配置 21 U0UCR |= 0x80; //禁止流控,8位数据,清除缓冲器 1000 0000 22 U0CSR |= 0xC0; //选择UART模式,使能接收器 1100 0000 23 //串口中断相关的配置 24 UTX0IF = 0; //清除TX发送中断标志 25 URX0IF = 0; //清除RX接收中断标志 26 URX0IE = 1; //使能URAT0的接收中断 27 IEN2 |= 0x04; //使能URAT0的发送中断 0000 0100 28 EA = 1; //使能总中断 29 } 30 31 /*===================串口0接收中断服务函数=====================*/ 32 #pragma vector = URX0_VECTOR 33 __interrupt void UR0_RecvInt() 34 { 35 U0DBUF = U0DBUF + 1; //将接收到的数据加1再发生回去 36 } 37 /*===================串口0中发送断服务函数=====================*/ 38 #pragma vector = UTX0_VECTOR 39 __interrupt void UR0_SendInt() 40 { 41 UTX0IF = 0; //清除TX中断标志,准备下一次发送 42 } 43 44 void main() 45 { 46 Init_Clock_32MHz(); 47 Init_Uart0(); 48 while(1) 49 { 50 } 51 }
重要:串口单字节命令控制灯光
1 #include "ioCC2530.h" 2 3 #define D3 P1_0 4 #define D4 P1_1 5 #define D5 P1_3 6 #define D6 P1_4 7 8 unsigned char F_UR0_Recv = 0; //上位机命令字接收完成标志 9 unsigned char UR0_Command; //上位机命令控制字 10 11 /*====================初始化系统时钟函数======================*/ 12 void Init_Clock_32MHz() 13 { 14 CLKCONCMD &= ~0x40; //选择系统时钟源为32MHZ晶振 15 while(CLKCONSTA & 0x40); //等待晶振稳定 16 CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ 17 } 18 19 /*======================初始化串口0函数=======================*/ 20 void Init_Uart0() 21 { 22 //端口相关的配置 23 PERCFG = 0x00; //串口0的引脚映射到位置1,即P0_2和P0_3 24 P0SEL = 0x0C; //将P0_2和P0_3端口设置成外设功能 25 //波特率相关的配置 26 U0BAUD = 59; //32MHz的系统时钟产生9600BPS的波特率 27 U0GCR = 8; //16MHz---9; 32MHz---8 28 //串口属性相关的配置 29 U0UCR |= 0x80; //禁止流控,8位数据,清除缓冲器 30 U0CSR |= 0xC0; //选择UART模式,使能接收器 31 //串口中断相关的配置 32 UTX0IF = 0; //清除TX发送中断标志 33 URX0IF = 0; //清除RX接收中断标志 34 URX0IE = 1; //使能URAT0的接收中断 35 EA = 1; //使能总中断 36 } 37 38 /*===================串口0接收中断服务函数=====================*/ 39 #pragma vector = URX0_VECTOR 40 __interrupt void UR0_RecvInt() 41 { 42 UR0_Command = U0DBUF; //将控制命令字从缓冲区取出 43 F_UR0_Recv = 1; //标志成功接收上位机的单字节命令 44 } 45 46 /*=====================串口0单字节发送函数=====================*/ 47 void UR0_Send_Byte(unsigned char dat) 48 { 49 U0DBUF = dat; //将要发送的1字节数据写入U0DBUF 50 while(!UTX0IF); //等待TX中断标志,即数据发送完成 51 UTX0IF = 0; //清除TX中断标志,准备下一次发送 52 } 53 54 /*=====================串口0字符串发送函数=====================*/ 55 void UR0_Send_String(unsigned char *str) 56 { 57 while(*str != '\0') //发送一个字符串 58 { 59 UR0_Send_Byte(*str++); //逐个发送字符串中的字节 60 } 61 } 62 63 /*======================串口0命令执行函数======================*/ 64 void DoWork_UR0() 65 { 66 switch(UR0_Command) //解析上位机命令并执行 67 { 68 case 0xa1: 69 D6 = 1; 70 UR0_Send_String("D6灯光已点亮!\r\n"); 71 break; 72 case 0xa2: 73 D5 = 1; 74 UR0_Send_String("D5灯光已点亮!\r\n"); 75 break; 76 case 0xa3: 77 D6 = 0; 78 D5 = 0; 79 UR0_Send_String("全部灯光已关闭!\r\n"); 80 break; 81 default: 82 UR0_Send_String("这是一个错误命令!\r\n"); 83 break; 84 } 85 } 86 87 /*======================端口初始化函数========================*/ 88 void Init_Port() 89 { 90 P1SEL &= ~0x1b; //P1_0、P1_1、P1_3和P1_4作为通用I/O端口 91 P1DIR |= 0x1b; //P1_0、P1_1、P1_3和P1_4端口输出 92 93 D3 = 0; 94 D4 = 0; 95 D5 = 0; 96 D6 = 0; 97 } 98 99 /*==========================主函数============================*/ 100 void main() 101 { 102 Init_Clock_32MHz(); 103 Init_Uart0(); 104 Init_Port(); 105 while(1) 106 { 107 if(F_UR0_Recv == 1) 108 { 109 F_UR0_Recv = 0; 110 DoWork_UR0(); 111 } 112 } 113 }