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

標題: 關于51單片機modbus通訊程序的請教 [打印本頁]

作者: vayne.    時間: 2019-5-8 11:17
標題: 關于51單片機modbus通訊程序的請教
本人小白,在網上找了一個51 單片機modbus通訊的從機程序,編譯后提示好像是缺少modbus校驗的部分,請各位大佬幫忙看看這個程序怎么添加modbus部分。(老師只要求了功能碼03讀寄存器)
  1. #include "reg52.h"  

  2. typedef unsigned char uint8;
  3. typedef unsigned int uint16;
  4. typedef unsigned long uint32;
  5. #define TIMER_HIGHT 0xf8
  6. #define TIMER_LOW 0xcd
  7. sbit bRunLED =P3^4; //運行指示燈
  8. sbit bWatchDog =P1^7; //看門狗復位
  9. sbit b485Send= P1^3; //75LBC184 發送接收控制
  10. uint32  dwTickCount,dwIntTick;  //時鐘   
  11. uint8   idata sendBuf[16],receBuf[16]; //發送接收緩沖區   
  12. uint8   idata checkoutError;    // ==2 偶校驗錯     
  13. uint8   idata receTimeOut;      //接收超時   
  14. uint8   idata c10ms;            //10ms 計時   
  15. bit     b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms; //定時標志位   
  16.    
  17. // 串行中斷程序   
  18. void commIntProc() interrupt 4   
  19. {   
  20.     if(TI)   
  21.     {   
  22.         TI = 0;   
  23.         if(sendPosi < sendCount)   
  24.         {   
  25.             sendPosi++;   
  26.             ACC = sendBuf[sendPosi];   
  27.             TB8 = P;    //加上校驗位   
  28.             SBUF = sendBuf[sendPosi];   
  29.         }   
  30.         else   
  31.         {   
  32.             b485Send = 0;    //發送完后將485置于接收狀態   
  33.             receCount = 0;   //清接收地址偏移寄存器   
  34.             checkoutError = 0;   
  35.         }   
  36.     }   
  37.     else if(RI)   
  38.     {   
  39.         RI = 0;   
  40.         receTimeOut = 10;    //通訊超時值   
  41.         receBuf[receCount] = SBUF;   
  42.         ACC = receBuf[receCount];   
  43.         if(P != RB8)   
  44.             checkoutError = 2;  //偶校驗出錯   
  45.         receCount++;          //接收地址偏移寄存器加1   
  46.         receCount &= 0x0f;    //最多一次只能接收16個字節   
  47.     }   
  48.    
  49. }   // void CommIntProc()   
  50.    
  51. //定時器0 1ms 中斷   
  52. void timer0IntProc() interrupt 1   
  53. {   
  54.     TL0 = TIMER_LOW;   
  55.     TH0 = TIMER_HIGHT;   
  56.     dwIntTick++;   
  57.     bt1ms = 1;   
  58.     c10ms++;   
  59.     if(c10ms >= 10)   
  60.     {   
  61.         c10ms = 0;      //10ms計時器清零   
  62.         bt10ms = 1;   
  63.     }   
  64. }   // void Timer0IntProc()   
  65.    
  66. //外部中斷0   
  67. void intEx0Proc(void) interrupt 0   
  68. {   
  69.    
  70. }   
  71.    
  72. //計數器1中斷   
  73. void counter1IntProc(void) interrupt 3 using 1   
  74. {   
  75.    
  76. }   

  77. //定時處理   
  78. void timeProc(void)   
  79. {   
  80.     static uint8 c200ms;   
  81.     bWatchDog = ~ bWatchDog;    //看門狗取反   
  82.     b1ms = 0;   
  83.     b10ms = 0;   
  84.     b100ms = 0;   
  85.     ET0 = 0;   
  86.     dwTickCount = dwIntTick;   
  87.     ET0 = 1;   
  88.     if(bt1ms)   
  89.     {   
  90.         bt1ms = 0;   
  91.         b1ms = 1;   
  92.         if(receTimeOut>0)   
  93.         {   
  94.             receTimeOut--;   
  95.             if(receTimeOut==0 && receCount>0)   //判斷通訊接收是否超時   
  96.             {   
  97.                 b485Send = 0;       //將485置為接收狀態   
  98.                 receCount = 0;      //將接收地址偏移寄存器清零   
  99.                 checkoutError = 0;   
  100.             }   
  101.         }   
  102.     }   
  103.     if(bt100ms)   
  104.     {   
  105.         bt100ms = 0;   
  106.         b100ms = 1;   
  107.     }   
  108.     if(bt10ms)      //判斷中斷10ms標志位是否1   
  109.     {   
  110.         bt10ms = 0;     //清中斷10ms標志位   
  111.         b10ms = 1;   
  112.    
  113.         c200ms++;                   //200ms計時器加1   
  114.         if(c200ms >= 20)            //判斷是否計時到200ms   
  115.         {   
  116.             c200ms = 0;             //清200ms計時器   
  117.             bRunLED = ~bRunLED;     //取反運行指示燈            
  118.         }   
  119.     }   
  120. }   // void TimerProc(void)   
  121.    
  122. //初始化串口   
  123. void initUart(void)   
  124. {   
  125.     //T2 用于波特率 9600   
  126.     T2CON = 0x30;   
  127.     RCAP2H = 0xff;   
  128.     RCAP2L = 0xb8;   
  129.     TR2 = 1;   
  130.     //偶校驗                          
  131.     SCON = 0xd0;   
  132.     PCON = 0;   
  133.     ES = 1;   
  134. }//void initUart(void)   
  135.    
  136. //初始化中斷   
  137. void initInt(void)   
  138. {   
  139.     TMOD = 0x51;   
  140.     TH0 = TIMER_HIGHT;   
  141.     TL0 = TIMER_LOW;   
  142.     TR0 = 1;      
  143.     ET0 = 1;   
  144.     TH1 = 0;            //9600   
  145.     TL1 = 0;   
  146.     TR1 = 0;            //定時器1用于計數定時器2用于波特   
  147.     ET1 = 1;   
  148.     IT0 = 1;      
  149.     IT1 = 1;   
  150.     EX0 = 0;      
  151.     PX0 = 1;   
  152.     EX1 = 0;   
  153.     initUart();   
  154.     EA = 1;        
  155. }   // void initInt(void)   
  156.    
  157. //初始化   
  158. void initProg(void)   
  159. {      
  160.     initInt();   
  161.     b485Send = 0;   
  162. }   
  163. void main(void)   
  164. {   
  165.     initProg();   
  166.    
  167.     while(1)   
  168.     {   
  169.         timeProc();   
  170.         checkComm0Modbus();   
  171.     }   
  172. }  
