zigbee學習之路(十):串口(接收)


一.前言

      上次我們學習了串口的發送,今天我們要學習串口的接收,要實現的功能是接收電腦發來的數據,控制LED 燈閃爍,而且將收到的數據發回給電腦顯示出來。而且要采用不占用cpu資源的中斷。

二原理與分析

     由於要采用中斷處理的方式,所以我們要開接收中斷和總中斷,具體相關的寄存器配置如下:

U0CSR|=0x40是因為要選擇模式和允許接收使能。除此之外都跟上個接收程序一樣

三.程序

主函數

#include <ioCC2530.h>

#include "Uart.h"

#define uint unsigned int

#define uchar unsigned char

#define LED1  P1_0    //P1_0連接LED1

#define LED2  P1_1    //P1_1連接LED2

#define LED3  P1_4    //P1_4連接LED3

//函數聲明

void Send_ReceicedData(void);

void Initial_IO(void);

void Delayms(uint xms);

//定義待發送的數據 char Txdata0[]={"歡迎您\n"}; //存放"歡迎您"

char Txdata1[]={"This is a Uart test.\n"}; char Txdata2[]={"The data CC2530 has received is: "}; char Txdata3[]={"\n"};

char Rxdata = '\0';

/***********  函 數 名  : main  功能描述  : USART測試(USART0接收電腦發過來的數據)  輸入參數  : NONE   輸出參數  : NONE  返 回 值  : NONE **********/ void main(void)

{    

SetSysClock();               //設置系統時鍾為32MHz         

InitUART();                  //調用初始化函數        

Initial_IO();   //調用初始化函數            

UartSend_String(Txdata0,sizeof("秉火團隊歡迎您\n"));    

Delayms(500);    

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

   while(1)     {         Send_ReceicedData();          }   }

/********************  函 數 名  : UART0_ISR  功能描述  : USART接收中斷  輸入參數  : NONE   輸出參數  : Rxdata  返 回 值  : NONE **********/

#pragma vector = URX0_VECTOR  

__interrupt void UART0_ISR(void)  

{     Rxdata = U0DBUF;   //接收數據並存於Rxdata

    URX0IF = 0;    // 清中斷標志  }

/*************************  函 數 名  : Send_ReceicedData  功能描述  : 將接收到的數據發回給電腦  輸入參數  : NONE   輸出參數  : NONE  返 回 值  : NONE **************/

void Send_ReceicedData(void)

{     

if ( Rxdata != '\0' )    

{      

UartSend_String(Txdata2,sizeof("The data CC2530 has received is: ")); //提示接收到數據      

Send_char(Rxdata);     

  UartSend_String(Txdata3,sizeof("\n"));           

  if (Rxdata=='1')      

{         LED1=0;         Delayms(500);         LED1=1;              }          

   if (Rxdata=='2')       {         LED2=0;         Delayms(500);         LED2=1;              }

      if (Rxdata=='3')       {         LED3=0;         Delayms(500);         LED3=1;              }      

    Rxdata='\0';              }

}

/******************  函 數 名  : Initial_IO  功能描述  : IO初始化函數  輸入參數  : NONE   輸出參數  : NONE  返 回 值  : NONE ****************/

void Initial_IO(void)

{     P1DIR |= 0xff;     //P1為輸出    

P1=0x1f;           //P1_4口為高,讓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 用作串口,第二功能    

P2DIR &= ~0XC0;         //P0 優先作為UART0 ,優先級    

U0CSR |= 0x80;          //UART 方式    

U0GCR |= 11;            //U0GCR與U0BAUD配合        

U0BAUD |= 216;          //波特率設為115200    

UTX0IF = 0;             //UART0 TX 中斷標志清0    

U0CSR |= 0X40;          //允許接收     URX0IE=1;               //接收中斷    

EA=1;                   //開總中斷,                   }

/**************************************************  函 數 名  : Send_char  功能描述  : 串口向電腦發送字節  輸入參數  : c---所要發送的數據  輸出參數  : NONE  返 回 值  : NONE ***************************************************/

void Send_char(uchar c)

{     U0DBUF = c;    

while(UTX0IF == 0);   //發送完成標志位    

UTX0IF = 0;   }

/********************************  函 數 名  : UartSend_String  功能描述  : 串口向電腦發送字符串  輸入參數  : *Data---字符串首地址              len---字符串長度  輸出參數  : NONE  返 回 值  : NONE ******************************/

void UartSend_String(char *Data,int len)

{     int j;    

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

  {               Send_char(*Data++);     } }

/**********************  函 數 名  : SetSysClock  功能描述  : 設置系統時鍾為32MHz  輸入參數  : NONE  輸出參數  : NONE  返 回 值  : NONE ******************/

void SetSysClock(void)

{    

CLKCONCMD &= ~0x40;           //選擇系統時鍾源為外部32MHz crystal oscillator    

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

CLKCONCMD &= ~0x47;           //設置系統主時鍾頻率為32MHZ 

}

四.總結

       Send_ReceicedData(void)這個函數,用來根據接收的字符來作出反應,讓對應的燈亮,需要注意的是使用了串口中斷,所以我們要把相關的串口中斷打開,並在中斷函數里清除中斷標志位。

   

 

    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM