zigbee基础应用(五)uart串口通信

来源:互联网 发布:mac的ppt怎么调16:9 编辑:程序博客网 时间:2024/06/05 12:39
zigbee基础应用(五)uart串口通信
1.硬件篇

P0.2为RX P0.3为TX
2.芯片篇




用到的芯片的概况
3.计算篇


波特率的计算公式,通过对UxBAUD.BAUD_M和UxGCR.BAUD_E的配置来设置波特率,如
 U0GCR |= 11;      
 U0BAUD |= 216; //波特率设为115200
4.软件篇
实现步骤:
(1)设置时钟源的晶振   通过CLKCONCMD
 等待晶振稳定          通过CLKCONSTA
 设置系统主时钟频率  CLKCONCMD
(2)UART的备用位置   PERCFG
 将要使用的IO口设置为外设IO  P0SEL
         外设优先级设置     P2DIR
(3)设置UART模式     U0CSR
  通过对UxBAUD.BAUD_M和UxGCR.BAUD_E的配置来设置波特率
        UART0 TX中断标志初始置位0   UTX0IF
(4)通过U0DBUF来发送和接收数据
 UTX0IF来判断是否发送完成 ,为1则发送成功
 URX0IF来判断是否接受完成,为1则接收成功
        接收数据时U0CSR |= 0X40;允许接收
        发送数据时U0CSR &= 0X40;禁止接收
代码:
#include <iocc2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char


//定义控制灯的端口
#define LED1 P1_0
#define LED2 P1_1


void initUART0(void);
void InitialAD(void);
void UartTX_Send_String(uchar *Data,int len);


uchar Recdata[30]="hello zigbee!\n";
uchar RXTXflag = 1;
uchar temp;
uint  datanumber = 0;
uint  stringlen;


/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(uchar *Data,int len)
{
  int j;
  for(j=0;j<len;j++)
  {
    U0DBUF = *Data++;
    while(UTX0IF == 0);
    UTX0IF = 0;
  }
}


#if 0
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
    CLKCONCMD &= ~0x40;                         //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                    //等待晶振稳定
    CLKCONCMD &= ~0x47;                         //设置系统主时钟频率为32MHZ
   
    PERCFG = 0x00; //位置1 P0口
    P0SEL = 0x3c; //P0用作串口
    P2DIR &= ~0XC0;                             //P0优先作为UART0    
    U0CSR |= 0x80; //串口设置为UART方式
    U0GCR |= 11;
    U0BAUD |= 216; //波特率设为115200
    UTX0IF = 1;                                 //UART0 TX中断标志初始置位1    
    U0CSR |= 0X40; //允许接收
    IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.
****************************************************************/
#pragma vector = URX0_VECTOR
 __interrupt void UART0_ISR(void)
 {
  URX0IF = 0; //清中断标志
temp = U0DBUF;                          
 }


#else


/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
    CLKCONCMD &= ~0x40;                         //设置系统时钟源为32MHZ晶振
    while(CLKCONSTA & 0x40);                    //等待晶振稳定
    CLKCONCMD &= ~0x47;                         //设置系统主时钟频率为32MHZ
   
    PERCFG = 0x00; //位置1 P0口
    P0SEL = 0x3c; //P0用作串口
    P2DIR &= ~0XC0;                             //P0优先作为UART0    
    U0CSR |= 0x80; //串口设置为UART方式
    U0GCR |= 11;
    U0BAUD |= 216; //波特率设为115200
    UTX0IF = 1;                                 //UART0 TX中断标志初始置位1    
    U0CSR |= 0X40; //允许接收
//    IEN0 |= 0x84; //开总中断,接收中断
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
    P1DIR = 0x03; //P1控制LED
    LED1 = 1;
    LED2 = 1; //关LED
    initUART0();
    stringlen = strlen((char *)Recdata);
    UartTX_Send_String(Recdata,stringlen);
    
    
    while(1)
    {
      if(RXTXflag == 1)     //接收状态
      {
        
        if( URX0IF == 1)
        {
            LED2=0;     //接收状态指示
            URX0IF = 0; //清中断标志
   temp = U0DBUF;                          


            if((temp!='#')&&(datanumber<50))     //’#‘被定义为结束字符,最多能接收50个字符
            {          
              Recdata[datanumber++] = temp;
            }
            else
            {
              RXTXflag = 3;                      //进入发送状态
            }
            
            if(datanumber == 50)
            {
              RXTXflag = 3;
            }
            
            temp  = 0;
            
            LED2=1;     //接收状态指示
        }
      }
      if(RXTXflag == 3) //发送状态
      {
        UartTX_Send_String("send:",5);
        
        LED2 = 1;                           //关LED2
        LED1 = 0;        //发送状态指示
        U0CSR &= ~0x40; //不能收数
        UartTX_Send_String(Recdata,datanumber);
        UartTX_Send_String("\n",1);
        U0CSR |= 0x40; //允许接收
        RXTXflag = 1;        //恢复到接收状态
        datanumber = 0; //指针归0
        LED1 = 1;        //关发送指示
        memset(Recdata, 0, sizeof(Recdata));
      }
    }
}




#endif

0 0