久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2868|回復: 3
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:538334 發表于 2019-10-30 18:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
10黑幣
單片小白剛接觸單片機不久,看見單片機可以通過串口通信來實現控制功能,就想通過串口觸摸屏輸出信號來實現控制多個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;
}


最佳答案

查看完整內容

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

使用道具 舉報

沙發
ID:213173 發表于 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
復制代碼

評分

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

查看全部評分

回復

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

評分

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

查看全部評分

回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: av香蕉| 国产日产精品一区二区三区四区 | 免费的色网站 | 91精品国产91久久久久久三级 | 91看片免费 | 日日碰狠狠躁久久躁婷婷 | 国产japanhdxxxx麻豆 | 久久综合久久自在自线精品自 | 超碰超碰| 国产视频1| 免费小视频在线观看 | 国产欧美综合在线 | 二区视频 | 国产精品视频一区二区三区四蜜臂 | 日韩av一区在线观看 | 一级日韩| 一区精品视频 | 欧美日韩一区精品 | 久久精品亚洲国产奇米99 | 羞羞视频网站 | 99久久婷婷国产综合精品电影 | 自拍偷拍在线视频 | 亚洲在线中文字幕 | 一区二区三区日韩 | 久久丁香 | 国产欧美一区二区三区日本久久久 | 中文字幕二区三区 | 久久九精品 | 亚洲精品视频免费看 | 九色一区| 一区二区手机在线 | 夏同学福利网 | 欧美日韩三区 | 不卡视频一区二区三区 | 18成人在线观看 | 91av视频在线 | 亚洲精品久久久一区二区三区 | 喷水毛片 | 亚洲视频精品 | 欧美激情一区二区三区 | 日韩av一区二区在线 |