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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8192|回復: 14
收起左側

STC8單片機ADC采集modbus RTU0306源程序 完美連接MCGS觸摸屏顯示 無私分享

  [復制鏈接]
ID:806411 發表于 2021-1-22 19:42 | 顯示全部樓層 |閱讀模式
無私開源

單片機源程序如下:
  1. //#include <reg52.h> //頭文件不能雙重包含否則全盤錯誤(此處不刪除謹記)
  2. #include "modbus06.h"
  3. #include <string.h>
  4. #include <intrins.h>
  5. #include        "STC15Fxxxx.H"
  6. #include "ADC.H"
  7. #define uint8 unsigned char
  8. #define uint16 unsigned int

  9. sbit led=P1^0;//暫時測試使用

  10. sbit led2=P1^2;
  11. sbit led3=P1^3;
  12. char buf_string[8];  //定義數據包長度為15個字符
  13.         uint16 dzbl;//取06地址
  14.         uint16 xrz;//取寫入寄存器地址的值

  15. /*定義成unsigned char類型可以顯示足夠大的數據,不然會出現錯誤*/
  16. uint8 receBuf[40];// 詢問數據包 此處記住因為詢問數據包都是8位 所以可以給數組規定元素數量
  17. uint8 sendBuf[40];// 響應數據包   相應數據包 嚴雨在此 規定最多連所以數據在內 最多20個元素
  18. uint16 BAUD=9600;
  19. uint16 TEMP_Alert=1000;
  20. uint16  TempRegister; //用于測試 字址址16
  21. uint8 gnmbl=7;//功能碼變量
  22. uint8 localAddr = 0x01; //單片機控制板的地址
  23. uint8 sendCount;  //發送字節個數 發送函數中決定發送字節個數
  24. uint8 receCount=25;    //接收到的字節個數
  25. //uint8 sendPosi;    //發送位置
  26. void checkComm0Modbus(void);//查詢uart接收的數據包內容函數
  27. uint16 getRegisterVal(uint16 addr,uint16 *tempData);//讀取寄存器內容函數
  28. uint16 adc;
  29. uint16 adc_001;


  30. //串口發送函數
  31. /*void PutString(unsigned char *TXStr,unsigned char len)  //挨個字節發送需要給變量定義成char類型
  32. {               
  33.     ES=0;    //關閉串口中斷
  34.      while(len--)
  35.     {                     
  36.         SBUF=*TXStr;//指針指向地址上面的值 賦 給 SBUF
  37.         while(TI==0);
  38.         TI=0;   
  39.         TXStr++;//地址+1
  40.     }
  41.     ES=1; //打開串口中斷
  42. }*/                                                     
  43. //串口接收函數
  44. bit ReceiveString()   
  45. {
  46.           
  47.     char * RecStr=receBuf;//給這個地址賦一個變量名
  48.     char num=0;
  49.     unsigned char count=0;
  50. loop:
  51.                        //接收到一位數據馬上存入這個地址
  52.     *RecStr=SBUF;//假設SBUF里面的值是一位一位發來,每一次都存入這個地址
  53.     RI=0;
  54.     count=0;

  55.     if(num<gnmbl)  //gnmbl數據長度變量,根據每一次接收到的數據進行變化,嘗試連續接收15個字符 03=7 16=10
  56.     {
  57.         num++;
  58.         RecStr++;
  59.                      
  60.         while(!RI)
  61.         {
  62.             count++;
  63.             if(count>1592)return 0;    //接收數據等待延遲,等待時間太久會導致CPU運算閑置,太短會出現"數據包被分割",默認count=130
  64.         }       //由于stc15系列比89c52運行速度快 所以循環次數增加10倍  1300
  65.         goto loop;
  66.     }
  67.     return 1;
  68.                 }

  69. //定時器1用作波特率發生器
  70. void Init_USART()  
  71. {

  72.         PCON &= 0x3f;                //波特率不倍速,串行口工作方式由SM0、SM1決定
  73.         SCON = 0x50;                //8位數據,可變波特率,啟動串行接收器
  74.         AUXR |= 0x40;                //定時器1時鐘為Fosc,即1T
  75.         AUXR &= 0xfe;                //串口1選擇定時器1為波特率發生器
  76.         TMOD &= 0x0f;                //清除定時器1模式位
  77.         TMOD |= 0x20;                //設定定時器1為8位自動重裝方式
  78.         TL1 = 0xDC;                  //設定定時初值
  79.         TH1 = 0xDC;                  //設定定時器重裝值
  80.         ET1 = 0;                    //禁止定時器1中斷
  81.         TR1 = 1;                    //啟動定時器1
  82.         ES = 1;                                       // 串口1中斷打開
  83.         EA = 1;  
  84.        
  85. }

  86. /* CRC 高位字節值表 */
  87. /*const*/ uint8 code auchCRCHi[] = {
  88. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0/**/,
  89. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  90. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  91. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  92. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  93. 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
  94. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  95. 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  96. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  97. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  98. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  99. 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  100. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  101. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  102. 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  103. 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
  104. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  105. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  106. 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  107. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  108. 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,
  109. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
  110. 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,
  111. 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
  112. 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,
  113. 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
  114. } ;
  115. /* CRC低位字節值表*/
  116. /*const*/ uint8 code auchCRCLo[] = {
  117. 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06/**/,
  118. 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
  119. 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,                  
  120. 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
  121. 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,
  122. 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
  123. 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,
  124. 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
  125. 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,
  126. 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
  127. 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,
  128. 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
  129. 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,
  130. 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
  131. 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,
  132. 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
  133. 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,
  134. 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
  135. 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,
  136. 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
  137. 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
  138. 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
  139. 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,
  140. 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
  141. 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,
  142. 0x43, 0x83, 0x41, 0x81, 0x80, 0x40
  143. } ;
  144. /***************************CRC校驗碼生成函數 ********************************/
  145. //函數功能:生成CRC校驗碼
  146. //本代碼中使用查表法,以提高運算速度
  147. /****************************************************************************/
  148. uint16 crc16(uint8 *puchMsg, uint16 usDataLen) //定義了recebuf首地址 和一個 5
  149. {
  150. uint8 uchCRCHi = 0xFF ; /* 高CRC字節初始化 */
  151. uint8 uchCRCLo = 0xFF ; /* 低CRC 字節初始化 */
  152. uint16 uIndex ; /* CRC循環中的索引 */
  153. while (usDataLen--) /* 傳輸消息緩沖區 */
  154. { /* 計算CRC */
  155.   uIndex = uchCRCHi ^ *puchMsg++ ;//CRC 通用算法
  156.   uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ; //
  157.   uchCRCLo = auchCRCLo[uIndex] ; //
  158. }
  159. return (uchCRCLo << 8 | uchCRCHi) ;
  160. }
  161. /*******************************串口發送函數 ********************************/
  162. //函數功能:將數據包通過串口發送至主機
  163. //有待修改......
  164. /****************************************************************************/
  165. //開始發送
  166. void Begin_send(void)
  167. {
  168. uint16 i=0;
  169.         ES=0;    //關閉串口中斷
  170. while(sendCount--)
  171. {
  172.   SBUF = sendBuf[i++];// 響應數據包發送
  173.   while(!TI);         //發送中斷標志位
  174.         TI=0;
  175. }
  176. ES=1; //打開串口中斷
  177. }
  178. /********從機響應主機問詢函數,function code : 03,讀取多個寄存器值 ********/
  179. //函數功能:叢機根據串口接收到的數據包receBuf[]里面的內容,根據被讀取寄存器
  180. //的起始地址和讀取的寄存器個數,去讀相應的寄存器的值,并將讀取的數據以MODBUS
  181. //響應數據的標準格式打包,經過串口發送到主機。數據包格式同上。
  182. /****************************************************************************/
  183. // 詢問數據包格式:
  184. //receBuf[0] receBuf[1]  receBuf[2]     receBuf[3]   receBuf[4]       receBuf[5]    receBuf[6]   receBuf[7]
  185. //詢問數據格式:receBuf[]={從站地址, 功能碼,  起始地址高位,起始地址低位,寄存器數高位,   寄存器數低位, 校驗碼低位, 校驗碼高位}

  186. // 響應數據包格式:
  187. // sendBuf[0] sendBuf[1]  sendBuf[[2]    sendBuf[3]  sendBuf[4]  sendBuf[5]...    receBuf[6]   receBuf[7]
  188. //響應數據格式:receBuf[]={從站地址, 功能碼,    字節計數,      數據1,    數據2,     數據3,...      校驗碼低位, 校驗碼高位}

  189. void readRegisters(void)
  190. {
  191.         uint8 addr;        //起始地址復制轉換變量
  192.         uint8 tempAddr;    //起始地址轉換變量
  193.         uint16 crcData;    //crc 校驗碼生成變量
  194.         uint8 readCount;   //寄存器數復制變量
  195.         uint8 byteCount;   //數據個數變量
  196.         uint16 i;          //循環變量
  197.         uint16 tempData = 0;

  198.         //addr = (receBuf[2]<<8) + receBuf[3];
  199.         //tempAddr = addr & 0xfff;
  200.         addr = receBuf[3];                //相當于復制發送來的起始地址低位0
  201.         tempAddr = addr;//tempAddr =起始地址地位 00

  202.         //readCount = (receBuf[4]<<8) + receBuf[5]; //要讀的個數
  203.         readCount = receBuf[5];          //相當于復制發送來寄存器數低位  02

  204.         byteCount = readCount * 2;//byteCount = 寄存器數 X 2    02 每個寄存器內容占高,低兩個字節2

  205.         for(i=0;i<byteCount;i+=2,tempAddr++)
  206.         {
  207.                 getRegisterVal(tempAddr,&tempData);  //0 0&tempData 等于給出tempData變量的地址 讀取寄存器內容函 函數功能:根據寄存器地址讀取相應寄存器內容?  
  208.                 sendBuf[i+3] = tempData >> 8;        
  209.                 sendBuf[i+4] = tempData & 0xff;  
  210.         }

  211.         sendBuf[0] = localAddr;//單片機控制板的地址
  212.         sendBuf[1] = 3;  //功能碼: 03
  213.         sendBuf[2] = byteCount;//2此次賦值發送數據個數
  214.         byteCount += 3;             //=5加上前面的地址,功能碼,地址 共3+byteCount個字節
  215.         crcData = crc16(sendBuf,byteCount);
  216.         sendBuf[byteCount] = crcData & 0xff;   // CRC代碼低位在前7
  217.         byteCount++;
  218.         sendBuf[byteCount] = crcData >> 8 ;           //高位在后8

  219.         sendCount = byteCount + 1;                        //例如byteCount=49,則sendBuf[]中實際上有49+1個元素待發
  220.         Begin_send();              //調用發送函數把計算出來的數據發送出去
  221. }//void readRegisters(void)
  222. /*************************查詢uart接收的數據包內容函數 **************************/
  223. //函數功能:叢機根據串口接收到的數據包receBuf[1]里面的內容,即function code執行
  224. //相應的命令
  225. /********************************************************************************/
  226. void checkComm0Modbus(void)//查詢uart接收的數據包內容函數
  227. {
  228. uint16 crcData;      //取CRC校驗碼變量
  229. uint16 ccc; //ccc判斷CRC校驗碼變量
  230. //tempData,

  231. receCount=25;        //比較多余
  232. if(receCount > 4)    //接收到的字節個數
  233. {
  234.   switch(receBuf[1])
  235.   {
  236.    case 3:                      //讀取保持寄存器(一個或多個)
  237.    {led=0;
  238.                  gnmbl=7;                 //功能碼03循環次數固定7次,接收函數中判?
  239.                  
  240.                                   
  241.     if(receCount >= 8)          //從詢問數據包格式可知,receCount應該等于8
  242.     {                           //接收完成一組數據
  243.                                 //應該關閉接收中斷
  244.       
  245.       if(receBuf[0]==localAddr)                //核對地址
  246.       {led2=0;
  247.       crcData = crc16(receBuf,6);                                       //核對校驗碼
  248.                         ccc=receBuf[7]<<8 | receBuf[6];          //CRC校驗碼 是兩個16進制8位二進制數
  249.       if(crcData == ccc)                       //如果校驗碼正確 執行讀寄存器函數
  250.                         { led3=0;
  251.         if(receBuf[1] == 3)
  252.         readRegisters();                        //function code : 03?//讀取保持寄存器(一個或多個)
  253.       }
  254.                        
  255.       }
  256.     }      
  257.       receCount = 0;
  258.           break;
  259.    }
  260.          case 6:
  261.          {
  262.                  gnmbl=7;

  263.       crcData = crc16(receBuf,6);                                       //核對校驗碼
  264.                         ccc=receBuf[7]<<8 | receBuf[6];
  265.                  if(crcData == ccc)                       //如果校驗碼正確 執行讀寄存器函數
  266.                  {dzbl=receBuf[2]<<8 | receBuf[3];//取寄存器地址
  267.                  xrz=receBuf[4]<<8 | receBuf[5];//取寫入值
  268.                  modbusRTU06(&dzbl,&xrz);}//取dzbl和xrz 的地址 并被此函數調用
  269.                  sendBuf[0] = localAddr;
  270.                  sendBuf[1] = 0x06;
  271.                  sendBuf[2] = receBuf[2];
  272.                  sendBuf[3] = receBuf[3];
  273.                  sendBuf[4] = receBuf[4];
  274.                  sendBuf[5] = receBuf[5];
  275.                  sendBuf[6] = receBuf[6];
  276.                  sendBuf[7] = receBuf[7];
  277.                  sendCount = 8;
  278.      Begin_send();
  279.                  receCount = 0;
  280.                  break;
  281.    }
  282.    

  283.   default: break;  
  284.   }
  285. }
  286. }//void checkComm0(void)



  287. /*******************************讀取寄存器內容函數 **************************/
  288. //函數功能:根據寄存器地址讀取相應寄存器內容
  289. /****************************************************************************/
  290. //取寄存器值 返回0表示成功
  291. uint16 getRegisterVal(uint16 addr,uint16 *tempData)
  292. {
  293. uint16 result = 0;
  294. uint8 qq=0xff;
  295. uint16 tempAddr;

  296. tempAddr = addr & 0xfff;

  297. switch(tempAddr & 0xff)
  298. {
  299. case 0x00:{ *tempData = adc; break; }//讀取01開關A溫度

  300. 省略
  301. 省略
  302. 省略

  303. case 0x80:{ *tempData = TempRegister; break; }//讀取秒寄存器  
  304. default:  break;  
  305. }
  306. return result;
  307. }//uint16 getRegisterVal(uint16 addr,uint16 &data)

  308. /***************************
  309.         主函數
  310. ***************************/
  311. void main()
  312. {
  313.         unsigned int        TempPhoto,adc_01;       
  314.        
  315.         /*進入主函數打開串口中斷,然后初始化一次,發送一組數據,然后進入空循環*/
  316.     EA=1;
  317.     Init_USART();
  318. P3M1 &= 0xFE;        P3M0 &= 0xFE;                          //設置P3.0為準雙向口
  319.         P3M1 &= 0xFD;        P3M0 |= 0x02;                          //設置P3.1為推挽輸出
  320.        
  321.           //ADC_config();                                 //ADC初始化  如果只調用一個AD端口可以使用初始化,避免反復開關AD寄存器
  322.         delay_ms(10);                                 //初始化后延時
  323.         //PutString("ABCDEFGHRJKLNMOPQRSTUVWXYZ\r\n",sizeof("ABCDEFGHRJKLNMOPQRSTUVWXYZ\r\n"));//測試發送函數,我的keil沒破解代碼量已超
  324.     while(1)
  325.     {
  326.                         TempPhoto=0;
  327.                         adc_01=0;
  328.                         delay_ms(20);
  329.                        
  330.                         //ADC_config();
  331.                         TempPhoto = Get_ADC12bitResult()*123/2004;                //實時讀取P0.6通道的AD轉換結果
  332.                         adc=TempPhoto;
  333.                         delay_ms(200);
  334.                        
  335.                         adc_01=adc_p01()*123/2004;
  336.                         adc_001=adc_01;
  337.             delay_ms(200);
  338.                         //空循環中如果接收到串口數據,立馬進入串口中斷程序
  339.         //PutString(buf_string);//空格20H,回車0DH
  340.                
  341.         
  342.     }
  343. }
  344. /************************
  345.         中斷函數
  346. ************************/
  347. //串口中斷服務函數-----------
  348. void USART() interrupt 4   //標志位TI和RI需要手動復位,TI和RI置位共用一個中斷入口
  349. {
  350.     if(ReceiveString())   //進入串口中斷首先進入串口接收函數進行判斷
  351.     {
  352.         //數據包長度正確則執行以下代碼
  353.         //Deal_UART_RecData();
  354.        
  355.        
  356. checkComm0Modbus();}                       
  357.    
  358.     else
  359.     {
  360.         //數據包長度錯誤則執行以下代碼
  361.         //LED1=~LED1;               
  362.     }
  363.     RI=0;  //接收并處理一次數據后把接收中斷標志清除一下,拒絕響應在中斷接收忙的時候發來的請求
  364. }
