找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6036|回复: 8
收起左侧

单片机15路继电器RS485 232通讯可编程控制板源码等开发资料 仿modbus 国产仿PLC

  [复制链接]
ID:280979 发表于 2018-2-24 13:20 | 显示全部楼层 |阅读模式
15路继电器可编程模块485及232使用手册
简要说明:
一、 尺寸:长181mmX宽152mmX高25mm
二、 主要芯片:STC12C5A60S2(支持51单片机)
三、 工作电压:直流12伏(另有24V继电器)
四、串口下载程序
五、输出供电采用延时接通电路
       功能:当输出接有被控制设备,避免单片机初次上电(或下载程序)时,输出设备误动作。此功能在实际应用中起到很大作用
六、 特点:
             1、具有电源指示。
             2、15路输入光电隔离引入信号。
             3、15路输出光电隔离输出控制继电器。
             4、标准的11.0592M晶振。(便于设置串口波特率)
             5、具有上电复位和手动复位。
             6、标准双独立通信功能,一个RS485另外一个RS232。
             7、带有掉电存储功能,该单片机内部集成。
             8、输入15路具有LED指示。
             9、输出15路具有LED指示。
             10、15路12V继电器控制,控制设备。
             11、可控制交流220V/10A一下设备。
             12、具有双通信功能(可以上位机控制)。
             13、单片机无加密,可插拔更换,带有程序下载口,可随意更改程序。
使用说明:
【标注说明】
接线图
应用举例
可以作为输入设备的产品

可作为输出控制的设备
原理图
由于原理图比较大,购买后提供PDF格式的。
PCB
上位机控制界面



通过串口1或2与上位机通讯可查询输入输出状态单片机源程序:
/********************************************************************
                            汇诚科技
实现功能:串口控制继电器程序
使用芯片:AT89S52
晶振:11.0592MHZ
波特率:9600
编译环境:Keil
作者:zhangxinchunleo
【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     
*********************************************************************/
/********************************************************************
单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600.

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

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

03、第一路开:PC发送'A';
04、第二路开:PC发送'B';
05、第三路开:PC发送'C';
06、第四路开:PC发送'D';
07、第五路开:PC发送'E';
08、第六路开:PC发送'F';
09、第七路开:PC发送'G';
10、第八路开:PC发送'H';
11、第九路开:PC发送'J';
12、第十路开:PC发送'K';
13、第十一路开:PC发送'L';
14、第十二路开:PC发送'M';
15、第十三路开:PC发送'N';
16、第十四路开:PC发送'O';
17、第十五路开:PC发送'P';



18、第一路关:PC发送'a';
19、第二路关:PC发送'b';
20、第三路关:PC发送'c';
21、第四路关:PC发送'd';
22、第五路关:PC发送'e';
23、第六路关:PC发送'f';
24、第七路关:PC发送'g';
25、第八路关:PC发送'h';
26、第九路关:PC发送'j';
27、第十路关:PC发送'k';
28、第十一路关:PC发送'l';
29、第十二路关:PC发送'm';
30、第十三路关:PC发送'n';
31、第十四路关:PC发送'o';
32、第十五路关:PC发送'p';


查询输入状态:

查询第1路输入输入‘1’ 如果有输入返回‘1’没有输入返回‘6’
查询第2路输入输入‘2’ 如果有输入返回‘2’没有输入返回‘7’
查询第3路输入输入‘3’ 如果有输入返回‘3’没有输入返回‘8’
查询第4路输入输入‘4’ 如果有输入返回‘4’没有输入返回‘9’
查询第5路输入输入‘5’ 如果有输入返回‘5’没有输入返回‘0’
查询第6路输入输入‘Q’ 如果有输入返回‘Q’没有输入返回‘q’
查询第7路输入输入‘R’ 如果有输入返回‘R’没有输入返回‘r’
查询第8路输入输入‘S’ 如果有输入返回‘S’没有输入返回‘s’
查询第9路输入输入‘T’ 如果有输入返回‘T’没有输入返回‘t’
查询第10路输入输入‘U’ 如果有输入返回‘U’没有输入返回‘u’
查询第11路输入输入‘V’ 如果有输入返回‘V’没有输入返回‘v’
查询第12路输入输入‘W’ 如果有输入返回‘W’没有输入返回‘w’
查询第13路输入输入‘X’ 如果有输入返回‘X’没有输入返回‘x’
查询第14路输入输入‘Y’ 如果有输入返回‘Y’没有输入返回‘y’
查询第15路输入输入‘Z’ 如果有输入返回‘Z’没有输入返回‘z’

*********************************************************************/
源码可以从51黑附件下载:
0.png


