找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3758|回复: 3
收起左侧

GYJ-0095单片机四路输入输出继电器工控板仿modbus控制源码与资料下载

[复制链接]
ID:280979 发表于 2018-3-18 01:01 | 显示全部楼层 |阅读模式
GYJ-0095_四路输入输出继电器工控板产品使用说明书
【简要说明】
一、尺寸:长145mmX宽90mmX高20mm
二、主要芯片:单片机STC89C52RC 继电器 光耦
三、工作电压:有直流12V及24V可选。
四、特点:
电路结构简单,稳定可靠,采用最新款STC单片机,运行速度快,单片机预留扩展接口
1、具有四路输入信号指示灯,四路继电器吸合指示灯,电源指示灯
2、板子功耗小于8W
3、额定切换电流10A以内,切换电压250V以内
4、单路最大切换功率500W 额定功率300W
5、继电器寿命1000000次以上。
6、电器绝缘电阻100M
7、触电耐压1000V
8、继电器最大吸合时间15mS毫秒
9、继电器最大释放时间5mS毫秒
10、工作温度-40度至+70度
11、工作湿度40%~80%RH
12、路光电隔离输入,8路光电隔离输出
13、输入低电平有效(即:NPN输入)
14、路输出开关量输出(即:干接点输出)
15、具有MAX232通讯。
16、单片机所有IO口都引出,客户可以自己编程扩展功能
17、可以选择使用外部EEPROM 作为存储单元
18、电路具有,防反接保护、过流保护、续流保护、压敏保护等
19、单片机可以自行更换,可以选择替换型的STC系列单片机
20、我们提供电路相关的,原理图、例程、开发环境、下载软件等相关资料
适用场合:工业控制、产品开发、项目设计,自动化改造等
【标注说明】
010133h5u22dccdwl2wldc.jpg
接线说明
   
输入控制设备
输出控制设备

输出举例说明
输出举例说明(开关量输出、干接点输出)
专业下载线接线说明
串口通信说明也可以通过串口下载



原理图(提供PDF格式的原理图及PCB)更清晰
免费提供与此工控板有关的:资料、例程、原理图
芯片资料、软件。
【图片展示】

默认发货程序
  1. 单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600.

  2. 单片机接收PC机发送的十六进制码表如下:

  3. 01、全开:PC发送'I';
  4. 02、全关:PC发送'i';

  5. 03、第一路开:PC发送'A';
  6. 04、第二路开:PC发送'B';
  7. 05、第三路开:PC发送'C';
  8. 06、第四路开:PC发送'D';


  9. 11、第一路关:PC发送'a';
  10. 12、第二路关:PC发送'b';
  11. 13、第三路关:PC发送'c';
  12. 14、第四路关:PC发送'd';


  13. *********************************************************************/
  14. #include<reg52.h>                       //库文件
  15. #define uchar unsigned char//宏定义无符号字符型
  16. #define uint unsigned int  //宏定义无符号整型
  17. /********************************************************************
  18.                             初始定义
  19. *********************************************************************/

  20. unsigned char dat; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容

  21. /*定义八位输入为单片机P1口*/
  22. sbit IN0=P1^0;
  23. sbit IN1=P1^1;
  24. sbit IN2=P1^2;
  25. sbit IN3=P1^3;

  26. /*定义八位输出为单片机P2口*/
  27. sbit K1=P2^0;
  28. sbit K2=P2^1;
  29. sbit K3=P2^2;
  30. sbit K4=P2^3;

  31. /********************************************************************
  32.                             延时函数
  33. *********************************************************************/
  34. void delay(uchar t)
  35. {
  36.   uchar i,j;
  37.    for(i=0;i<t;i++)
  38.    {
  39.                  for(j=13;j>0;j--);
  40.               { ;
  41.               }
  42.    }
  43. }

  44. /********************************************************************
  45.               功能:串口初始化,波特率9600,方式1
  46. *********************************************************************/
  47. void Init_Com(void)
  48. {
  49. TMOD = 0x20;
  50. PCON = 0x00;
  51. SCON = 0x50;
  52. TH1 = 0xFd;
  53. TL1 = 0xFd;
  54. TR1 = 1;
  55. }

  56. /********************************************************************
  57.                             主函数
  58. *********************************************************************/
  59. void main()
  60. {
  61. Init_Com();//串口初始化
  62. while(1)
  63. {

  64. if(IN0==0){delay(100);K1=0;while(!IN0);SBUF ='1';K1=1;} //继电器K1按下闭合,松开断开
  65. if(IN1==0){delay(100);K2=0;while(!IN1);SBUF ='2';K2=1;} //继电器K2按下闭合,松开断开
  66. if(IN2==0){delay(100);K3=0;while(!IN2);SBUF ='3';K3=1;} //继电器K3按下闭合,松开断开
  67. if(IN3==0){delay(100);K4=0;while(!IN3);SBUF ='4';K4=1;} //继电器K4按下闭合,松开断开                    
  68. if ( RI ) //扫描判断是否接收到数据,
  69. {
  70. dat = SBUF; //接收数据SBUF赋与dat
  71. RI=0; //RI 清零。
  72. SBUF = dat; //在原样把数据发送回去
  73. }
  74. /********************************************************************
  75.                             接收数据判断函数
  76. *********************************************************************/
  77. switch(dat) //接收数据判断
  78. {
  79. uchar k;
  80. k=10;
  81. case 'I': P2=0X00;delay(k);break; //  全开
  82. case 'i': P2=0XFF;delay(k);break; //  全关

  83. case 'A': K1=0;delay(k);break;                 //  第一路开
  84. case 'B': K2=0;delay(k);break;                 //  第二路开
  85. case 'C': K3=0;delay(k);break;                 //  第三路开
  86. case 'D': K4=0;delay(k);break;                 //  第四路开

  87. case 'a': K1=1;delay(k);break;                 //  第一路关
  88. case 'b': K2=1;delay(k);break;                 //  第二路关
  89. case 'c': K3=1;delay(k);break;                 //  第三路关
  90. case 'd': K4=1;delay(k);break;                 //  第四路关


  91. default:break;                                                                         //  跳出
  92. }

  93. }
  94. }
  95.             
  96. /********************************************************************
  97.                               结束
  98. *********************************************************************/

复制代码

仿modbus通信控制程序
                           485通讯控制板通讯协议(技术QQ115451619)