復制代碼
51hei.png
所有程序51hei提供下載:
stc8 ADC兩路采集modbus0306從機程序20201224更新.rar (89.13 KB, 下載次數: 405)

評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

回復

使用道具 舉報

ID:811405 發表于 2021-1-27 10:55 | 顯示全部樓層
能說一下屏幕上怎么設置嗎?
回復

使用道具 舉報

ID:250631 發表于 2021-1-28 08:20 | 顯示全部樓層
正需要這方面的例程,感謝樓主無私分享,。已下載,認真學習研究一下。
回復

使用道具 舉報

ID:811405 發表于 2021-1-30 16:01 | 顯示全部樓層
大神,能說一下MCGS觸摸屏要怎么寫程序
回復

使用道具 舉報

ID:806411 發表于 2021-1-30 19:01 | 顯示全部樓層
觸摸屏的資料網上大把,還有官方的。這是我研究一個月的成果,感謝大家贊賞
回復

使用道具 舉報

ID:250631 發表于 2021-4-7 09:36 | 顯示全部樓層
感謝樓主無私開源
回復

使用道具 舉報

ID:316832 發表于 2021-4-28 12:42 | 顯示全部樓層
感謝樓主無私開源
回復

使用道具 舉報

ID:53164 發表于 2021-6-10 19:38 | 顯示全部樓層
感謝樓主無私開源
回復

