欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 串口以固定格式發送信號給51單片機來控制多盞LED亮滅 [打印本頁]

作者: kill_ha_ha    時間: 2019-10-30 18:03
標題: 串口以固定格式發送信號給51單片機來控制多盞LED亮滅
單片小白剛接觸單片機不久,看見單片機可以通過串口通信來實現控制功能,就想通過串口觸摸屏輸出信號來實現控制多個LED,遂借來一個串口屏進行試驗,發現串口屏只是輸出了一串數字(A5 5A 06 83 00 01 01 00 01),查了下串口屏說明,對數字串做出如下解釋:一二位為幀頭(A5 5A),第三位為字節長度(06),第四位為讀指令(83),后五位為字節位(00 01 01 00 01),多開關的話后五位會有所不同以區分是哪個開關發出的信號;現本人只能做到串口有信號來只有一個LED亮滅,不知如何寫代碼讓單片機能識別這串數字來控制不同的LED亮滅,代碼如下,還望各位高手斧正、賜教。

單片機源程序如下:

#include <reg52.h>                               //載入頭文件

typedef unsigned int u16;                    //定義一些用到的函數
typedef unsigned char u8;
uchar i;

sbit led0=P0^0;                                                //定義LED管腳
sbit led1=P0^1;
sbit led2=P0^2;
sbit led3=P0^3;

void UsartInit()                            //初始化串口數據9600
{
   TMOD = 0x20;
   SCON = 0x50;
   TH1 = TL1 = 0xFD;
   PCON = 0x00;
   EA = 1;
   ES = 1;
   TR1 = 1;
}

void main()                                            
{
                   led0=0;                                            
                   led1=0;
                   led2=0;
                   led3=0;
               UsartInit();                           
                   while(1);
}

void Usart() interrupt 4                           //中斷函數
{
                            u8receiveData;
                            i=SBUF;
                                     switch(i)
                                      {
                                        Case  ' ?  ':led0=~led0;
                                        case   '  ?  ':led1=~led1;
                                        case   '  ?  ':led2=~led2;
                                        case   '  ? ':led3=~led3;
                                      }
                            receiveData=SBUF;
                            RI=0;
                            SBUF=receiveData;
                            while(!TI);
                            TI=0;
}



作者: wulin    時間: 2019-10-30 18:04
給你寫一個串口接收固定長度字符串示例參考,需要按串口屏按鍵的定義修改。
  1. #include <reg51.h>

  2. typedef unsigned char u8;
  3. typedef unsigned int u16;

  4. sbit led0=P1^0;
  5. sbit led1=P1^1;
  6. sbit led2=P1^2;
  7. sbit led3=P1^3;

  8. u8 rec_buf[9];
  9. bit flag=0;

  10. void InitUART()
  11. {
  12.     TMOD = 0x20;
  13.     SCON = 0x50;
  14.     TH1 = 0xFA;
  15.     TL1 = TH1;
  16.     PCON = 0x80;
  17.     EA = 1;
  18.     ES = 1;
  19.     TR1 = 1;
  20. }
  21. void main()
  22. {
  23.         u8 i;
  24.         InitUART();
  25.         while(1)
  26.         {
  27.                 if(flag==1)
  28.                 {
  29.                         flag=0;
  30.                         //以下需要按自定義協議解析數據,這是隨便寫的示范
  31.                         i=rec_buf[4]+rec_buf[5]+rec_buf[6]+rec_buf[7]+rec_buf[8];
  32.                         switch(i)
  33.                         {
  34.                                 case 0:led0=~led0;break;
  35.                                 case 1:led1=~led1;break;
  36.                                 case 2:led2=~led2;break;
  37.                                 case 3:led3=~led3;break;
  38.                         }       
  39.                 }
  40.         }
  41. }

  42. void UARTInterrupt() interrupt 4
  43. {
  44.         static u8 num=0;                //靜態變量
  45.         RI=0;                                                //接收中斷請求標志位清0
  46.         rec_buf[num]=SBUF;        //接收到的數據保存在緩存數組
  47. //        SBUF=rec_buf[num];        //返回收到的數據
  48. //        while(!TI);
  49. //        TI=0;
  50.         if(rec_buf[0]==0xA5)        //驗證數據頭第1字節
  51.         {
  52.                 num++;
  53.                 if(num==2)
  54.                 {
  55.                         if(rec_buf[1]!=0x5A)//驗證數據頭第2字節
  56.                                 num=0;                //否則從第1字節重新接收字符串
  57.                 }
  58.                 if(num>=9)
  59.                 {
  60.                         flag=1;                        //接收完成標志置1
  61.                         num=0;
  62.                 }
  63.         }
  64. }
  65. //A5 5A 06 83 00 01 01 00 01
復制代碼


作者: csmyldl    時間: 2019-10-30 19:34
switch(i)
                                      {
                                        Case  ' ?  ':led0=~led0;
                                        case   '  ?  ':led1=~led1;
                                        case   '  ?  ':led2=~led2;
                                        case   '  ? ':led3=~led3;
}
接收到的數據不只是一個,應該把所有數據都接收完放在一個緩沖區,而且接收緩字區數據前5個字節,剩下的字節數,每一個字節去控制一個LED燈,switch語句中的case未區分不同的數據
作者: 來51學習的    時間: 2019-10-30 20:17
你好!
要想控制,需要后五位(00 01 01 00 01)數據來完成;
串口屏共設定多少個按鍵?每個按鍵的輸出都是什么?




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1