找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2874|回復: 3
打印 上一主題 下一主題
收起左側(cè)

串口以固定格式發(fā)送信號給51單片機來控制多盞LED亮滅

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:538334 發(fā)表于 2019-10-30 18:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
10黑幣
單片小白剛接觸單片機不久,看見單片機可以通過串口通信來實現(xiàn)控制功能,就想通過串口觸摸屏輸出信號來實現(xiàn)控制多個LED,遂借來一個串口屏進行試驗,發(fā)現(xiàn)串口屏只是輸出了一串數(shù)字(A5 5A 06 83 00 01 01 00 01),查了下串口屏說明,對數(shù)字串做出如下解釋:一二位為幀頭(A5 5A),第三位為字節(jié)長度(06),第四位為讀指令(83),后五位為字節(jié)位(00 01 01 00 01),多開關的話后五位會有所不同以區(qū)分是哪個開關發(fā)出的信號;現(xiàn)本人只能做到串口有信號來只有一個LED亮滅,不知如何寫代碼讓單片機能識別這串數(shù)字來控制不同的LED亮滅,代碼如下,還望各位高手斧正、賜教。

單片機源程序如下:

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

typedef unsigned int u16;                    //定義一些用到的函數(shù)
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()                            //初始化串口數(shù)據(jù)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                           //中斷函數(shù)
{
                            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;
}


最佳答案

查看完整內(nèi)容

給你寫一個串口接收固定長度字符串示例參考,需要按串口屏按鍵的定義修改。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 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.                         //以下需要按自定義協(xié)議解析數(shù)據(jù),這是隨便寫的示范
  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;                //靜態(tài)變量
  45.         RI=0;                                                //接收中斷請求標志位清0
  46.         rec_buf[num]=SBUF;        //接收到的數(shù)據(jù)保存在緩存數(shù)組
  47. //        SBUF=rec_buf[num];        //返回收到的數(shù)據(jù)
  48. //        while(!TI);
  49. //        TI=0;
  50.         if(rec_buf[0]==0xA5)        //驗證數(shù)據(jù)頭第1字節(jié)
  51.         {
  52.                 num++;
  53.                 if(num==2)
  54.                 {
  55.                         if(rec_buf[1]!=0x5A)//驗證數(shù)據(jù)頭第2字節(jié)
  56.                                 num=0;                //否則從第1字節(jié)重新接收字符串
  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
復制代碼

評分

參與人數(shù) 1黑幣 +5 收起 理由
kill_ha_ha + 5 謝謝總工給出的示例,讓我等小白能迅速學習

查看全部評分

回復

使用道具 舉報

板凳
ID:235200 發(fā)表于 2019-10-30 19:34 | 只看該作者
switch(i)
                                      {
                                        Case  ' ?  ':led0=~led0;
                                        case   '  ?  ':led1=~led1;
                                        case   '  ?  ':led2=~led2;
                                        case   '  ? ':led3=~led3;
}
接收到的數(shù)據(jù)不只是一個,應該把所有數(shù)據(jù)都接收完放在一個緩沖區(qū),而且接收緩字區(qū)數(shù)據(jù)前5個字節(jié),剩下的字節(jié)數(shù),每一個字節(jié)去控制一個LED燈,switch語句中的case未區(qū)分不同的數(shù)據(jù)

評分

參與人數(shù) 1黑幣 +5 收起 理由
kill_ha_ha + 5 謝謝總工給出的解決方案

查看全部評分

回復

使用道具 舉報

地板
ID:610681 發(fā)表于 2019-10-30 20:17 | 只看該作者
你好!
要想控制,需要后五位(00 01 01 00 01)數(shù)據(jù)來完成;
串口屏共設定多少個按鍵?每個按鍵的輸出都是什么?

評分

參與人數(shù) 1黑幣 +5 收起 理由
kill_ha_ha + 5 謝謝助工的熱心回答

查看全部評分

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表