<small id="xllpy"></small>
<span id="xllpy"></span>
  • <span id="xllpy"><output id="xllpy"><b id="xllpy"></b></output></span>
    1. <optgroup id="xllpy"><li id="xllpy"><del id="xllpy"></del></li></optgroup>
      <span id="xllpy"><output id="xllpy"><nav id="xllpy"></nav></output></span>

      藍牙4.0串口的高級開發



      串口的高級開發


      講解程序,代碼如下:



      #include <ioCC2540.h>
      #include <string.h>
       
      typedef unsigned char uchar;
      typedef unsigned int  uint;
      #define LED1 P1_0       //定義P1.0口為LED1控制端
      #define LED2 P1_1       //定義P1.1口為LED2控制端
      #define LED3 P1_4       //定義P1.4口為LED3控制端
      #define LED4 P0_1       //定義P0.1口為LED4控制端
       
      #define UART0_RX    1
      #define UART0_TX    2
      #define SIZE       51
       
      char RxBuf;
      char UartState;
      uchar count;
      char RxData[SIZE];        //存儲發送字符串
      uint gManageMode;
       
      void DelayMS(uint msec)
      { 
          uint i,j;
          
          for (i=0; i<msec; i++)
              for (j=0; j<1070; j++);
      }
      void LedOnOrOff(uchar mode)
      {
          LED1 = mode;
          LED2 = mode;
          LED3 = mode;
          LED4 = mode;
      }
      void InitLed(void)
      {
          P1DIR |= 0x13;      //P1.0、P1.1、P1.4定義為輸出
          P0DIR |= 0x02;      //P0.1定義為輸出
          LedOnOrOff(0);      //使所有LED燈默認為熄滅狀態
      }
       
      void InitUart(void)
      { 
          PERCFG = 0x00;           //外設控制寄存器 USART 0的IO位置:0為P0口位置1 
          P0SEL = 0x0c;            //P0_2,P0_3用作串口(外設功能)
          P2DIR &= ~0xC0;          //P0優先作為UART0
          
          U0CSR |= 0x80;           //設置為UART方式
          U0GCR |= 11;       
          U0BAUD |= 216;           //波特率設為115200
          UTX0IF = 0;              //UART0 TX中斷標志初始置位0
          U0CSR |= 0x40;           //允許接收 
          IEN0 |= 0x84;            //開總中斷允許接收中斷  
      }
       
       
      void UartSendString(char *Data, int len)    //定義一個指針型和它的長度
      {
          uint i;
          
          for(i=0; i<len; i++)
          {
              U0DBUF = *Data++;
              while(UTX0IF == 0);
              UTX0IF = 0;
          }
      }
      void mode1(void)
      {
        LedOnOrOff(0);//全滅
        DelayMS(1000);
        LED1 = 1;//點亮LED1
        DelayMS(1000);
        LED2 = 1;//點亮LED2
        DelayMS(1000);
        LED3 = 1;//點亮LED3
        DelayMS(1000);
        LED4 = 1;//點亮LED4
        DelayMS(1000);
      }
      void mode2(void)
      {
        LedOnOrOff(0);//全滅
        DelayMS(1000);
        LedOnOrOff(1);//全滅
        DelayMS(1000);
      }
      void mode3(void)
      {
        LedOnOrOff(0);//全滅
        DelayMS(1000);
        LED1 = 1;//點亮LED1
        LED2 = 0;//點亮LED2
        LED3 = 1;//點亮LED3
        LED4 = 0;//點亮LED4
        DelayMS(1000);
        LED1 = 0;//點亮LED1
        LED2 = 1;//點亮LED2
        LED3 = 0;//點亮LED3
        LED4 = 1;//點亮LED4
        DelayMS(1000);
      }
       
      void mode_pro(uint mode)
      {
        switch(mode)
        {
        case 1:mode1();
          break;
        case 2:mode2();
          break;
        case 3:mode3();
          break;
        default:break;
        
        
        }
      }
      #pragma vector = URX0_VECTOR 
      __interrupt void UART0_ISR(void) 
      { 
          URX0IF = 0;       // 清中斷標志 
          RxBuf = U0DBUF;    
          if(UartState == UART0_RX)              //接收狀態 
              { 
                  if(RxBuf != 0) 
                  {                 
                      if((RxBuf != '#')&&(count < 50))//以'#'為結束符,一次最多接收50個字符            
                          RxData[count++] = RxBuf; 
                      else
                      {
                          if(count >= 50)             //判斷數據合法性,防止溢出
                          {
                              count = 0;              //計數清0
                              memset(RxData, 0, SIZE);//清空接收緩沖區
                          }
                          else
                              UartState = UART0_TX;  //進入發送狀態
                      }
                      RxBuf  = 0;
                  }
              }
              
              if(UartState == UART0_TX)              //發送狀態 
              {                         
                  U0CSR &= ~0x40;                    //禁止接收 
                  UartSendString(RxData, count);     //發送已記錄的字符串。
                  U0CSR |= 0x40;                     //允許接收 
                  UartState = UART0_RX;              //恢復到接收狀態 
                  count = 0;                         //計數清0
                  //memset(RxData, 0, SIZE);           //清空接收緩沖區
                   if(strstr(RxData,"mode1")!=NULL)
                  {
                    gManageMode = 1;
                  }
                  else if(strstr(RxData,"mode2")!=NULL)
                 {
                    gManageMode = 2;
                 }
                 else if(strstr(RxData,"mode3")!=NULL)
                {
                   gManageMode = 3;
                }
              }  
      }
       
       
      /****************************************************************************
      * 程序入口函數
      ****************************************************************************/
      void main(void)
      {
          CLKCONCMD &= ~0x40;                        //設置系統時鐘源為32MHZ晶振
          while(CLKCONSTA & 0x40);                   //等待晶振穩定為32M
          CLKCONCMD &= ~0x47;                        //設置系統主時鐘頻率為32MHZ   
         
          InitUart();                                //調用串口初始化函數   
          InitLed();
          UartState = UART0_RX;                      //串口0默認處于接收模式
          memset(RxData, 0, SIZE);
          
          while(1)
          {
            mode_pro(gManageMode);
          }
      }



      編譯成功


      uart8.png


      打開串口調試,仿真全速運行,第一個模式


      uart9.png


      第二個模式


      uart90.png


      第三個模式


      uart91.png


      第一個模式的燈


      uart92.png


      第二個模式的燈


      uart93.png


      第三個模式的燈


      uart94.png


      關閉控制器


      uart95.png


      除了上面的方式以外,你還可以定義其他的方式,比如定義數組,也就是定義一個通訊的格式。比如定義一個頭馬1,頭馬2,len,還有check,中間可以放字節,頭1一般用AA,頭2用55,len右邊的算作字節。在不同的條件下執行什么東西時,就檢查字節等方式判斷。這里不是采用十六進制,而是采用字符串查找,在什么數據里面查什么字符串,不管前后有什么數據,只要查找到beef1,如果是空值,則沒有beef1,如果不是空值,則有beef1,查找到beef1就是第一個模式。同理beef2。如果同時發現beef1和beef2,就會按順序執行,也就是先查找到beef1就會先執行beef1。



      【本文由麥子學院獨家原創,轉載請注明出處并保留原文鏈接】

      logo
      ? 2012-2016 www.www.wq525.com
      蜀ICP備13014270號-4 Version 5.0.0 release20160127

      免費領取價值1888元求職寶典!

      客服熱線 400-862-8862

      回到頂部

      啪啪啪视频1000