波特率 9600
通讯协议格式如下:发送十六进制
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00~FF
00~09
00~FF
BB
解释
第一个数据
第二个数据
第三个数据
第四个数据
最后一个数据
功能1:改变板子地址
举例:更改地址:(发货默认地址00注意:多个板子并联使用时需要不同地址
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
01
01
BB
解释
开始数据
向00地址发送
改变地址
将地址改成01
数据结束
功能2:打开继电器
举例:打开第一块板子的继电器
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
02
01
BB
解释
开始数据
向00地址发送
打开功能
打开继电器
数据结束
功能3:关闭继电器
举例:关闭第二路板子的继电器
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
01
03
01
BB
解释
开始数据
向01地址发送
关闭功能
关闭继电器
数据结束
功能4:打开某块板子的所有继电器(单路继电器模块的这个功能码和功能2一样)
举例:打开第一块板子的全部继电器
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
04
FF
BB
解释
开始数据
向00地址发送
打开所有功能
打开所有继电器
数据结束
功能5:关闭某块板子的所有继电器(单路继电器模块的这个功能码和功能3一样)
举例:关闭第三块板子的全部继电器
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
02
05
00
BB
解释
开始数据
向02地址发送
关闭所有功能
关闭所有继电器
数据结束
功能6:查询继电器状态
举例:查询第一块板子继电器状态
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
06
01
BB
解释
开始数据
向00地址发送
查询功能
查询继电器
数据结束
查询返回信息分析 继电器关闭返回值(关闭返回00)
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
07
00
BB
解释
开始数据
00地址返回
返回功能
继电器状态关闭
数据结束
查询返回信息分析 继电器打开返回值(打开返回FF)
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
07
FF
BB
解释
开始数据
00地址返回
返回功能
继电器状态打开
数据结束

功能7:查询输入状态
举例:查询第一块板子的输入状态
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
08
01
BB
解释
开始数据
向00地址发送
查询功能
查询输入
数据结束
查询返回信息分析 输入返回值(关闭返回00)
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
09
00
BB
解释
开始数据
00地址返回
返回功能
输入状态关闭
数据结束
查询返回信息分析 输入返回值(打开返回01)
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
09
FF
BB
解释
开始数据
00地址返回
返回功能
输入状态打开
数据结束
功能8:输入发送数据
当输入端有信号时,给上位机发送数据
举例:第一路有信号输入时的数据为:AA 00 08 01 BB
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
08
01~08
BB
解释
开始数据
00地址返回
返回功能
输入状态
数据结束
功能9:板子地址清零控制(用于地址不清晰或者忘记,在485总线下禁止操作,只可对其单独清零)
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
00
00
BB
解释
开始数据
00
地址清零
数据结束
功能10:继电器定时输出
协议
启始位
地址位
继电器位
数据位
结束位
控制
AA
00
11
00
BB
解释
开始数据
地址
打开第一个继电器
时间值单位秒
数据结束
协议
启始位
地址位
继电器位
数据位
结束位
控制
AA
00
12
00
BB
解释
开始数据
地址
打开第二个继电器
时间值单位秒
数据结束
协议
启始位
地址位
继电器位
数据位
结束位
控制
AA
00
13
00
BB
解释
开始数据
地址
打开第三个继电器
时间值单位秒
数据结束
协议
启始位
地址位
继电器位
数据位
结束位
控制
AA
00
14
00
BB
解释
开始数据
地址
打开第四个继电器
时间值单位秒
数据结束
  1. #include<reg52.h>                       //库文件
  2. #include <intrins.H>
  3. #include<EEPROM.h>
  4. #define uchar unsigned char//宏定义无符号字符型
  5. //sfr WDT_CONTR=0Xe1;
  6. sbit K1=P2^0;
  7. sbit K2=P2^1;
  8. sbit K3=P2^2;
  9. sbit K4=P2^3;
  10. sbit K5=P2^4;
  11. sbit K6=P2^5;
  12. sbit K7=P2^6;
  13. sbit K8=P2^7;

  14. /*定义八位入为单片机P1口*/
  15. sbit IN0=P1^0;
  16. sbit IN1=P1^1;
  17. sbit IN2=P1^2;
  18. sbit IN3=P1^3;
  19. sbit IN4=P1^4;
  20. sbit IN5=P1^5;
  21. sbit IN6=P1^6;
  22. sbit IN7=P1^7;
  23. uchar dat;
  24. uchar t,r,ii;
  25. uchar k=100;
  26. uchar add;    //掉电保持485的地址
  27. uchar j=0;
  28. bit flag_zx=0;
  29. uchar sendBuf[10];                //发送缓冲区
  30. uchar receBuf[10];    //接收缓冲区
  31. uchar s1,s2,s3,s4,s5,s6,s7,s8;
  32. uchar s11,s22,s33,s44,s55,s66,s77,s88;
  33. bit busy;
  34. bit bz1=0;
  35. bit bz2=0;
  36. bit bz3=0;
  37. bit bz4=0;
  38. bit bz5=0;
  39. bit bz6=0;
  40. bit bz7=0;
  41. bit bz8=0;

  42. bit sj1=0;
  43. bit sj2=0;
  44. bit sj3=0;
  45. bit sj4=0;
  46. bit sj5=0;
  47. bit sj6=0;
  48. bit sj7=0;
  49. bit sj8=0;
  50. /********************************************************************
  51.                             初始定义
  52. *********************************************************************/
  53. uint sec; //定义计数值,每过1/10 秒,sec 加一
  54. uint tcnt; //键值判断
  55. /********************************************************************
  56.                             延时函数
  57. *********************************************************************/
  58. void delay(uchar t)
  59. {
  60.   uchar i,j;
  61.    for(i=0;i<t;i++)
  62.    {
  63.                  for(j=13;j>0;j--);
  64.               { ;
  65.               }
  66.    }
  67. }

  68. /********************************************************************
  69.               功能:串口初始化,波特率9600,方式1
  70. *********************************************************************/
  71. void Init_Com(void)
  72. {
  73. TMOD|=0x20;
  74. SCON=0x50;
  75. TH1=0xfd;
  76. TL1=0xfd;
  77. TR1=1;
  78. ES=1;
  79. }

  80. /****************发送函数*********************/
  81. void senduart2()
  82. {               
  83. //RS485_DIR=1;
  84. SBUF=sendBuf[0];while(!TI);TI=0;
  85. SBUF=sendBuf[1];while(!TI);TI=0;
  86. SBUF=sendBuf[2];while(!TI);TI=0;
  87. SBUF=sendBuf[3];while(!TI);TI=0;
  88. SBUF=sendBuf[4];while(!TI);TI=0;
  89. }

  90. /****************发送函数*********************/
  91. void send1()
  92. {               
  93. //RS485_DIR=1;
  94. SBUF=0XAA;while(!TI);TI=0;
  95. SBUF=add;while(!TI);TI=0;
  96. SBUF=0X08;while(!TI);TI=0;
  97. SBUF=0X01;while(!TI);TI=0;
  98. SBUF=0XBB;while(!TI);TI=0;
  99. }
  100. /****************发送函数*********************/
  101. void send2()
  102. {               
  103. //RS485_DIR=1;
  104. SBUF=0XAA;while(!TI);TI=0;
  105. SBUF=add;while(!TI);TI=0;
  106. SBUF=0X08;while(!TI);TI=0;
  107. SBUF=0X02;while(!TI);TI=0;
  108. SBUF=0XBB;while(!TI);TI=0;
  109. }
  110. /****************发送函数*********************/
  111. void send3()
  112. {               
  113. //RS485_DIR=1;
  114. SBUF=0XAA;while(!TI);TI=0;
  115. SBUF=add;while(!TI);TI=0;
  116. SBUF=0X08;while(!TI);TI=0;
  117. SBUF=0X03;while(!TI);TI=0;
  118. SBUF=0XBB;while(!TI);TI=0;
  119. }
  120. /****************发送函数*********************/
  121. void send4()
  122. {               
  123. //RS485_DIR=1;
  124. SBUF=0XAA;while(!TI);TI=0;
  125. SBUF=add;while(!TI);TI=0;
  126. SBUF=0X08;while(!TI);TI=0;
  127. SBUF=0X04;while(!TI);TI=0;
  128. SBUF=0XBB;while(!TI);TI=0;
  129. }
  130. /****************发送函数*********************/
  131. void send5()
  132. {               
  133. //RS485_DIR=1;
  134. SBUF=0XAA;while(!TI);TI=0;
  135. SBUF=add;while(!TI);TI=0;
  136. SBUF=0X08;while(!TI);TI=0;
  137. SBUF=0X05;while(!TI);TI=0;
  138. SBUF=0XBB;while(!TI);TI=0;
  139. }
  140. /****************发送函数*********************/
  141. void send6()
  142. {               
  143. //RS485_DIR=1;
  144. SBUF=0XAA;while(!TI);TI=0;
  145. SBUF=add;while(!TI);TI=0;
  146. SBUF=0X08;while(!TI);TI=0;
  147. SBUF=0X06;while(!TI);TI=0;
  148. SBUF=0XBB;while(!TI);TI=0;
  149. }/****************发送函数*********************/
  150. void send7()
  151. {               
  152. //RS485_DIR=1;
  153. SBUF=0XAA;while(!TI);TI=0;
  154. SBUF=add;while(!TI);TI=0;
  155. SBUF=0X08;while(!TI);TI=0;
  156. SBUF=0X07;while(!TI);TI=0;
  157. SBUF=0XBB;while(!TI);TI=0;
  158. }
  159. /****************发送函数*********************/
  160. void send8()
  161. {               
  162. //RS485_DIR=1;
  163. SBUF=0XAA;while(!TI);TI=0;
  164. SBUF=add;while(!TI);TI=0;
  165. SBUF=0X08;while(!TI);TI=0;
  166. SBUF=0X08;while(!TI);TI=0;
  167. SBUF=0XBB;while(!TI);TI=0;
  168. }

  169. /*****************清空发送缓冲区*************************/
  170. void clear_receBuf()
  171. {
  172.     uchar i;
  173.               for(i=0;i<5;i++)
  174.               {
  175.                   receBuf[i]=0;
  176.               }
  177. }
  178. /********************************************************************
  179.               功能:串口初始化,波特率9600,方式1
  180. *********************************************************************/
  181. void initTimer(void)
  182. {
  183. TMOD=0x2;
  184. TH0=0x1b;
  185. TL0=0x1b;
  186. }
  187. /********************************************************************
  188.                             串口中断服务函数
  189. *********************************************************************/
  190. void uart(void) interrupt 4
  191. {
  192. /********************************************************************
  193.                             接收数据判断函数
  194. *********************************************************************/
  195. if(RI)  //如果有接收
  196.                  {
  197.                    RI=0; //接收标志清零
  198.                    receBuf[r++&0x0F]=SBUF;     //把接受的数据存储到BUT数组中
  199.                             if(receBuf[0]!=0xaa){r=0;}
  200.                             if(r>=5)
  201.                             {              r=0;

  202.                                 flag_zx=1;
  203.                             }
  204.                  }
  205.                  if(flag_zx==1)
  206.                  {                                

  207.                       flag_zx=0;
  208.                            
  209.                                 //0         1       2       3        4                           
  210.                                           //起始位   地址位  功能位   数据位  结束位
  211.                                           if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))                //如果开始位和结束位,还有地址都正确,进行下一步判断
  212.                                           {
  213.                                              if(receBuf[2]==0x01)  //修改板子地址
  214.                                              {
  215.                                                   add=receBuf[3];
  216.                                                                       EEPROMSectorErase(0);//擦除扇区
  217.                                                   EEPROMWriteByte(0,add);//写入新的地址
  218.                                              }
  219.                                              else if(receBuf[2]==0x02)  //打开单路继电器
  220.                                              {
  221.                                                                switch(receBuf[3])
  222.                                                                       {
  223.                                                                           case 0x01: K1=0;sj1=0; break;
  224.                                                                                     case 0x02: K2=0;sj2=0; break;
  225.                                                                           case 0x03: K3=0;sj3=0; break;
  226.                                                                                     case 0x04: K4=0;sj4=0; break;
  227.                                                                           case 0x05: K5=0;sj5=0;break;
  228.                                                                                     case 0x06: K6=0;sj6=0;break;
  229.                                                                           case 0x07: K7=0;sj7=0;break;
  230.                                                                                     case 0x08: K8=0;sj8=0;break;
  231.                                                                                     default:break;
  232.                                                                       }
  233.                                              }
  234.                                              else if(receBuf[2]==0x03)  //关闭单路继电器
  235.                                              {
  236.                                                                switch(receBuf[3])
  237.                                                                       {
  238.                                                                           case 0x01: K1=1;sj1=0; break;
  239.                                                                                     case 0x02: K2=1;sj2=0; break;
  240.                                                                           case 0x03: K3=1;sj3=0; break;
  241.                                                                                     case 0x04: K4=1;sj4=0; break;
  242.                                                                           case 0x05: K5=1;sj5=0; break;
  243.                                                                                     case 0x06: K6=1;sj6=0; break;
  244.                                                                           case 0x07: K7=1;sj7=0; break;
  245.                                                                                     case 0x08: K8=1;sj8=0; break;
  246.                                                                                     default:break;
  247.                                                                       }                                 
  248.                                              }
  249.                                              else if(receBuf[2]==0x04)  //打开全部继电器
  250.                                              {
  251.                                                   if(receBuf[3]==0xff)
  252.                                                   {
  253.                                                                           P2=0X00; sj1=0;sj2=0;sj3=0;sj4=0;sj5=0;sj6=0;sj7=0;sj8=0;
  254.                                                                       }
  255.                                              }
  256.                                              else if(receBuf[2]==0x05)  //关闭全部继电器
  257.                                              {
  258.                                                   if(receBuf[3]==0x00)
  259.                                                   {
  260.                                                                           P2=0XFF; sj1=0;sj2=0;sj3=0;sj4=0;sj5=0;sj6=0;sj7=0;sj8=0;
  261.                                                                       }                                 
  262.                                              }
  263.                                              else if(receBuf[2]==0x06)  //查询继电器
  264.                                              {
  265.                                                                       sendBuf[0]=0xaa;
  266.                                                                       sendBuf[1]=add;
  267.                                                                       sendBuf[2]=0x07;
  268.                                                                       //sendBuf[3]=0xfe;
  269.                                                                       sendBuf[4]=0xbb;            
  270.                                                  switch(receBuf[3])
  271.                                                            {
  272.                                                                case 0x01: if(K1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  273.                                                                          case 0x02: if(K2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  274.                                                                case 0x03: if(K3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  275.                                                                          case 0x04: if(K4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  276.                                                                case 0x05: if(K5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  277.                                                                          case 0x06: if(K6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  278.                                                                case 0x07: if(K7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  279.                                                                          case 0x08: if(K8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  280.                                                                          default:break;
  281.                                                            }
  282.                                                            senduart2();
  283.                                              }
  284.                                              else if(receBuf[2]==0x08)  //查询输入
  285.                                              {
  286.                                                                       sendBuf[0]=0xaa;
  287.                                                                       sendBuf[1]=add;
  288.                                                                       sendBuf[2]=0x09;
  289.                                                                       //sendBuf[3]=0xfe;
  290.                                                                       sendBuf[4]=0xbb;
  291.                                                       
  292.                                                  switch(receBuf[3])
  293.                                                            {
  294.                                                                case 0x01: if(IN0==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  295.                                                                          case 0x02: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  296.                                                                case 0x03: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  297.                                                                          case 0x04: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  298.                                                                case 0x05: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  299.                                                                          case 0x06: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  300.                                                                case 0x07: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  301.                                                                          case 0x08: if(IN7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  302.                                                                          default:break;
  303.                                                            }
  304.                                                                       senduart2();
  305.                                              }                                          

  306.                                                        else if(receBuf[2]==0x11)  //第1路延时控制
  307.                                           {
  308.                                           sj1=1; s11=0;
  309.                                           s1=receBuf[3];clear_receBuf();
  310.                                              }                                                                                                                                                         
  311.                                                                                     else if(receBuf[2]==0x12)  //第2路延时控制
  312.                                           {
  313.                                           sj2=1;s22=0;
  314.                                           s2=receBuf[3];clear_receBuf();
  315.                                              }
  316.                                                                                     else if(receBuf[2]==0x13)  //第3路延时控制
  317.                                           {
  318.                                           sj3=1;s33=0;
  319.                                           s3=receBuf[3];clear_receBuf();
  320.                                              }
  321.                                                                                     else if(receBuf[2]==0x14)  //第4路延时控制
  322.                                           {
  323.                                           sj4=1;s44=0;
  324.                                           s4=receBuf[3];clear_receBuf();
  325.                                              }
  326.                          else if(receBuf[2]==0x15)  //第5路延时控制
  327.                                           {
  328.                                           sj5=1; s55=0;
  329.                                           s5=receBuf[3];clear_receBuf();
  330.                                              }
  331.                                                                                     else if(receBuf[2]==0x16)  //第6路延时控制
  332.                                           {
  333.                                           sj6=1;s66=0;
  334.                                           s2=receBuf[3];clear_receBuf();
  335.                                              }
  336.                                                                                     else if(receBuf[2]==0x17)  //第7路延时控制
  337.                                           {
  338.                                           sj7=1;s77=0;
  339.                                           s77=receBuf[3];clear_receBuf();
  340.                                              }
  341.                                                                                     else if(receBuf[2]==0x18)  //第8路延时控制
  342.                                           {
  343.                                           sj8=1;s88=0;
  344.                                           s8=receBuf[3];clear_receBuf();
  345.                                              }

  346.                                           }
  347.                                           if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  348.                                           {
  349.                                                   add=0x00;
  350.                                                                       EEPROMSectorErase(0);//擦除扇区
  351.                                                   EEPROMWriteByte(0,0);//写入新的地址                                            
  352.                                           }
  353.                                           clear_receBuf();
  354.                             }

  355. }
  356. /********************************************************************
  357.                             主函数
  358. *********************************************************************/
  359. void main()
  360. {
  361. //WDT_CONTR=0x35;                //启动看门狗
  362. initTimer();
  363. Init_Com();//串口初始化
  364. add = EEPROMReadByte(0);
  365. //add = 0X00;
  366. TR0=1;
  367. ET0=1;
  368. EA=1;

  369. while(1)
  370. {



  371.     if((IN0==0)&&(bz1==0)){delay(k);if(IN0==0){delay(k);send1();clear_receBuf();bz1=1;}}if((bz1==1)&&(IN0==1)){delay(k);bz1=0;}
  372.     if((IN1==0)&&(bz2==0)){delay(k);if(IN1==0){delay(k);send2();clear_receBuf();bz2=1;}}if((bz2==1)&&(IN1==1)){delay(k);bz2=0;}
  373.     if((IN2==0)&&(bz3==0)){delay(k);if(IN2==0){delay(k);send3();clear_receBuf();bz3=1;}}if((bz3==1)&&(IN2==1)){delay(k);bz3=0;}
  374.     if((IN3==0)&&(bz4==0)){delay(k);if(IN3==0){delay(k);send4();clear_receBuf();bz4=1;}}if((bz4==1)&&(IN3==1)){delay(k);bz4=0;}

  375.     if((IN4==0)&&(bz5==0)){delay(k);if(IN4==0){delay(k);send5();clear_receBuf();bz5=1;}}if((bz5==1)&&(IN4==1)){delay(k);bz5=0;}
  376.     if((IN5==0)&&(bz6==0)){delay(k);if(IN5==0){delay(k);send6();clear_receBuf();bz6=1;}}if((bz6==1)&&(IN5==1)){delay(k);bz6=0;}
  377.     if((IN6==0)&&(bz7==0)){delay(k);if(IN6==0){delay(k);send7();clear_receBuf();bz7=1;}}if((bz7==1)&&(IN6==1)){delay(k);bz7=0;}
  378.     if((IN7==0)&&(bz8==0)){delay(k);if(IN7==0){delay(k);send8();clear_receBuf();bz8=1;}}if((bz8==1)&&(IN7==1)){delay(k);bz8=0;}
  379. /*if(write==1)
  380. {
  381. write=0;
  382.                                           KK1 = P0;
  383.                                           KK2 = P1;
  384.                                           KK3 = P2;
  385.                                           KK4 = P3;
  386.                                           EEPROMSectorErase(0);
  387.                                           EEPROMWriteByte(0,KK1);
  388.                                           EEPROMWriteByte(1,KK2);
  389.                                           EEPROMWriteByte(2,KK3);
  390.                                           EEPROMWriteByte(3,KK4);
  391. }*/
  392. }
  393. }
  394. /********************************************************************
  395.                             定时中断服务函数
  396. *********************************************************************/
  397. void t0(void) interrupt 1 using 0 //定时中断服务函数
  398. {
  399.               tcnt++; //每过250ust tcnt 加一
  400.               if(tcnt==3900) //计满400 次(1秒)时
  401.               {
  402.               tcnt=0; //重新再计
  403.               // K1=!K1;
  404.               // WDT_CONTR=0x35;  //7.2s喂狗一次
  405.               if(sj1==1){K1=0;s11++;if(s11>=s1){K1=1;s11=0;sj1=0;}}
  406.               if(sj2==1){K2=0;s22++;if(s22>=s2){K2=1;s22=0;sj2=0;}}
  407.               if(sj3==1){K3=0;s33++;if(s33>=s3){K3=1;s33=0;sj3=0;}}
  408.               if(sj4==1){K4=0;s44++;if(s44>=s4){K4=1;s44=0;sj4=0;}}
  409.               }
  410.               }
  411. /********************************************************************
  412.                               结束
  413. *********************************************************************/
复制代码


0.png 0.png

全部资料51hei下载地址:
GYJ-0095_四路输入输出继电器工控板发货资料.rar (8.74 MB, 下载次数: 126)
回复

使用道具 举报

ID:462629 发表于 2021-3-6 23:50 | 显示全部楼层
这是好人啊,打包成一个,太谢谢了
回复

使用道具 举报

ID:65956 发表于 2021-3-8 08:46 | 显示全部楼层
也只是仿modbus,并不是真modbus通讯协议,所以不一定很通用
回复

使用道具 举报

ID:336378 发表于 2021-3-17 11:44 | 显示全部楼层
    能用不??
有大神用过没??
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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