zoukankan      html  css  js  c++  java
  • zigbee学习之路(九):串口(发送)

    一.前言

            今天,我们来学习和实验串口模块方面的,串口通信是我们常用的通信手段,通过串口交互,我们可以很容易的和pc机进行数据的交换和发送,所以我们今天就来学习一下。这个实验所进行的功能是一开始CC2530 向电脑发送“单片机欢迎您”,“This is a Uart test.”,之后按下Key1,就在电脑上显示“Key1 has been pressed down. ”,Key2 也是同样的道理。

    二.原理与分析

          cc2530有两个串口,分别为Usart0,Usart1,它们有同步模式和异步模式。串口对应的引脚如下:

    在实际的应用中,我们一般都应用的是异步模式,所以今天实验就是异步的串口传送,先介绍一下异步传输的特点:

    串口进行收发的数据都会保存在UxBUF寄存器中,要使用串口进行收发数据,我们要先对串口进行配置和波特率的设置

    要配置的寄存器:

    系统时钟和串口的配置如下:

    配置时钟为什么要用clkconcmd寄存器,下面给出寄存器表:

    三.实验效果

    四.程序

    主函数

    #include <ioCC2530.h>

    #include "Uart.h"

    #define uint unsigned int

    #define uchar unsigned char

    #define KEY1  P0_4     //KEY1为P0_4口控制 

    #define KEY2  P0_5     //KEY2为P0_5口控制

    #define LED1  P1_0     //P1_0连接LED1

    #define LED2  P1_1     //P1_1连接LED2

    #define LED3  P1_4     //P1_4连接LED3

    //函数声明 void Initial_IO(void); void Delayms(uint xms);

    //定义待发送的数据

    char Txdata0[]={"秉火团队欢迎您 "};  //存放"秉火团队欢迎您"

    char Txdata1[]={"This is a Uart test. "};

    char Txdata2[]={"Key1 has been pressed down. "};

    char Txdata3[]={"Key2 has been pressed down. "};

    /**************************************************  函 数 名  : main  功能描述  : USART测试(USART0发送数据给电脑)  输入参数  : NONE   输出参数  : NONE  返 回 值  : NONE ***************************************************/

    void main(void)

    {   

      SetSysClock();               //设置系统时钟为32MHz        

    Initial_IO();   //调用初始化函数       

      InitUART();                  //调用初始化函数       

      UartSend_String(Txdata0,sizeof("秉火团队欢迎您 "));    

    Delayms(500);    

    UartSend_String(Txdata1,sizeof("This is a Uart test. "));        

    while(1)    

    {       

      if(KEY1==0)      

       {                   

    UartSend_String(Txdata2,sizeof("Key1 has been pressed down. "));  //发送数据            

    Delayms(500);     //按键去抖         }             

        if(KEY2==0)       

      {                   

    UartSend_String(Txdata3,sizeof("Key2 has been pressed down. "));  //发送数据           

      Delayms(500);     //按键去抖         }     }   }

    /**************************************************  函 数 名  : Initial_IO  功能描述  : LED_IO初始化函数  输入参数  : NONE   输出参数  : NONE  返 回 值  : NONE ***************************************************/

    void Initial_IO(void)

    {     

    P1DIR |= 0x13;     //P1_0、P1_1、P1_4为输出,其他为输入    

    P1=0xff;          //P1口为高(LED1、LED2,LED3高) }

    /**************************************************  函 数 名  : Delayms  功能描述  : 毫秒延时  输入参数  : xms:延时时间,如 i=xms 即延时i/2毫秒  输出参数  : none  返 回 值  : none ***************************************************/

    void Delayms(uint xms)   {     uint i,j;     for(i=xms;i>0;i--)         for(j=587;j>0;j--); }

    Uart.c文件

    #include "Uart.h"

    #define uint unsigned int

    #define uchar unsigned char

    /**************************************************  函 数 名  : InitUART  功能描述  : CC2530串口初始化配置  输入参数  : NONE   输出参数  : NONE  返 回 值  : NONE ***************************************************/

    void InitUART(void)

    {    

    PERCFG = 0x00;        //位置1 P0口    

    P0SEL = 0x0c;        //P0_2,P0_3 用作串口(IO 复用)    

    P2DIR &= ~0XC0;                   //P0优先作为UART0

        U0CSR |= 0x80;        //设置为UART方式    

    U0GCR |= 11;              

    U0BAUD |= 216;        //波特率设为115200    

    UTX0IF = 0;                       //UART0 TX中断标志初始置位0 }

    /**************************************************  函 数 名  : UartSend_String  功能描述  : 串口向电脑发送字符串  输入参数  : *Data---字符串首地址              len---字符串长度  输出参数  : NONE  返 回 值  : NONE ***************************************************/

    void UartSend_String(char *Data,int len)

    {     int j;    

    for(j=0;j<len;j++)    

    {         U0DBUF = *Data++;         while(UTX0IF == 0);         UTX0IF = 0;     } }

    /**************************************************  函 数 名  : SetSysClock  功能描述  : 设置系统时钟为32MHz  输入参数  : NONE  输出参数  : NONE  返 回 值  : NONE ***************************************************/

    void SetSysClock(void) {     CLKCONCMD &= ~0x40;           //选择系统时钟源为外部32MHz crystal oscillator   

      while(CLKCONSTA & 0x40);      //等待晶振稳定为32MHz    

    CLKCONCMD &= ~0x47;           //设置系统主时钟频率为32MHZ  }

    四.总结与分析

        通过这次的实验,我们可以学会用串口进行数据的发送,这是非常基础的,但需要记住的是要先配置串口的初值和系统的时钟。

       

         

  • 相关阅读:
    [MySQL] 数据库基本概念
    [LeetCode] Number of 1 Bits
    [LeetCode] Maximum Subarray
    [LeetCode] Search Insert Position
    [LeetCode] Remove Duplicates from Sorted List
    [LeetCode] Path Sum III
    [LeetCode] Not Boring Movies
    [LeetCode] Swap Salary
    [LeetCode] Big Countries
    中国银联全渠道系统商户接入 测试指引-银联网关支付产品
  • 原文地址:https://www.cnblogs.com/sjsxk/p/5316351.html
Copyright © 2011-2022 走看看