2.【仿modbus程序 232和485通信 输入查询方式测试程序

协议说明:


通讯说明:
  波特率
  
  9600,8,N,1
  
  通讯方式
  
  485
  
  数据格式
  
  起始位+地址位+功能位+数据位+结束位
  

功能码说明:
  功能码
  
  功能码作用
  
  00
  
  将地址清零 默认为“00”
  
  01
  
  设置板子地址
  
  02
  
  打开某路输出
  
            03
  
  关闭某路输出
  
            04
  
  查询某路输出状态  
  
            05
  
  返回输出状态:‘’00“ 标示没有输出“FF”标示有输出
  
            06
  
  查询某路输入状态
  
            07
  
  返回输入状态:‘’00“ 标示没有输入“FF”标示有输入
  
指令详细说明及例子:
1.功能码00(将地址清零)
  上位机发送
  
  AA
  
       00
  
        00
  
        00
  
        BB
  
   
  
  起始位
  
  地址00
  
  地址清零
  
  清零
  
    结束位
  
  控制器返回
  
  AA
  
  00
  
  00
  
  00
  
  BB
  
   
  
  起始位
  
  地址00
  
  00
  
  00
  
    结束位
  




例:将地址清零(任何状态下都可以使用)
上位机发送: AA  00 00 00 BB
控制器返回: AA  00 00 00 BB        //表示地址清零完成 地址为“00”

指令详细说明及例子:
2.功能码01(改变地址)
  上位机发送
  
  AA
  
       00~FF
  
        01
  
         00~FF
  
        BB
  
   
  
  起始位
  
  地址码
  
  功能码
  
  设为的地址
  
    结束位
  
  控制器返回
  
  AA
  
       00~FF
  
  01
  
       00~FF
  
  BB
  
   
  
  起始位
  
  设置的地址
  
  功能码
  
  设置的地址
  
    结束位
  

例:当前地址为 “00”时,将地址改为“03”
上位机发送: AA  00 01 03 BB
控制器返回: AA  03 01 03 BB        //表示地址设置成功
     当前地址为 “03”时,将地址改为“05”

上位机发送:  AA  0301 05 BB

控制器返回: AA  05 01 05 BB         //表示地址设置成功
3.功能码02(打开输出)
  上位机发送
  
  AA
  
       01
  
        02
  
        01
  
        BB
  
   
  
  起始位
  
  地址01时
  
  打开输出
  
  第一个输出
  
    结束位
  
  此命令无返回值
  




例:打开地址01中的第5路输出
上位机发送: AA  01 02 05 BB
           打开地址03中的第2路输出

上位机发送:  AA  0302 02 BB


4.功能码03(关闭输出)
  上位机发送
  
  AA
  
  01
  
        03
  
        01
  
        BB
  
   
  
  起始位
  
  地址01时
  
  关闭输出
  
  第一个输出
  
    结束位
  

例:    关闭地址02中的第3路输出
上位机发送: AA  02 03 03 BB
           关闭地址05中的第2路继电器

上位机发送:  AA  0503 02 BB


5.功能码04(查询输出状态)
  上位机发送
  
  
AA
  
  
01
  
  
04
  
  
01
  
  
BB
  
   
  
  起始位
  
  地址01时
  
  查询码
  
  第一个输出
  
    结束位
  
  
控制器返回
  
  
AA
  
  
01
  
  
05
  
     FF或00
  
  
BB
  
   
  
  起始位
  
  地址01
  
  返回码
  
  状态码
  
    结束位
  

例:    当前地址为 “00”时,将查询第3路输出状态
上位机发送: AA  00 04 03 BB
输出为打开状态时:控制器返回:AA  00 05 FF BB   //表示输出状态为打开
输出为关闭状态时:控制器返回:AA  00 05 00 BB   //表示输出状态为关闭
          当前地址为 “01”时,将查询第4路输出状态
上位机发送: AA  01 04 04 BB
输出为打开状态时:控制器返回:AA  01 05 FF BB   //表示输出状态为打开
输出为关闭状态时:控制器返回:AA  01 05 00 BB   //表示输出状态为打开

5.功能码06(查询输入状态)
  上位机发送
  
  
AA
  
  
01
  
  
06
  
  
01
  
  
BB
  
   
  
  起始位
  
  地址01时
  
  查询码
  
  第一个输入
  
    结束位
  
  
控制器返回
  
  
AA
  
  
01
  
  
07
  
     FF或00
  
  
BB
  
   
  
  起始位
  
  地址01
  
  返回码
  
  状态码
  
    结束位
  

例:    当前地址为 “00”时,将查询第3路输入状态
上位机发送: AA  00 06 03 BB
输入为输入状态时:   控制器返回: AA  00 06 FF BB   //表示输入状态为接通
输入为非输入状态时:控制器返回:AA  00 07 00 BB   //表示输入状态为断开
          当前地址为 “01”时,将查询第4路输入状态