復制代碼




QQ圖片20190508111324.png (4.34 KB, 下載次數: 35)

QQ圖片20190508111324.png

作者: lele5211314    時間: 2019-5-19 18:45
問題解決了嗎?
作者: lele5211314    時間: 2019-5-19 18:45
加我的QQ 1014461948我可以幫助你解決
作者: 2393744618    時間: 2020-5-27 10:09
lele5211314 發表于 2019-5-19 18:45
加我的QQ 1014461948我可以幫助你解決

你好,可以知道一下單片機做從機的MODBUS程序嗎,剛做這個不知道怎么下手





歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品精品视频一区二区三区 | 日本免费小视频 | 精品日韩一区 | 国产在线一区二区三区 | 国产精品久久久久9999鸭 | 91久久爽久久爽爽久久片 | 亚洲欧美日本在线 | 久草在线在线精品观看 | 日日夜夜免费精品视频 | 久热精品在线观看视频 | 色欧美片视频在线观看 | 国产亚洲精品久久久久动 | 日韩有码一区 | 欧美激情综合 | 欧美一级在线免费 | 婷婷开心激情综合五月天 | 在线一区二区观看 | 国产精品一区二区视频 | 天天躁日日躁狠狠的躁天龙影院 | 成人免费视频网址 | 国产高清视频在线观看 | 懂色av一区二区三区在线播放 | 中文字幕免费在线 | 91精品久久久久久久久中文字幕 | 国产精品亚洲一区二区三区在线 | 午夜精品久久久久久久久久久久久 | 一区二区三区四区免费在线观看 | 99婷婷| 日韩欧美精品 | 亚洲欧美一区二区三区情侣bbw | 欧美精品网站 | 国产一区二区久久 | 一级黄色毛片免费 | 特级做a爱片免费69 精品国产鲁一鲁一区二区张丽 | 国产精品有限公司 | 99这里只有精品 | 欧美激情久久久 | 精品亚洲一区二区三区四区五区高 | 99爱视频| 久草高清视频 | 国产视频福利 |