思路
通过中断接收CC2530的信息,然后根据信息对灯光做出控制
为了简单,所以指令统一为一位
指令
0:全亮
1:全灭
b/B:改变蓝灯
y/Y:改变黄灯
代码
#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);
void UsartTX_Receive_String(); //此为接收函数
char ReceiveData[3];//接收信息数组
uchar Recdata[15]="start\n";
uchar temp;//接收字符
uint datanumber = 0;//接收长度
uint stringlen;
/****************************************************************
初始化串口0函数
****************************************************************/
void initUART0(void)
{
CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振
while(CLKCONSTA & 0x40); //等待晶振稳定
CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZ
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x0c; //P0用作串口 0011 1100
P2DIR &= ~0XC0; //P0优先作为UART0 0011 1111
U0CSR |= 0x80; //串口设置为UART方式 1000 0000
U0GCR |= 9; // 见波特率设置表0000 1001
U0BAUD |= 59; //波特率设置表,波特率设为19200
UTX0IF = 1; //UART0 TX中断标志初始置位1
U0CSR |= 0X40; //允许接收 0100 0000
IEN0 |= 0x84; //开总中断,接收中断 1000 0100
}
/****************************************************************
串口发送字符串函数
****************************************************************/
void UartTX_Send_String(uchar *Data,int len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
//接收
void UsartTX_Receive_String()
{
if(temp != 0) //接收到数据
{
if(temp != '#')
{
ReceiveData[datanumber++] = temp; //一位一位读取
//判输入指令,可更改指令
if(datanumber==1&&(ReceiveData[0]=='b'||ReceiveData[0]=='B'))
{
if(led2==1)
{
led2=0;
UartTX_Send_String("蓝色亮\n",sizeof("蓝色亮\n"));
}
else
{
led2=1;
UartTX_Send_String("蓝色灭\n",sizeof("蓝色灭\n"));
}
}
else if(datanumber==1&&(ReceiveData[0]=='y'||ReceiveData[0]=='Y'))
{
if(led1==1)
{
led1=0;
UartTX_Send_String("黄色亮\n",sizeof("黄色亮\n"));
}
else
{
led1=1;
UartTX_Send_String("黄色灭\n",sizeof("黄色灭\n"));
}
}
else if(datanumber==1&&ReceiveData[0]=='0')
{
led1=0;
led2=0;
UartTX_Send_String("全亮\n",sizeof("全亮\n"));
}
else if(datanumber==1&&ReceiveData[0]=='1')
{
led1=1;
led2=1;
UartTX_Send_String("全灭\n",sizeof("全灭\n"));
}
datanumber = 0;//重新计数
}
temp = 0;
}
}
/****************************************************************
主函数
****************************************************************/
void main(void)
{
P1DIR = 0x03; //P1控制LED
led1 = 1;//全灭
led2 = 1;
initUART0();
UartTX_Send_String(Recdata,sizeof(Recdata)); //把Recdata里面的字符串发送出去
while(1);//一直运行
}
#pragma vector = URX0_VECTOR
__interrupt void URX0_ISR(void)
{
URX0IF = 0; //串口接收中断清零,准备下一次的数据接收
temp = U0DBUF; //将缓冲器中的数据保存到temp中
UsartTX_Receive_String();//接收并保存数据
}
连接好后,打开串口调试,打开串口,然后运行程序,就可以输入指令控制板子了get!٩( ‘ω’ )و