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 }
  • 相关阅读:
    DirectX9:基础篇 第五章 绘制流水线
    他山之石:可以攻玉
    C89:论内存分配问题
    C89:关键字
    MFC:开头篇 介绍
    DirectX9:先导篇 数学基础
    模仿轮播图效果
    text选中后displa出label内容
    ASP.NET页面之间传递值的几种方式
    jquery-delay(),queue()
  • 原文地址:https://www.cnblogs.com/yuling520/p/12699126.html
Copyright © 2011-2022 走看看