找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2848|回复: 0
收起左侧

51单片机新手入门之Modbus通讯程序

[复制链接]
ID:1011490 发表于 2022-3-25 11:52 | 显示全部楼层 |阅读模式
代码如下:
  1. #include "STC12C5A60S2.H"
  2. #include <intrins.H>.// 头文件
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uchar sendbuffer[17];// 发送数据
  6. uchar flag=0;
  7. uchar re_buffer[32];
  8. uchar count=0;
  9. uint ad_data=0;
  10. double ad_vol=0;
  11. uint con_mid=0;
  12. uint gascon=0;
  13. long sum_o2=0;
  14. uint average_counter=20;
  15. uint idata oldtemp[21];
  16. uchar idata Send_Buff[20]; //module
  17. uint pre_contemp=0;
  18. uint O2_con=0;
  19. uchar idata test[21]; //module
  20. uint temperature=0;
  21. uint dat;
  22. uint testlcd=0;
  23. uchar c[]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9};
  24. //MAX1241 模数芯片引脚设置,此电路板我没焊^_^
  25. //sbit ADC_CS=P0^1;
  26. //sbit ADC_CLK=P0^0;
  27. //sbit ADC_DOUT=P0^2;
  28. sbit ADC_CS=P3^6;
  29. sbit ADC_CLK=P3^5;
  30. sbit ADC_DOUT=P3^7;
  31. 4
  32. //LCD12864 LCD 屏幕引脚设置
  33. sbit cs=P2^2;
  34. sbit sid=P2^1;
  35. sbit sclk=P2^0;
  36. sbit DQ=P0^1; //DS18B20 温度引脚设置,依然没有⋯
  37. #define N 11
  38. #define N2 20
  39. void delayms(unsigned char t)
  40. {
  41. unsigned char i;
  42. unsigned char j;
  43. for(j=t;j;j--)
  44. for(i=192;i;i--);/*1ms 延时*/
  45. }
  46. void delayus(uint t)
  47. {
  48. uint i;
  49. for(i=0;i<t;i++)
  50. {
  51. _nop_();
  52. }
  53. }
  54. void delay(float sec)
  55. {
  56. unsigned int i;
  57. unsigned int j;
  58. j=sec*100;
  59. while(j--)
  60. {
  61. i=1561;
  62. while(--i);
  63. }
  64. }
  65. void UART1_init() // 串口1 初始化,此串口和电脑通讯
  66. {
  67. TMOD=0x20;/设置定时器工作方式2
  68. TH1=0xfd; // 波特率9600
  69. 5
  70. TL1=0xfd;
  71. TR1=1;
  72. REN=1;
  73. SM0=0;
  74. SM1=1;
  75. //ES=1;
  76. }
  77. void UART2_init()// 串口2 初始化,和模块通讯 Modbus
  78. {
  79. S2CON= 0x50; // 方式1,允许接收
  80. BRT = 0xf4; // 波特率2400
  81. AUXR = AUXR |0X10; // 允许独立波特率允许
  82. AUXR1 = AUXR1&0xef; // 将uart2 切换到P1 口
  83. IE2 = IE2|0X01; // 允许串口2 中断
  84. }
  85. void UART1_Send (unsigned char UART_data)//
  86. {
  87. //ES=0;
  88. SBUF = UART_data; // 将接收的数据发送回去
  89. while(TI!=1); // 检查发送中断标志位
  90. TI = 0; // 另发送中断标志位为0
  91. //ES=1;
  92. }
  93. void UART2_Send(unsigned char UART_data)// 串口2 发送
  94. {
  95. //ES = 0 ;
  96. S2BUF = UART_data;
  97. while((S2CON&0x02)!=0x02);
  98. S2CON &= ~0x02;
  99. //ES = 1 ;
  100. }
  101. void UART1_Send_String (char *str, char len)// 串口1 发送字符串
  102. {
  103. unsigned char i;
  104. for(i=0;i<=len;i++)
  105. {
  106. UART1_Send(str[i]);
  107. }
  108. }
  109. 6
  110. void UART2_Send_String (char *str, char len) // 串口2 发送字符串
  111. {
  112. unsigned char i;
  113. for(i=0;i<=len;i++)
  114. {
  115. UART2_Send(str[i]);
  116. }
  117. }
  118. unsigned char Creat_Addr(unsigned char adr, unsigned char position)// 计算模
  119. 块地址
  120. {
  121. unsigned char hich;
  122. unsigned char loch;
  123. hich = adr/16;
  124. loch = adr%16;
  125. if(hich>9)
  126. hich+=7;
  127. if(loch>9)
  128. loch+=7;
  129. if(position == 1)
  130. {
  131. return hich+0x30;
  132. }
  133. else if(position == 0)
  134. {
  135. return loch+0x30;
  136. }
  137. }
  138. unsigned char CheckSum(unsigned char *str, unsigned char position, uchar len)/
  139. 计算校验码
  140. {
  141. uchar i;
  142. unsigned int sum=0;
  143. uchar hi, lo;
  144. //uchar len = 12;
  145. for(i = 1; i <= len; i ++)
  146. {
  147. *str ++;
  148. sum += *str;
  149. }
  150. sum = 256-(sum%256);
  151. 7
  152. hi = sum/16;
  153. lo = sum%16;
  154. if(hi > 9)
  155. hi += 7;
  156. if(lo > 9)
  157. lo += 7;
  158. hi += 0x30;
  159. lo += 0x30;
  160. if(sum == 256)
  161. hi = lo = 0x30;
  162. if(position == 1)
  163. {
  164. return hi;
  165. }
  166. else if(position == 0)
  167. {
  168. return lo;
  169. }
  170. }
  171. void data_init()
  172. {
  173. sendbuffer[0]=0x5B;
  174. sendbuffer[1]=0x30;
  175. sendbuffer[2]=0x30;
  176. sendbuffer[3]=0x30;
  177. sendbuffer[4]=0x30;
  178. sendbuffer[5]=0x30;
  179. sendbuffer[6]=0x7C;
  180. sendbuffer[7]=0x30;
  181. sendbuffer[8]=0x30;
  182. sendbuffer[9]=0x30;
  183. sendbuffer[10]=0x30;
  184. sendbuffer[11]=0x30;//TEM
  185. sendbuffer[12]=0x30;
  186. sendbuffer[13]=0x30;
  187. sendbuffer[14]=0x5D;
  188. sendbuffer[15]=0x0D;
  189. sendbuffer[16]=0x0A;
  190. }
复制代码

以上内容的pdf格式文档下载(内容和本网页上的一模一样,方便大家保存):
51单片机新手入门之Modbus通讯.pdf (816.34 KB, 下载次数: 62)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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