CC2530 uart串口通信 发送信息控制灯光

思路

通过中断接收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!٩( ‘ω’ )و

猜你喜欢

转载自blog.csdn.net/qq_44616044/article/details/115468342