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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3869|回復: 1
收起左側

經典的51單片機rs485驅動程序

[復制鏈接]
ID:70481 發表于 2014-12-17 13:56 | 顯示全部樓層 |閱讀模式

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

  4. #define uchar unsigned char
  5. #define uint unsigned int

  6. #define ACTIVE          0x11
  7. #define GETDATA          0x22
  8. #define READY                  0x33
  9. #define SENDDATA        0x44       

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

  12. uchar DevNo;                                        // 設備號
  13. xdata uchar StatusBuf[STATUSMAXLEN];

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

  37. #include "485Mon.h"

  38. void main(void)
  39. {
  40.         uchar type;

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

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

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

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

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

  100.                 /* 判斷是否收到字符'

  101. ,其數值為0x24 */         
  102.                 if ((!Flag_StartRec) && (tmp == 0x24))
  103.                 {
  104.                         Flag_StartRec = 1;       
  105.                 }

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

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

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

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

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

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

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

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

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

  170. /* 采集數據函數經過簡化處理,取固定的10個字節數據 */
  171. void Get_Stat(void)
  172. {
  173.         StatusBuf[0]=DATA0;
  174.         StatusBuf[1]=DATA1;
  175.         StatusBuf[2]=DATA2;
  176.         StatusBuf[3]=DATA3;
  177.         StatusBuf[4]=DATA4;
  178.         StatusBuf[5]=DATA5;
  179.         StatusBuf[6]=DATA6;
  180.         StatusBuf[7]=DATA7;
  181.         StatusBuf[8]=DATA8;
  182.         StatusBuf[9]=DATA9;
  183. }

  184. /* 發送單字節數據 */
  185. void Send(uchar m)
  186. {
  187.         TI = 0;
  188.         SBUF = m;
  189.     while(!TI);
  190.         TI = 0;       
  191. }

  192. /* 清除設備狀態信息緩沖區函數*/
  193. void Clr_StatusBuf(void)
  194. {
  195.         uchar i;
  196.         for (i=0;i<STATUSMAXLEN;i++)
  197.                 StatusBuf[ i] = 0;       
  198. }                       
復制代碼


回復

使用道具 舉報

ID:121374 發表于 2016-5-17 10:41 | 顯示全部樓層
這是放在主機還是從機的程序
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本免费一区二区三区四区 | 欧美成人免费在线 | 久久国产亚洲 | 午夜视频在线免费观看 | 91麻豆精品国产91久久久久久 | 成人精品一区二区三区 | 成人久久久 | 亚洲免费一区二区 | 麻豆一区二区三区精品视频 | 亚洲一区二区三区国产 | 国产精品九九九 | 黄色欧美在线 | 亚洲国产成人精品女人久久久 | 国产成人精品一区二区三区四区 | 国产三区在线观看视频 | 午夜精品一区二区三区在线视 | 精品久久久久久久久久久院品网 | 国产免费又色又爽又黄在线观看 | 欧美精品在线免费 | 亚洲在线成人 | 欧美极品在线观看 | 成人不卡| 久久久www| 成人av色 | 一区二区三区国产好的精 | 亚洲国产精品第一区二区 | 欧美成人第一页 | 特级黄一级播放 | 日本不卡一区二区 | 大乳boobs巨大吃奶挤奶 | 99久久婷婷国产综合精品电影 | 中文字幕一区二区三区四区五区 | 综合国产在线 | www..99re| 91在线精品播放 | 精品中文字幕在线观看 | 91久久久久 | 国产精品久久久久久婷婷天堂 | 一级做a爰片性色毛片16 | 久久久久久网 | av日日操 |