找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8083|回復(fù): 19
打印 上一主題 下一主題
收起左側(cè)

關(guān)于rs485多機(jī)通信系統(tǒng)單片機(jī)源程序仿真與通信協(xié)議等資料

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
這是rs485通信協(xié)議等資料,本人在此共享出來,謝謝



一、RS485基本知識
RS-485接口芯片已廣泛應(yīng)用于工業(yè)控制、儀器、儀表、多媒體網(wǎng)絡(luò)、機(jī)電一體化產(chǎn)品等諸多領(lǐng)域?捎糜赗S-485接口的芯片種類也越來越多。如何在種類繁多的接口芯片中找到最合適的芯片,是擺在每一個(gè)使用者面前的一個(gè)問題。RS-485接口在不同的使用場合,對芯片的要求和使用方法也有所不同。使用者在芯片的選型和電路的設(shè)計(jì)上應(yīng)考慮哪些因素,由于某些芯片的固有特性,通信中有些故障甚至還需要在軟件上作相應(yīng)調(diào)整,如此等等。希望本文對解決RS-485接口的某些常見問題有所幫助。
1 RS-485接口標(biāo)準(zhǔn)
傳輸方式:差分
傳輸介質(zhì):雙絞線
標(biāo)準(zhǔn)節(jié)點(diǎn)數(shù):32
最遠(yuǎn)通信距離:1200m 共模電壓最大、最小值:+12V;-7V
差分輸入范圍:-7V~+12V
接收器輸入靈敏度:±200mV
接收器輸入阻抗:≥12kΩ
2 節(jié)點(diǎn)數(shù)及半雙工和全雙工通信



rs485仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

