亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 基于RS485主從結構通信單片機代碼和proteus仿真 [打印本頁]

作者: 小海夜    時間: 2017-5-30 15:31
標題: 基于RS485主從結構通信單片機代碼和proteus仿真
RS485主從結構通信代碼,用于組網內部通信

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



單片機源程序如下:
  1. #ifndef        _485MON_H                                 // 防止485Mon.h被重復引用
  2. #define        _485MON_H

  3. #include <reg52.h>                            // 引用標準庫的頭文件
  4. #include <stdio.h>
  5. #include <string.h>

  6. #define uchar unsigned char
  7. #define uint unsigned int

  8. #define ACTIVE          0x11
  9. #define GETDATA          0x22
  10. #define READY                  0x33
  11. #define SENDDATA        0x44        

  12. #define RECFRMMAXLEN 16                 // 接收幀的最大長度,超過此值認為幀超長錯誤
  13. #define STATUSMAXLEN 10                        // 設備狀態信息最大長度         

  14. uchar DevNo;                                        // 設備號
  15. xdata uchar StatusBuf[STATUSMAXLEN];

  16. //為簡化起見,假設了10位固定的采集數據
  17. #define DATA0          0x10
  18. #define DATA1          0x20
  19. #define DATA2          0x30
  20. #define DATA3          0x40
  21. #define DATA4          0x50
  22. #define DATA5          0x60
  23. #define DATA6          0x70
  24. #define DATA7          0x80
  25. #define DATA8          0x90
  26. #define DATA9          0xA0
  27. sbit DE = P1^6;                        //驅動器使能,1有效
  28. sbit RE = P1^7;                        //接收器使能,0有效
  29. void init();                                        // 系統初始化
  30. void Get_Stat();                                // 簡化的數據采集函數
  31. bit Recv_Data(uchar *type);                // 接收數據幀函數
  32. void Send(uchar m);                                        // 發送單字節數據
  33. void Send_Data(uchar type,uchar len,uchar *buf);                                // 發送數據幀函數        
  34. void Clr_StatusBuf();                        //  清除設備狀態信息緩沖區函數   
  35. /****************************************/
  36. /* Copyright (c) 2005, 通信工程學院     */
  37. /* All rights reserved.                 */
  38. /****************************************/

  39. #include "485Mon.h"
  40. void main(void)
  41. {
  42.         uchar type;

  43.         /* 初始化 */
  44.         init();
  45.         
  46.         while (1)
  47.         {
  48.                 if (Recv_Data(&type)==0)                        // 接收幀錯誤或者地址不符合,丟棄
  49.                         continue;
  50.                 switch (type)
  51.                 {
  52.                         case ACTIVE:                                // 主機詢問從機是否在位
  53.                                 Send_Data(READY,0,StatusBuf);        // 發送READY指令
  54.                                 break;
  55.                         case GETDATA:                                // 主機讀設備請求
  56.                                 Clr_StatusBuf();
  57.                                 Get_Stat();                                // 數據采集函數
  58.                                 Send_Data(SENDDATA,strlen(StatusBuf),StatusBuf);
  59.                                 break;
  60.                         default:
  61.                                 break;                                        // 指令類型錯誤,丟棄當前幀
  62.                 }
  63.         }
  64. }

  65. /* 初始化 */
  66. void init(void)
  67. {
  68.         P1 = 0xff;
  69.         DevNo = (P1&0x00111111);                        // 讀取本機設備號

  70.         TMOD = 0x20;
  71.         SCON = 0x50;
  72.         TH1 = 0xfd;
  73.         TL1 = 0xfd;
  74.         TR1 = 1;
  75.         PCON = 0x00;                                                // SMOD=0
  76.         EA = 0;
  77.                                                 
  78. }

  79. /* 接收數據幀函數,實際上接收的是主機的指令 */
  80. bit Recv_Data(uchar *type)
  81. {
  82.         uchar tmp,rCount,i;
  83.         uchar r_buf[RECFRMMAXLEN];                        // 保存接收到的幀
  84.         uchar Flag_RecvOver;                                // 一幀接收結束標志        
  85.         uchar Flag_StartRec;                                // 一幀開始接收標志
  86.         uchar CheckSum;                                                // 校驗和
  87.         uchar DataLen;                                                // 數據字節長度變量
  88.                
  89.         /* 禁止發送,允許接收 */
  90.         DE = 0;
  91.         RE = 0;

  92.         /* 接收一幀數據 */
  93.         rCount = 0;
  94.         Flag_StartRec = 0;
  95.     Flag_RecvOver = 0;
  96.         while (!Flag_RecvOver)
  97.         {
  98.                 RI = 0;
  99.                 while (!RI);
  100.                 tmp = SBUF;
  101.                 RI=0;

  102.                 /* 判斷是否收到字符',其數值為0x24 */         
  103.                 if ((!Flag_StartRec) && (tmp == 0x24))
  104.                 {
  105.                         Flag_StartRec = 1;        
  106.                 }

  107.                 if (Flag_StartRec)
  108.                 {
  109.                         r_buf[rCount] = tmp;
  110.                         rCount ++;               
  111.                         
  112.                         /* 判斷是否收到字符'*',其數值為0x2A,根據接收的指令設置相應標志位 */
  113.                         if (tmp == 0x2A)
  114.                                 Flag_RecvOver = 1;
  115.                 }

  116.                 if (rCount == RECFRMMAXLEN)                // 幀超長錯誤,返回0
  117.                         return 0;
  118.         }
  119.         
  120.         /* 計算校驗和字節 */
  121.         CheckSum = 0;
  122.         DataLen = r_buf[3];
  123.         for (i=0;i++;i<3+DataLen)
  124.         {
  125.                 CheckSum = CheckSum + r_buf[i+1];
  126.         }
  127.         
  128.         /* 判斷幀是否錯誤 */
  129.         if (rCount<6)                                                // 幀過短錯誤,返回0,最短的指令幀為6個字節                                                
  130.                 return 0;
  131.         if (r_buf[1]!=DevNo)                                  // 地址不符合,錯誤,返回0
  132.                 return 0;
  133.         if (r_buf[rCount-2]!=CheckSum)                // 校驗錯誤,返回0
  134.             return 0;

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

  136.         return 1;                                                        // 成功,返回1
  137. }

  138. /* 發送數據幀函數 */
  139. void Send_Data(uchar type,uchar len,uchar *buf)
  140. {
  141.         uchar i,tmp;
  142.         uchar CheckSum = 0;
  143.         
  144.         /* 允許發送,禁止接收 */
  145.         DE = 1;
  146.         RE = 1;
  147.         
  148.         /* 發送幀起始字節 */
  149.         tmp = 0x24;
  150.         Send(tmp);
  151.         
  152.         Send(DevNo);                                                // 發送地址字節,也即設備號
  153.         CheckSum = CheckSum + DevNo;

  154.         Send(type);                                                        // 發送類型字節
  155.         CheckSum = CheckSum + type;

  156.         Send(len);                                                        // 發送數據長度字節
  157.         CheckSum = CheckSum + len;

  158.         /* 發送數據 */
  159.         for (i=0;i<len;i++)                        
  160.         {
  161.                 Send(*buf);
  162.                 CheckSum = CheckSum + *buf;
  163.                 buf++;
  164.         }
  165.         
  166.         Send(CheckSum);                                                // 發送校驗和字節

  167.         /* 發送幀結束字節 */
  168.         tmp = 0x2A;
  169.         Send(tmp);
  170. }

  171. /* 采集數據函數經過簡化處理,取固定的10個字節數據 */
  172. void Get_Stat(void)
  173. {
  174.         StatusBuf[0]=DATA0;
  175.         StatusBuf[1]=DATA1;
  176.         StatusBuf[2]=DATA2;
  177.         StatusBuf[3]=DATA3;
  178. ……………………

  179. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
RS485通信程序.rar (72.5 KB, 下載次數: 676)



作者: em78447    時間: 2017-10-25 08:25
謝謝樓主分享
作者: tik8436    時間: 2017-11-7 13:07
謝謝樓主,正需要呢
作者: yayaha    時間: 2018-2-23 15:27
謝謝樓主分享,借鑒下。
作者: acp1234567    時間: 2018-4-4 11:13
謝謝樓主。借鑒中。。。
作者: 榆林上校    時間: 2018-4-9 10:33
謝謝分享!
作者: 榆林上校    時間: 2018-4-9 10:33
謝謝分享!
作者: yanyu1219    時間: 2018-4-16 09:26
這個是如何使用的?
作者: 1278682300    時間: 2018-7-5 20:05
謝謝樓主了哈~
作者: xiubing65    時間: 2018-7-5 21:50
缺少頭文件啊,樓主
作者: cjplc    時間: 2018-7-17 12:31
厲害厲害
作者: bhjyqjs    時間: 2018-7-20 10:08
好東東,謝謝分享!
作者: 啊啊啊12138    時間: 2018-9-29 10:00
正好項目用到,幫助很大
作者: ke丿豬兒    時間: 2018-10-10 09:08
很受益,挺好,
作者: 油炸小4562    時間: 2018-10-10 10:46
謝謝樓主,學習中
作者: 1353408511    時間: 2018-10-10 10:46
謝謝樓主~~!

作者: 1353408511    時間: 2018-10-10 10:54
謝謝樓主分享,借鑒下。
作者: liushui1    時間: 2018-11-9 16:21
正需要,謝謝樓主
作者: 0o平平凡凡o0    時間: 2018-12-18 22:37
樓主,請問下,這個是兩個單片機之間進行通訊嗎?想設計一塊單片機走modbus協議和工控屏通訊,請問proteus中圖應該怎么改進
作者: hf6    時間: 2019-1-14 14:19
樓主怎樣實現的
作者: bruck    時間: 2019-1-28 00:48
好,謝謝提供!
作者: xieelizi    時間: 2019-4-9 08:55
謝謝提供
作者: stc89c52wzy    時間: 2019-4-13 19:22
謝謝分享,感謝
作者: 劉毅    時間: 2019-6-16 10:54
怎么輸入不了
作者: 劉毅    時間: 2019-6-16 10:55
tik8436 發表于 2017-11-7 13:07
謝謝樓主,正需要呢

怎么在軟件上操作啊

作者: canyua    時間: 2020-2-2 14:18
厲害了。能夠完美仿真485,傳輸字符串無壓力。
有點可惜不能傳輸中文。
作者: canyua    時間: 2020-2-2 14:24
缺少的頭文件不影響功能,厲害了,樓主
作者: suph007    時間: 2020-2-28 15:07
寫寫分享 我可以借鑒一下思想了
作者: guguguji    時間: 2020-5-26 10:20
謝謝樓主
作者: wlk1986    時間: 2020-8-15 10:58
有多從機的仿真嗎?
作者: sopanio    時間: 2021-4-14 21:43
怎么實現的呀,實驗現象是什么






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