zoukankan      html  css  js  c++  java
  • 串口应用

    串口数据的接收与发送

     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 }
  • 相关阅读:
    LeetCode 32. 最长有效括号(Longest Valid Parentheses)
    LeetCode 141. 环形链表(Linked List Cycle)
    LeetCode 160. 相交链表(Intersection of Two Linked Lists)
    LeetCode 112. 路径总和(Path Sum)
    LeetCode 124. 二叉树中的最大路径和(Binary Tree Maximum Path Sum)
    LightGBM新特性总结
    sql service 事务与锁
    C#泛型实例详解
    C# 中的委托和事件(详解)
    C# DateTime日期格式化
  • 原文地址:https://www.cnblogs.com/yuling520/p/12699126.html
Copyright © 2011-2022 走看看