找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4048|回复: 3
打印 上一主题 下一主题
收起左侧

关于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, 下载次数: 23)

QQ图片20190508111324.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:93224 发表于 2019-5-19 18:45 | 只看该作者
问题解决了吗?
回复

使用道具 举报

板凳
ID:93224 发表于 2019-5-19 18:45 | 只看该作者
加我的QQ 1014461948我可以帮助你解决
回复

使用道具 举报

地板
ID:578727 发表于 2020-5-27 10:09 | 只看该作者
lele5211314 发表于 2019-5-19 18:45
加我的QQ 1014461948我可以帮助你解决

你好,可以知道一下单片机做从机的MODBUS程序吗,刚做这个不知道怎么下手
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表