使用道具 舉報

ID:239443 發表于 2021-6-10 23:14 | 顯示全部樓層

感謝樓主無私奉獻!
回復

使用道具 舉報

ID:334781 發表于 2022-4-30 14:50 | 顯示全部樓層
感謝樓主無私奉獻,Modbus 通信對我來說一直是搞不明白,有這個實例,認真研究一下。
回復

使用道具 舉報

ID:32962 發表于 2022-5-19 04:33 | 顯示全部樓層


感謝樓主無私奉獻!
串口采集數據,再Modbus RTU 傳出,不知怎么寫代碼?能指點下不?
回復

使用道具 舉報

ID:334781 發表于 2023-9-8 17:31 | 顯示全部樓層
謝謝樓主,這方面的資料不多,學習一下。
回復

使用道具 舉報

ID:933601 發表于 2023-11-9 20:25 | 顯示全部樓層
感謝樓主無私開源
回復

使用道具 舉報

ID:636442 發表于 2024-1-4 22:49 | 顯示全部樓層
收集485資料,學習學習。感謝分享!!!!!!
回復

使用道具 舉報

ID:636442 發表于 2024-1-5 02:20 | 顯示全部樓層
感謝資料分享,

在STC15W上測試可用

//USART() interrupt 4---checkComm0Modbus()---readRegisters()---getRegisterVal()----adc_001
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 成人性视频在线 | 亚洲a视频 | 欧美精品91| 久草日韩| 国产日韩欧美激情 | 亚洲一区国产精品 | 国产精品亚洲综合 | 中文字幕免费视频 | 欧美中文一区 | 在线看亚洲 | 男女免费视频网站 | 夜夜草视频 | 久久国际精品 | 欧美午夜精品理论片a级按摩 | 欧美日韩一区二区视频在线观看 | 成人乱人乱一区二区三区软件 | 亚洲高清视频一区二区 | 亚洲综合色站 | 国产91在线 | 欧美 | 国产清纯白嫩初高生在线播放视频 | 久久久久av | 亚洲小视频 | 国产高清一区二区三区 | 日韩成人国产 | 日韩在线免费 | 欧美一级片在线看 | 中文字幕亚洲欧美日韩在线不卡 | 久久www免费视频 | 久草福利 | 97色在线观看免费视频 | 久久国产欧美一区二区三区精品 | 欧美精品黄 | caoporn视频在线 | 91精品国产综合久久久久 | 夜夜爽99久久国产综合精品女不卡 | 欧美视频在线播放 | 国产日韩精品视频 | 国产在线精品免费 | 久久99久久98精品免观看软件 | 天天躁日日躁狠狠躁2018小说 | 18性欧美 |