您的位置:首页 > 其它

cc2530 串口实验--控制led灯

2014-02-08 13:06 357 查看
[cpp] view
plaincopy





/************************

* project : PC机向cc2530发送指令,控制led的亮灭

指令格式为“xy#”,其中x可以是B或Y,

代表着蓝灯或黄灯。y可以是0或1,0代表

关灯,1代表亮灯

* 时间 :2014年1月10

* 作者 :林少游

************************/

#include <ioCC2530.h>

#include <string.h>

#define YLED P1_0

#define BLED P1_1

#define LIGHTOPEN 1

#define LIGHTCLOSE 0

#define uint unsigned int

#define uchar unsigned char

char ReceiveData[3]; //接收到的数据

int DataNumber=0; //接收到的数据的长度

char temp; //接收到的临时字符

void Delay(uint n);

void Led_Init();

void Usart0_Init();

void Usart0_Send_String(char *Data,int len);

void Usart0_Receive_String();

void Led_Contral(char *Data,int len);

/************************

* @brief : LED初始化函数

************************/

void Delay(uint n)

{

uint i;

for(i=0;i<n;i++);

for(i=0;i<n;i++);

for(i=0;i<n;i++);

for(i=0;i<n;i++);

for(i=0;i<n;i++);

}

/************************

* @brief : LED初始化函数

************************/

void Led_Init()

{

P1DIR |= 0X03; //P1.0,P1.1设置为输出

YLED = LIGHTCLOSE;//黄灯灭

BLED = LIGHTCLOSE;//蓝灯灭

}

/************************

* @brief : 串口初始化函数

************************/

void Usart0_Init()

{

CLKCONCMD &= ~0X40; //系统时钟源选择32MHz

while(CLKCONSTA&0X40); //等待晶振稳定

CLKCONCMD &= ~0X47; //时钟速度设置为32MHz

PERCFG = 0X00; //P0设置为外设

P0SEL |= 0X3C; //P1.2,P1.3,P1.4,P1.5设置为串口引脚映射

P2DIR |= 0XC0; //P0中的USART0的优先级最高

U0CSR |= 0X80; //选择UART模式

U0GCR |= 9;

U0BAUD|= 59; //波特率选择为19200

U0CSR |= 0X40; //USART允许接收

IEN0 |= 0X84; //打开总中断开关和串口接收中断使能

URX0IF = 0; //串口接收中断标志位清零

UTX0IF = 0; //串口发送中断标志位清零

}

/************************

* @brief : Led灯控制函数

************************/

void Led_Contral(char *Data,int len)

{

if(len == 3 && Data[0] != '#' && Data[1] != '#' && Data[2] == '#')

{

switch(Data[0])

{

case 'B':

case 'b':

BLED = (Data[1] == '1');

Usart0_Send_String("蓝色灯被控制\n",sizeof("蓝色灯被控制\n"));

break;

case 'Y':

case 'y':

YLED = (Data[1] == '1');

Usart0_Send_String("黄色灯被控制\n",sizeof("黄色灯被控制\n"));

break;

default:

Usart0_Send_String("指令输入有误请重新输入\n",sizeof("指令输入有误请重新输入\n"));

}

}

else

Usart0_Send_String("指令输入有误,请重新输入\n",sizeof("指令输入有误,请重新输入\n"));

}

/*************************

* @brief : 串口发送函数

* param :Data - 要发送的数据

len - 要发送的数据的长度

*************************/

void Usart0_Send_String(char *Data,int len)

{

uint i;

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

{

U0DBUF = *Data++; //将数据字符一个一个的填充到U0DBUF中(8个位)

while(UTX0IF == 0); //等待数据发送完毕

UTX0IF = 0; //串口发送中断标志位清零

}

}

/*************************

* @brief : 串口数据接收

*************************/

void Usart0_Receive_String()

{

if(temp != 0) //接收到数据

{

if(temp != '#')

{

ReceiveData[DataNumber++] = temp;

}

else

{

ReceiveData[DataNumber++] = temp;

Led_Contral(ReceiveData,DataNumber); //Led灯控制

DataNumber = 0;//重新计数

}

if(DataNumber == 3)

{

Led_Contral(ReceiveData,DataNumber); //Led灯控制

DataNumber = 0;//重新计数

}

temp = 0;

}

}

/*************************

* @brief : 主函数

*************************/

main()

{

Led_Init();

Usart0_Init();

while(1);

}

/*************************

* @brief : 中断服务程序--串口数据接收

*************************/

#pragma vector = URX0_VECTOR

__interrupt void URX0_ISR(void)

{

URX0IF = 0; //串口接收中断清零,准备下一次的数据接收

temp = U0DBUF; //将缓冲器中的数据保存到temp中

Usart0_Receive_String();//接收并保存数据

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: