串口应用

串口数据的接收与发送

 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 }
View Code

重要:串口单字节命令控制灯光

  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 != '')         //发送一个字符串
 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灯光已点亮!
");
 71     break;
 72     case 0xa2:
 73       D5 = 1;
 74       UR0_Send_String("D5灯光已点亮!
");
 75     break;
 76     case 0xa3:
 77       D6 = 0;
 78       D5 = 0;
 79       UR0_Send_String("全部灯光已关闭!
");
 80     break;
 81     default:
 82       UR0_Send_String("这是一个错误命令!
");
 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 }
原文地址:https://www.cnblogs.com/yuling520/p/12699126.html