#include <ioCC2530.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
// 定义 LED 的端口
#define LED1 P1_0
#define LED2 P1_1
uchar RXTXflag = 1;
char temp;
uchar datanumber = 0;
char Rxdata[52];
void InitLed()
{
P1DIR = 0x01; //P1_0IO 方向输出
LED1 = 1; //关 关 LED
}
void InitUart()
{
CLKCONCMD &= ~0x40; //设置系统时钟源为 32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为 32MHZ
P0SEL = 0x0c; //P0_2,P0_3用作串口,第二功能
U0CSR |= 0x80; //UART 方式
U0GCR |= 10; //U0GCR与U0BAUD配合
U0BAUD |= 216; // 波特率设为57600
UTX0IF = 1; //UART0中断标志初始置位1
U0CSR |= 0X40; //允许接收
IEN0 |= 0x84; // 开总中断,接收中断
}
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartSend_String(char *Data)
{
while(*Data != '\0')
{
U0DBUF = *Data++;
while(UTX0IF == 0); //the flag of transfer complete
UTX0IF = 0;
}
}
/***************************
主函数
***************************/
void main(void)
{
InitLed(); // 调用初始化函数
InitUart();
while(1)
{
if(RXTXflag == 1) // 接收状态
{
LED1=1; // 接收状态指示
if( temp != 0)
{
if((temp!= '#')&&(datanumber<50)) // # 被定义为结束字符,最多能接收50 个字符
Rxdata[datanumber++] = temp;
else
{
RXTXflag = 3; // 进入发送状态
LED1=0; // 关指示灯
}
temp = 0;
}
}
if(RXTXflag == 3) // 发送状态
{
LED2= 1;
U0CSR &= ~0x40; // 禁止接收
UartSend_String(Rxdata);
U0CSR |= 0x40; // 允许接收
RXTXflag = 1; // 恢复到接收状态
datanumber = 0; // 指针归 0
LED2 = 0; // 关发送指示
}
}
}
/****************************************************************
串口接收一个字符 : 一旦有数据从串口传至 CC2530, 则进入中断,将接收
到的数据赋值给变量 temp.
****************************************************************/
#pragma vector = URX0_VECTOR
__interrupt void UART0_ISR(void)
{
URX0IF = 0; // 清中断标志
temp = U0DBUF;
}
相关文章: