一.前言
上次我們學習了串口的發送,今天我們要學習串口的接收,要實現的功能是接收電腦發來的數據,控制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)這個函數,用來根據接收的字符來作出反應,讓對應的燈亮,需要注意的是使用了串口中斷,所以我們要把相關的串口中斷打開,並在中斷函數里清除中斷標志位。