單片機(jī)源程序如下:
  1.   
  2. /****************************************/
  3. /* Copyright (c) 2017, 通信工程學(xué)院     */
  4. /* All rights reserved.                 */
  5. /****************************************/

  6. #include "RS485.h"

  7. //主函數(shù)
  8. void main(void)
  9. {
  10.         uchar type;

  11.         Init();//初始化
  12.         
  13.         while (1)
  14.         {
  15.                 if (RecvData(&type)==0)                        // 接收幀錯(cuò)誤或者地址不符合,丟棄
  16.                         continue;
  17.                
  18.                 switch (type)
  19.                 {
  20.                         case ACTIVE:                                // 主機(jī)詢問從機(jī)是否在位
  21.                                 SendData(READY,0,StatusBuf);        // 發(fā)送READY指令
  22.                                 break;
  23.                         case GETDATA:                                // 主機(jī)讀設(shè)備請求
  24.                                 ClrStatusBuf();
  25.                                 GetStat();                                // 數(shù)據(jù)采集函數(shù)
  26.                                 SendData(SENDDATA,strlen(StatusBuf),StatusBuf);
  27.                                 break;
  28.                         default:
  29.                                 break;                                        // 指令類型錯(cuò)誤,丟棄當(dāng)前幀
  30.                 }
  31.         }
  32. }




  33. //初始化
  34. void Init(void)
  35. {
  36.         P1 = 0xFF;
  37.         DevNo = (P1&0x00111111);                        // 讀取本機(jī)設(shè)備號

  38.         TMOD = 0x20;//定時(shí)器T1,工作方式2,自動重裝
  39.         SCON = 0x50;//串口通信工作方式1,允許接收
  40.         TH1 = 0xFD;//波特率9600
  41.         TL1 = 0xFD;
  42.         TR1 = 1;
  43.         PCON = 0x00;// SMOD=0,波特率不加倍
  44.         EA = 0;
  45.                                                 
  46. }

  47. //接收數(shù)據(jù)幀函數(shù),實(shí)際上接收的是主機(jī)的指令
  48. //*type指令類型
  49. bit RecvData(uchar *type)
  50. {
  51.         uchar tmp,rCount,i;
  52.         uchar r_buf[RECFRMMAXLEN];                        // 保存接收到的幀
  53.         uchar FlagRecvOver;                                // 一幀接收結(jié)束標(biāo)志        
  54.         uchar FlagStartRec;                                // 一幀開始接收標(biāo)志
  55.         uchar CheckSum;                                                // 校驗(yàn)和
  56.         uchar DataLen;                                                // 數(shù)據(jù)字節(jié)長度變量
  57.                
  58.         //禁止發(fā)送,允許接收
  59.         DE = 0;
  60.         RE = 0;

  61.         //接收一幀數(shù)據(jù)
  62.         rCount = 0;
  63.         FlagStartRec = 0;
  64.   FlagRecvOver = 0;
  65.         
  66.         while (!FlagRecvOver)
  67.         {
  68.                 RI = 0;
  69.                 while (!RI);
  70.                 tmp = SBUF;
  71.                 RI=0;

  72. …………
  73. …………限于本文篇幅 余下代碼請從51黑下載附件…………
  74. ,其數(shù)值為0x24         
  75.                 if ((!FlagStartRec) && (tmp == 0x24))
  76.                 {
  77.                         FlagStartRec = 1;        
  78.                 }

  79.                 if (FlagStartRec)
  80.                 {
  81.                         r_buf[rCount] = tmp;
  82.                         rCount ++;               
  83.                         
  84.                         //判斷是否收到字符'*',其數(shù)值為0x2A,根據(jù)接收的指令設(shè)置相應(yīng)標(biāo)志位
  85.                         if (tmp == 0x2A)
  86.                                 FlagRecvOver = 1;
  87.                 }

  88.                 if (rCount == RECFRMMAXLEN)                // 幀超長錯(cuò)誤,返回0
  89.                         return 0;
  90.         }
  91.         
  92.         //計(jì)算校驗(yàn)和字節(jié)
  93.         CheckSum = 0;
  94.         DataLen = r_buf[3];
  95.         
  96.         for (i=0;i<3+DataLen;i++)
  97.         {
  98.                 CheckSum = CheckSum + r_buf[i+1];
  99.         }
  100.         
  101.         //判斷幀是否錯(cuò)誤
  102.         if (rCount<6)                                                // 幀過短錯(cuò)誤,返回0,最短的指令幀為6個(gè)字節(jié)                                                
  103.                 return 0;
  104.         
  105.         if (r_buf[1]!=DevNo)                                  // 地址不符合,錯(cuò)誤,返回0
  106.                 return 0;
  107.         
  108.         if (r_buf[rCount-2]!=CheckSum)                // 校驗(yàn)錯(cuò)誤,返回0
  109.             return 0;

  110.         *type = r_buf[2];                                        // 獲取指令類型

  111.         return 1;                                                        // 成功,返回1
  112. }


  113. //發(fā)送數(shù)據(jù)幀函數(shù)
  114. //type數(shù)據(jù)類型,len數(shù)據(jù)長度,*buf數(shù)據(jù)
  115. void SendData(uchar type,uchar len,uchar *buf)
  116. {
  117.         uchar i,tmp;
  118.         uchar CheckSum = 0;
  119.         
  120.         //允許發(fā)送,禁止接收
  121.         DE = 1;
  122.         RE = 1;
  123.         
  124.         //發(fā)送幀起始字節(jié)
  125.         tmp = 0x24;
  126.         Send(tmp);
  127.         
  128.         Send(DevNo);// 發(fā)送地址字節(jié),也即設(shè)備號
  129.         CheckSum = CheckSum + DevNo;

  130.         Send(type);                                                        // 發(fā)送類型字節(jié)
  131.         CheckSum = CheckSum + type;

  132.         Send(len);                                                        // 發(fā)送數(shù)據(jù)長度字節(jié)
  133.         CheckSum = CheckSum + len;

  134.         //發(fā)送數(shù)據(jù)
  135.         for (i=0;i<len;i++)                        
  136.         {
  137.                 Send(*buf);
  138.                 CheckSum = CheckSum + *buf;
  139.                 buf++;
  140.         }
  141.         
  142.         Send(CheckSum);// 發(fā)送校驗(yàn)和字節(jié)

  143.         //發(fā)送幀結(jié)束字節(jié)
  144.         tmp = 0x2A;
  145.         Send(tmp);
  146. }

  147. //采集數(shù)據(jù)函數(shù)經(jīng)過簡化處理,取固定的10個(gè)字節(jié)數(shù)據(jù)
  148. void GetStat(void)
  149. {
  150.         StatusBuf[0]=DATA0;
  151.         StatusBuf[1]=DATA1;
  152.         StatusBuf[2]=DATA2;
  153.         StatusBuf[3]=DATA3;
  154.         StatusBuf[4]=DATA4;
  155.         StatusBuf[5]=DATA5;
  156.         StatusBuf[6]=DATA6;
  157. ……………………

  158. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
RS485通信協(xié)議及程序.zip (1.41 MB, 下載次數(shù): 307)




評分

參與人數(shù) 2黑幣 +7 收起 理由
zalkaer + 5 很給力!
切了 + 2 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏6 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:25103 發(fā)表于 2018-1-5 21:15 | 只看該作者
感謝分享,謝謝!
回復(fù)

使用道具 舉報(bào)

板凳
ID:269447 發(fā)表于 2018-1-6 12:24 | 只看該作者
485通訊,工控通訊主流
回復(fù)

使用道具 舉報(bào)

地板
ID:340513 發(fā)表于 2018-6-7 19:11 | 只看該作者
這個(gè)按鍵控制要顯示的字符嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:274020 發(fā)表于 2018-6-26 10:57 | 只看該作者
兩個(gè)從機(jī)的程序都是一樣的嗎
回復(fù)

使用道具 舉報(bào)

6#
ID:274020 發(fā)表于 2018-6-26 18:05 | 只看該作者
還有那個(gè)通信協(xié)議有哪位大佬講解一下嗎。。
回復(fù)

使用道具 舉報(bào)

7#
ID:274020 發(fā)表于 2018-6-26 18:17 | 只看該作者
或者數(shù)據(jù)包格式啊。。
回復(fù)

使用道具 舉報(bào)

8#
ID:301544 發(fā)表于 2018-7-4 21:49 | 只看該作者
不錯(cuò),是RTU嗎
回復(fù)

使用道具 舉報(bào)

9#
ID:379934 發(fā)表于 2018-7-27 21:09 | 只看該作者
感謝分享,謝謝!
回復(fù)

使用道具 舉報(bào)

10#
ID:424422 發(fā)表于 2018-11-11 11:47 | 只看該作者
感謝分享,謝謝!
回復(fù)

使用道具 舉報(bào)

11#
ID:92810 發(fā)表于 2018-11-12 15:18 | 只看該作者
謝謝分享了。。學(xué)習(xí)學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

12#
ID:214223 發(fā)表于 2018-11-20 13:48 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

13#
ID:434040 發(fā)表于 2018-11-27 11:11 | 只看該作者
正好在學(xué)習(xí)
回復(fù)

使用道具 舉報(bào)

14#
ID:63210 發(fā)表于 2019-1-11 13:02 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

15#
ID:431591 發(fā)表于 2019-3-16 10:04 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

16#
ID:535790 發(fā)表于 2019-5-12 02:25 | 只看該作者
學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

17#
ID:425919 發(fā)表于 2019-5-12 11:23 | 只看該作者
努力學(xué)習(xí)中。
回復(fù)

使用道具 舉報(bào)

18#
ID:487615 發(fā)表于 2019-5-16 13:47 | 只看該作者
謝謝分享
回復(fù)

使用道具 舉報(bào)

19#
ID:557020 發(fā)表于 2019-6-7 09:21 | 只看該作者
謝謝樓主
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表