上位机发送: AA  01 06 04 BB
输入为输入状态时:   控制器返回: AA  01 06 FF BB   //表示输入状态为接通
输入为非输入状态时:控制器返回:AA  01 07 00 BB   //表示输入状态为断开

  1. /********************************************************************
  2.                 河南钰平电子科技有限公司
  3. 实现功能:应用程序
  4. 使用芯片:STC12C6A60S2
  5. 晶振:11.0592MHZ
  6. 波特率:9600
  7. 编译环境:Keil 4
  8. 作者:张新春
  9. 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!     
  10. *********************************************************************/
  11. #include "hedder\\STC12C5A60S2.h"
  12. #include"hedder\\DODI.h"
  13. #include <intrins.H>
  14. #define  uchar unsigned char
  15. #define  uint  unsigned int
  16. /*
  17. sfr IAP_DATA    = 0xC2;
  18. sfr IAP_ADDRH   = 0xC3;
  19. sfr IAP_ADDRL   = 0xC4;
  20. sfr IAP_CMD     = 0xC5;
  21. sfr IAP_TRIG    = 0xC6;
  22. sfr IAP_CONTR   = 0xC7;
  23. sfr P4   = 0xC0;
  24. */
  25. //定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
  26. //#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值
  27. //#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值
  28. #define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
  29. //#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
  30. //#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值
  31. //#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值
  32. //#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值
  33. //#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值

  34. uchar dat;
  35. uchar add;
  36. uchar t,r,ii;
  37. bit flag_zx=0;
  38. uchar sendBuf[10];//发送缓冲区
  39. uchar receBuf[10];//接收缓冲区
  40. /********************************************************************
  41.                             函数声明
  42. *********************************************************************/
  43. union union_temp16
  44. {
  45. uint un_temp16;
  46. uchar  un_temp8[2];
  47. }
  48. my_unTemp16;

  49. uchar Byte_Read(uint add);              //读一字节,调用前需打开IAP 功能
  50. void Byte_Program(uint add, uchar ch);  //字节编程,调用前需打开IAP 功能
  51. void Sector_Erase(uint add);            //擦除扇区
  52. void IAP_Disable();
  53. /********************************************************************
  54.                                 串口初始化
  55. *********************************************************************/
  56. void init ()
  57. {
  58.    //串口2波特率
  59.         TMOD = 0x20;                                  //定时器1产生波特率
  60.         SCON = 0x50;                                 //方式1,8位数据,波特率可变
  61.         TH1=0xfd;
  62.         TL1 = 0xfd;                         //波特率 9600

  63.   //串口1波特率        
  64.         S2CON = 0x50;                                 //方式1,八位数据,可变波特率
  65.         BRT=0XFD;                                  //设置波特率9600
  66.         TR1=1;                                          //启动定时器产生串口2波特率        
  67.         AUXR=0x10;                                 //启动串口1波特率发生器
  68.         IP=0x00;                                 //优先级默认
  69.         EA=1;                                  //开总中断
  70.         ES=1;                                         //开串口1中断
  71.         IE2=0x01;                                 //开串口2中断
  72. }


  73. /****************发送函数*********************/
  74. void senduart2()
  75. {           
  76. //RS485_DIR=1;
  77. SBUF=sendBuf[0];while(!TI);TI=0;
  78. SBUF=sendBuf[1];while(!TI);TI=0;
  79. SBUF=sendBuf[2];while(!TI);TI=0;
  80. SBUF=sendBuf[3];while(!TI);TI=0;
  81. SBUF=sendBuf[4];while(!TI);TI=0;
  82. }
  83. /****************发送函数*********************/
  84. void senduart1()
  85. {           
  86. //RS485_DIR=1;
  87. S2BUF=sendBuf[0];while(!(S2CON & 0x02));S2CON &= ~0x02;
  88. S2BUF=sendBuf[1];while(!(S2CON & 0x02));S2CON &= ~0x02;
  89. S2BUF=sendBuf[2];while(!(S2CON & 0x02));S2CON &= ~0x02;
  90. S2BUF=sendBuf[3];while(!(S2CON & 0x02));S2CON &= ~0x02;
  91. S2BUF=sendBuf[4];while(!(S2CON & 0x02));S2CON &= ~0x02;
  92. //RS485_DIR=0;
  93. }

  94. /*****************清空发送缓冲区*************************/
  95. void clear_receBuf()
  96. {
  97.     uchar i;
  98.         for(i=0;i<5;i++)
  99.         {
  100.             receBuf[i]=0;
  101.         }
  102. }

  103. /********************************************************************
  104.                                     主函数
  105. *********************************************************************/
  106. void main()
  107. {
  108.    uchar k=10;
  109.     //配置P4.4为IO口
  110.    P4SW|=0x70;                  
  111.    P4M0&=0x80;                  
  112.    P4M1&=0x80;
  113.    add = Byte_Read(0);;
  114.    init();   //串口初始化
  115. //q   RS485_DIR=0;
  116.    while(1)
  117.    {

  118. }        
  119. }
  120. /********************************************************************
  121.                          串口一 发送接收中断函数
  122. *********************************************************************/
  123. void uart_isr()  interrupt 4
  124. {
  125. if(RI)  //如果有接收
  126.            {
  127.              RI=0; //接收标志清零
  128.              receBuf[r++&0x0F]=SBUF;     //把接受的数据存储到BUT数组中
  129.                  if(receBuf[0]!=0xaa){r=0;}
  130.                  if(r>=5)
  131.                  {        r=0;

  132.                     flag_zx=1;
  133.                  }
  134.            }
  135.            if(flag_zx==1)
  136.            {                     

  137.                 flag_zx=0;
  138.                
  139.                     //0         1       2       3        4               
  140.                         //起始位   地址位  功能位   数据位  结束位
  141.                         if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))          //如果开始位和结束位,还有地址都正确,进行下一步判断
  142.                         {
  143.                             if(receBuf[2]==0x01)  //修改板子地址
  144.                            {
  145.                                 add=receBuf[3];
  146.                         Sector_Erase(0);           //擦除整个扇区
  147.                     Byte_Program(0,add);//将 数据 写入 EEPROM
  148.                                 sendBuf[0]=0xaa;
  149.                                 sendBuf[1]=add;
  150.                                 sendBuf[2]=0x01;
  151.                                 sendBuf[3]=add;
  152.                                 sendBuf[4]=0xbb;
  153.                                 senduart2();
  154.                            }
  155.                            else if(receBuf[2]==0x02)  //打开单路输出
  156.                            {
  157.                                        switch(receBuf[3])
  158.                                         {
  159.                                            case 0x01:OUT1=0;break;
  160.                                            case 0x02:OUT2=0;break;
  161.                                            case 0x03:OUT3=0;break;
  162.                                            case 0x04:OUT4=0;break;
  163.                                            case 0x05:OUT5=0;break;
  164.                                            case 0x06:OUT6=0;break;
  165.                                            case 0x07:OUT7=0;break;
  166.                                            case 0x08:OUT8=0;break;
  167.                                            case 0x09:OUT9=0;break;
  168.                                            case 0x010:OUT10=0;break;
  169.                                            case 0x011:OUT11=0;break;
  170.                                            case 0x012:OUT12=0;break;
  171.                                            case 0x013:OUT13=0;break;
  172.                                            case 0x014:OUT14=0;break;
  173.                                            case 0x015:OUT15=0;break;
  174.                                         default:break;
  175.                                         }
  176.                            }
  177.                            else if(receBuf[2]==0x03)  //关闭单路输出
  178.                            {
  179.                                        switch(receBuf[3])
  180.                                         {
  181.                                            case 0x01:OUT1=1;break;
  182.                                            case 0x02:OUT2=1;break;
  183.                                            case 0x03:OUT3=1;break;
  184.                                            case 0x04:OUT4=1;break;
  185.                                            case 0x05:OUT5=1;break;
  186.                                            case 0x06:OUT6=1;break;
  187.                                            case 0x07:OUT7=1;break;
  188.                                            case 0x08:OUT8=1;break;
  189.                                            case 0x09:OUT9=1;break;
  190.                                            case 0x010:OUT10=1;break;
  191.                                            case 0x011:OUT11=1;break;
  192.                                            case 0x012:OUT12=1;break;
  193.                                            case 0x013:OUT13=1;break;
  194.                                            case 0x014:OUT14=1;break;
  195.                                            case 0x015:OUT15=1;break;
  196.                                         default:break;
  197.                                         }                       
  198.                            }
  199.                            else if(receBuf[2]==0x04)//查询输出状态
  200.                            {
  201.                                        switch(receBuf[3])
  202.                                    {
  203.                                        case 0x01: if(OUT1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  204.                                            case 0x02: if(OUT2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  205.                                        case 0x03: if(OUT3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  206.                                            case 0x04: if(OUT4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  207.                                        case 0x05: if(OUT5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  208.                                            case 0x06: if(OUT6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  209.                                        case 0x07: if(OUT7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  210.                                            case 0x08: if(OUT8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  211.                                        case 0x09: if(OUT9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  212.                                            case 0x010: if(OUT10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  213.                                        case 0x011: if(OUT11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  214.                                            case 0x012: if(OUT12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  215.                                        case 0x013: if(OUT13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  216.                                            case 0x014: if(OUT14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  217.                                        case 0x015: if(OUT15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  218.                                            default:break;
  219.                                    }
  220.                                            sendBuf[0]=0xaa;
  221.                                          sendBuf[1]=add;
  222.                                         sendBuf[2]=0x05;
  223.                                         sendBuf[4]=0xbb;  
  224.                                         senduart2();
  225.       
  226.                            }
  227.                            else if(receBuf[2]==0x06)//查询输入状态
  228.                            {
  229.                                        switch(receBuf[3])
  230.                                    {
  231.                                        case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  232.                                            case 0x02: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  233.                                        case 0x03: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  234.                                            case 0x04: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  235.                                        case 0x05: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  236.                                            case 0x06: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  237.                                        case 0x07: if(IN7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  238.                                            case 0x08: if(IN8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  239.                                        case 0x09: if(IN9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  240.                                            case 0x010: if(IN10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  241.                                        case 0x011: if(IN11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  242.                                            case 0x012: if(IN12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  243.                                        case 0x013: if(IN13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  244.                                            case 0x014: if(IN14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  245.                                        case 0x015: if(IN15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  246.                                            default:break;
  247.                                    }
  248.                                     sendBuf[0]=0xaa;
  249.                                          sendBuf[1]=add;
  250.                                         sendBuf[2]=0x07;
  251.                                         sendBuf[4]=0xbb;
  252.                                         senduart2();
  253.       
  254.                            }
  255.                           
  256.                         }
  257.                         if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  258.                         {
  259.                         add=0x00;
  260.                     Sector_Erase(0);           //擦除整个扇区
  261.             Byte_Program(0, add);//将 数据 写入 EEPROM
  262.                         sendBuf[0]=0xaa;
  263.                         sendBuf[1]=add;
  264.                         sendBuf[2]=0x00;
  265.                         sendBuf[3]=0x00;
  266.                         sendBuf[4]=0xbb;
  267.                         senduart2();
  268.                         }
  269.                         clear_receBuf();

  270. } }
  271. /********************************************************************
  272.                          串口二    发送接收中断函数
  273. *********************************************************************/
  274. void uart2_isr()  interrupt 8
  275. {
  276.    if( S2CON & 0x01 )
  277.          {
  278.              S2CON &= ~0x01;
  279.              receBuf[r++&0x0F]=S2BUF;     //把接受的数据存储到BUT数组中
  280.                  if(receBuf[0]!=0xaa){r=0;}
  281.                  if(r>=5)
  282.                  {        r=0;

  283.                     flag_zx=1;
  284.                  }
  285.            }
  286.            if(flag_zx==1)
  287.            {                     

  288.                 flag_zx=0;
  289.                
  290.                     //0         1       2       3        4               
  291.                         //起始位   地址位  功能位   数据位  结束位
  292.                         if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))          //如果开始位和结束位,还有地址都正确,进行下一步判断
  293.                         {
  294.                             if(receBuf[2]==0x01)  //修改板子地址
  295.                            {
  296.                                 add=receBuf[3];
  297.                         Sector_Erase(0);           //擦除整个扇区
  298.                     Byte_Program(0,add);//将 数据 写入 EEPROM
  299.                                 sendBuf[0]=0xaa;
  300.                                 sendBuf[1]=add;
  301.                                 sendBuf[2]=0x01;
  302.                                 sendBuf[3]=add;
  303.                                 sendBuf[4]=0xbb;
  304.                                 senduart1();
  305.                            }
  306.                            else if(receBuf[2]==0x02)  //打开单路输出
  307.                            {
  308.                                        switch(receBuf[3])
  309.                                         {
  310.                                            case 0x01:OUT1=0;break;
  311.                                            case 0x02:OUT2=0;break;
  312.                                            case 0x03:OUT3=0;break;
  313.                                            case 0x04:OUT4=0;break;
  314.                                            case 0x05:OUT5=0;break;
  315.                                            case 0x06:OUT6=0;break;
  316.                                            case 0x07:OUT7=0;break;
  317.                                            case 0x08:OUT8=0;break;
  318.                                            case 0x09:OUT9=0;break;
  319.                                            case 0x010:OUT10=0;break;
  320.                                            case 0x011:OUT11=0;break;
  321.                                            case 0x012:OUT12=0;break;
  322.                                            case 0x013:OUT13=0;break;
  323.                                            case 0x014:OUT14=0;break;
  324.                                            case 0x015:OUT15=0;break;
  325.                                         default:break;
  326.                                         }
  327.                            }
  328.                            else if(receBuf[2]==0x03)  //关闭单路输出
  329.                            {
  330.                                        switch(receBuf[3])
  331.                                         {
  332.                                            case 0x01:OUT1=1;break;
  333.                                            case 0x02:OUT2=1;break;
  334.                                            case 0x03:OUT3=1;break;
  335.                                            case 0x04:OUT4=1;break;
  336.                                            case 0x05:OUT5=1;break;
  337.                                            case 0x06:OUT6=1;break;
  338.                                            case 0x07:OUT7=1;break;
  339.                                            case 0x08:OUT8=1;break;
  340.                                            case 0x09:OUT9=1;break;
  341.                                            case 0x010:OUT10=1;break;
  342.                                            case 0x011:OUT11=1;break;
  343.                                            case 0x012:OUT12=1;break;
  344.                                            case 0x013:OUT13=1;break;
  345.                                            case 0x014:OUT14=1;break;
  346.                                            case 0x015:OUT15=1;break;
  347.                                         default:break;
  348.                                         }                       
  349.                            }
  350.                            else if(receBuf[2]==0x04)//查询输出状态
  351.                            {
  352.                                        switch(receBuf[3])
  353.                                    {
  354.                                        case 0x01: if(OUT1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  355.                                            case 0x02: if(OUT2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  356.                                        case 0x03: if(OUT3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  357.                                            case 0x04: if(OUT4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  358.                                        case 0x05: if(OUT5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  359.                                            case 0x06: if(OUT6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  360.                                        case 0x07: if(OUT7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  361.                                            case 0x08: if(OUT8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  362.                                        case 0x09: if(OUT9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  363.                                            case 0x010: if(OUT10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  364.                                        case 0x011: if(OUT11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  365.                                            case 0x012: if(OUT12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  366.                                        case 0x013: if(OUT13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  367.                                            case 0x014: if(OUT14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  368.                                        case 0x015: if(OUT15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  369.                                            default:break;
  370.                                    }
  371.                                            sendBuf[0]=0xaa;
  372.                                          sendBuf[1]=add;
  373.                                         sendBuf[2]=0x05;
  374.                                         sendBuf[4]=0xbb;  
  375.                                         senduart1();
  376.       
  377.                            }
  378.                            else if(receBuf[2]==0x06)//查询输入状态
  379.                            {
  380.                                        switch(receBuf[3])
  381.                                    {
  382.                                        case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  383.                                            case 0x02: if(IN2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  384.                                        case 0x03: if(IN3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  385.                                            case 0x04: if(IN4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  386.                                        case 0x05: if(IN5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  387.                                            case 0x06: if(IN6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  388.                                        case 0x07: if(IN7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  389.                                            case 0x08: if(IN8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  390.                                        case 0x09: if(IN9==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  391.                                            case 0x010: if(IN10==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  392.                                        case 0x011: if(IN11==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  393.                                            case 0x012: if(IN12==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  394.                                        case 0x013: if(IN13==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  395.                                            case 0x014: if(IN14==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  396.                                        case 0x015: if(IN15==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  397.                                            default:break;
  398.                                    }
  399.                                     sendBuf[0]=0xaa;
  400.                                          sendBuf[1]=add;
  401.                                         sendBuf[2]=0x07;
  402.                                         sendBuf[4]=0xbb;
  403.                                         senduart1();
  404.       
  405.                            }
  406.                           
  407.                         }
  408.                         if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  409.                         {
  410.                         add=0x00;
  411.                     Sector_Erase(0);           //擦除整个扇区
  412.             Byte_Program(0, add);//将 数据 写入 EEPROM
  413.                         sendBuf[0]=0xaa;
  414.                         sendBuf[1]=add;
  415.                         sendBuf[2]=0x00;
  416.                         sendBuf[3]=0x00;
  417.                         sendBuf[4]=0xbb;
  418.                         senduart1();
  419.                         }
  420.                         clear_receBuf();

  421. }


  422. }
  423. /********************************************************************
  424.                             结束主函数
  425. *********************************************************************/
  426. //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
  427. uchar Byte_Read(uint add)
  428. {
  429.     IAP_DATA = 0x00;
  430.     IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
  431.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字节读命令

  432.     my_unTemp16.un_temp16 = add;
  433.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
  434.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

  435.     //EA = 0;
  436.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
  437.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
  438.     _nop_();
  439.     //EA = 1;
  440.     IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  441.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  442.     return (IAP_DATA);
  443. }

  444. //字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
  445. void Byte_Program(uint add, uchar ch)
  446. {
  447.     IAP_CONTR = ENABLE_ISP;         //打开 IAP 功能, 设置Flash 操作等待时间
  448.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字节编程命令

  449.     my_unTemp16.un_temp16 = add;
  450.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
  451.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

  452.     IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
  453.     //EA = 0;
  454.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
  455.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
  456.     _nop_();
  457.     //EA = 1;
  458.     IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  459.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  460. }

  461. //擦除扇区, 入口:DPTR = 扇区地址
  462. void Sector_Erase(uint add)
  463. {
  464.     IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
  465.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇区擦除命令

  466.     my_unTemp16.un_temp16 = add;
  467.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
  468.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

  469.     //EA = 0;
  470.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
  471.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
  472.     _nop_();
  473.     //EA = 1;
  474.     IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  475.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  476. }

  477. void IAP_Disable()
  478. {
  479.     //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  480.     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  481.     IAP_CONTR = 0;      //关闭IAP 功能
  482.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
  483.     IAP_TRIG  = 0;      //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
  484.     IAP_ADDRH = 0;
  485.     IAP_ADDRL = 0;
  486. }

  487. /********************************************************************
  488.                               结束
  489. *********************************************************************/
复制代码




【图片预览】

【下载说明】
第一步:准备工控板、电源、串口通讯线、电脑
第二步:串口线连接工控板和电脑。
第三步:打开下载软件。(STC_ISP_V479
步:下载设置。(查看串口号)
步:选择单片机型号,并选择对应的串口号。
注意:下载前一定要先安装串口线驱动程序。
第六步:调入要下载的文件(扩展名为:HEX的文件)
第七步:点击Download/下载等待软件提示给工控板供电。
第八步:给工控板供电并等待下载完成。
第九步:下载进行中。。。。。。等待下载完成!
第十步:下载完成即可进行测试。



全部资料51hei下载地址(包含源码 原理图等详细资料):

15路继电器可编程模块485及232产品使用手册设计资料.pdf

2.46 MB, 下载次数: 83, 下载积分: 黑币 -5

GYJ-0065_15路继电器可编程模块485及232产品使用手册.doc

9.94 MB, 下载次数: 99, 下载积分: 黑币 -5

GYJ-0065_15路继电器可编程模块485及232原理图及PCB图.pdf

1.66 MB, 下载次数: 101, 下载积分: 黑币 -5

仿modbus程序 232和485通信 输入查询方式.rar

60.55 KB, 下载次数: 104, 下载积分: 黑币 -5

通过串口1或2与上位机通讯可查询输入输出状态.rar

101.84 KB, 下载次数: 97, 下载积分: 黑币 -5

回复

使用道具 举报

ID:84765 发表于 2018-2-26 16:55 | 显示全部楼层
通过串口1或2与上位机通讯可查询输入输出状态.rar  这都下载不了
回复

使用道具 举报

ID:47652 发表于 2018-2-27 15:22 | 显示全部楼层
很好的资料,多谢分享
回复

使用道具 举报

ID:164172 发表于 2018-4-7 10:11 | 显示全部楼层
没有模拟量输入  差评
回复

使用道具 举报

ID:352811 发表于 2018-6-16 22:06 | 显示全部楼层

很好的资料,多谢分享
回复

使用道具 举报

ID:352984 发表于 2018-6-17 09:27 来自手机 | 显示全部楼层
要是能支持RTU协议就可以做SCADA了
回复

使用道具 举报

ID:356451 发表于 2018-6-22 09:19 | 显示全部楼层
刚刚同一个链接点了两下,就浪费了5黑币,怎么没有预防设置呢
回复

使用道具 举报

ID:462629 发表于 2019-5-2 11:03 | 显示全部楼层
这个好用不,可以PLC编程的吗
回复

使用道具 举报

ID:462629 发表于 2019-5-2 11:10 | 显示全部楼层
最后只好全部下了,还是没有原理图的一些元件参数
还扣了那么多分,这也太不厚道了
楼主是不是故意骗分的
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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