找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单路485通讯可编程继电器开发模块 附单片机控制程序与原理图等资料

  [复制链接]
跳转到指定楼层
楼主
原理图如下:


【简要说明】
一、 尺寸:长78mmX宽47mmX高24mm
二、 主要芯片:STC单片机 MAX485芯片
三、 工作电压:直流5~36V
四、特点:
    可编程控制,提供原理图,例程及相关资料,提供程序源代码,提供相关资料!客户可以通过485端口对继电器进行开关控制,也可以通过编程自由控制!
1、具有信号指示灯,继电器吸合指示灯。
2、板子功耗小于1W
3、额定切换电流10A以内,切换电压250V以内
4、最大切换功率300W
5、继电器寿命1000000次以上。
6、电器绝缘电阻100M
7、触电耐压1000V
8、继电器最大吸合时间15mS 毫秒
9、继电器最大释放时间5mS  毫秒
10、工作温度-40度至 +70度
11、工作湿度 40%  ~ 80%RH
适用场合:远程通信控制,可编程控制,输入输出控制,仪器仪表监控。
12、使用说明:
【标注说明】
【接线说明】
   
【应用举例下载线连接图同时可以TTL控制
【应用举例485接线图
【实用接线】

单路输入输出带485模块带输入发送协议与测试程序

485通讯控制板通讯协议

波特率 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地址返回
  
  返回功能
  
  输入状态打开
  
  数据结束
  
   
   
  
  板子地址清零控制(用于地址不清晰或者忘记,在485总线下禁止操作,只可对其单独清零)
  
  协议
  
  启始位
  
  地址位
  
  功能位
  
  数据位
  
  结束位
  
  控制
  
  AA
  
  00
  
  00
  
  00
  
  BB
  
  解释
  
  开始数据
  
  00
  
  地址清零
  
   
  
  数据结束
  

IN1给开关信号发送 AA 00 10 FF  BB  第二位是地址位

单片机源程序如下:
  1. #include "main.h"
  2. #include "init.h"

  3. #define ENABLE_IAP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
  4. #define CMD_IDLE 0
  5. #define CMD_READ 1
  6. #define CMD_PROGRAM 2
  7. #define CMD_ERASE 3
  8. #define ENABLE_IAP 0x83//SYSCLK<12MH
  9. #define IAP_ADDRESS 0x0000        //存储地址


  10. uint8 add;    //掉电保持485的地址
  11. uint8 j=0;
  12. uint8 dat=0X00;   
  13. bit flag_zx=0;

  14. uint8 sendPosi=0;     //发送缓冲区指针
  15. uint8 receCount=0;    //接收缓冲区指针
  16. uint8 sendCount=0;    //需要发送数据个数
  17. uint8 receTimeOut=0;  //通讯超时值
  18. uint8 byteCount=5;    //发送个数

  19. uint8 sendBuf[10];          //发送缓冲区
  20. uint8 receBuf[10];    //接收缓冲区

  21. /********************************************************************
  22.                            定义数据类型
  23. *********************************************************************/
  24. uint8 TBUF,RBUF;
  25. uint8 TDAT,RDAT;
  26. uint8 TCNT,RCNT;
  27. uint8 TBIT,RBIT;
  28. bit TING,RING;
  29. bit TEND,REND;
  30. bit bz1=0;
  31. uint8 t,r,ii;                  //定义数据类型
  32. uint8 but[16];          //数据存储数组
  33. /********************************************************************
  34.                             定义 ISP/IAP/EEPROM 命令
  35. *********************************************************************/

  36. void IapIdle();//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  37. uint8 IapReadByte(uint16 addr);//读数据
  38. void IapProgramByte(uint16 addr, uint8 dat);//写数据
  39. void IapEraseSector(uint16 addr);//擦除数据


  40. void delay()//延时程序
  41. {
  42.         uint8 m,n,s;
  43.         for(m=100;m>0;m--)
  44.         for(n=200;n>0;n--)
  45.         for(s=248;s>0;s--);
  46. }
  47. void delay1()//延时程序
  48. {
  49.         uint8 m,n,s;
  50.         for(m=10;m>0;m--)
  51.         for(n=20;n>0;n--)
  52.         for(s=148;s>0;s--);
  53. }
  54. /****************发送函数*********************/
  55. void send1()
  56. {          
  57. sendBuf[0]=0xaa;
  58. sendBuf[1]=add;
  59. sendBuf[2]=0x10;
  60. sendBuf[3]=0xff;
  61. sendBuf[4]=0xbb;
  62. }
  63. /****************发送函数*********************/
  64. void senduart2()
  65. {            RS485_DIR=1;
  66.         for(ii=0;ii<5;ii++)
  67.                 {
  68.                     if(TEND)          //允许发送
  69.                         {
  70.                                  TEND=0;
  71.                                  TBUF=sendBuf[t++&0x0F];
  72.                                  TING=1;
  73.                         }
  74.                         while(!TEND);
  75.                 }
  76.                 t=0;
  77.                 RS485_DIR=0;
  78. }
  79. /*****************清空发送缓冲区*************************/
  80. void clear_receBuf()
  81. {
  82.     uint8 i;
  83.         for(i=0;i<5;i++)
  84.         {
  85.             receBuf[i]=0;
  86.         }
  87. }
  88. void main()
  89. {
  90.         delay();
  91.     clear_receBuf();
  92.     add= IapReadByte(0x01);//读取存储的值
  93.         if(add==0xff)
  94.            add=0x00;
  95.     ConfigUART1();
  96.         TR0=1;
  97.         EA=1;
  98. //   TEND=0;
  99. //        REND=0;               

  100.     while(1)
  101.         {  
  102.   if((IN1==0)&&(bz1==0)){delay1();if(IN1==0){bz1=1;send1();senduart2();clear_receBuf();OUT1=0;}}if((IN1==1)&&(bz1==1)){bz1=0;OUT1=1;}
  103.            if(REND)  //如果有接收
  104.            {
  105.              REND=0; //接收标志清零
  106.              receBuf[r++&0x0F]=RBUF;     //把接受的数据存储到BUT数组中
  107.                  if(receBuf[0]!=0xaa){r=0;}
  108.                  if(r>=5)
  109.                  {        r=0;

  110.                     flag_zx=1;
  111.                  }
  112.            }
  113.            if(flag_zx==1)
  114.            {                     

  115.                 flag_zx=0;
  116.                     //0         1       2       3        4               
  117.                         //起始位   地址位  功能位   数据位  结束位
  118.                         if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))          //如果开始位和结束位,还有地址都正确,进行下一步判断
  119.                         {
  120.                            if(receBuf[2]==0x01)  //修改板子地址
  121.                            {
  122.                                 add=receBuf[3];
  123.                                     IapEraseSector(0);  //擦除扇区
  124.                     IapProgramByte(0x01,add);//写入新的地址                           
  125.                            }
  126.                            else if(receBuf[2]==0x02)  //打开单路继电器
  127.                            {
  128.                                        switch(receBuf[3])
  129.                                         {
  130.                                             case 0x01: OUT1=0; break;
  131.                                         }
  132.                            }
  133.                            else if(receBuf[2]==0x03)  //关闭单路继电器
  134.                            {
  135.                                        switch(receBuf[3])
  136.                                         {
  137.                                             case 0x01: OUT1=1; break;
  138.                                         }                       
  139.                            }
  140.                            else if(receBuf[2]==0x04)  //打开全部继电器
  141.                            {
  142.                                 if(receBuf[3]==0xff)
  143.                                 {
  144.                                             OUT1=0;
  145.                                         }  
  146.                            }
  147.                            else if(receBuf[2]==0x05)  //关闭全部继电器
  148.                            {
  149.                                 if(receBuf[3]==0x00)
  150.                                 {
  151.                                             OUT1=1;
  152.                                         }                       
  153.                            }
  154.                            else if(receBuf[2]==0x06)  //查询继电器
  155.                            {
  156.                                         sendBuf[0]=0xaa;
  157.                                         sendBuf[1]=add;
  158.                                         sendBuf[2]=0x07;
  159.                                         //sendBuf[3]=0xfe;
  160.                                         sendBuf[4]=0xbb;       
  161.                                switch(receBuf[3])
  162.                                    {
  163.                                        case 0x01: if(OUT1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  164.                                            default:break;
  165.                                    }  
  166.                                    senduart2();
  167.                            }
  168.                            else if(receBuf[2]==0x08)  //查询输入
  169.                            {
  170.                                         sendBuf[0]=0xaa;
  171.                                         sendBuf[1]=add;
  172.                                         sendBuf[2]=0x09;
  173.                                         //sendBuf[3]=0xfe;
  174.                                         sendBuf[4]=0xbb;
  175.                                
  176.                                switch(receBuf[3])
  177.                                    {
  178.                                        case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  179.                                            default:break;
  180.                                    }  
  181.                                         senduart2();
  182.                            }                          
  183.                         }
  184.                         if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  185.                         {
  186.                                 add=0x00;
  187.                                     IapEraseSector(0);  //擦除扇区
  188.                     IapProgramByte(0x01,0x00);//写入新的地址
  189.                                         sendBuf[0]=0xaa;
  190.                                         sendBuf[1]=add;
  191.                                         sendBuf[2]=0x00;
  192.                                         sendBuf[3]=0x00;
  193.                                         sendBuf[4]=0xbb;
  194.                                         senduart2();                                  
  195.                         }
  196.                         clear_receBuf();
  197.                 }
  198.         }
  199. }


  200. // /**********************************************************
  201. //放在主函数,定时0溢出中断函数,
  202. //*********************/
  203. void tm0()interrupt 1 using 1
  204. {
  205. if(RING)
  206.   {
  207.    if(--RCNT==0)
  208.     {
  209.          RCNT=3;
  210.          if(--RBIT==0)
  211.         {
  212.                  RBUF=RDAT;
  213.                  RING=0;
  214.          REND=1;
  215.                 }
  216.                 else
  217.                 {
  218.                  RDAT>>=1;
  219.                  if(RXB)RDAT|=0X80;
  220.                 }

  221.     }
  222.   }
  223.     else if(!RXB)
  224.         {
  225.          RING=1;
  226.          RCNT=4;
  227.          RBIT=9;
  228.         }
  229.     if(--TCNT==0)
  230.         {
  231.         TCNT=3;


  232.         if(TING)
  233.         {
  234.           if(TBIT==0)
  235.           {
  236.           TXB=0;
  237.           TDAT=TBUF;
  238.           TBIT=9;
  239.           }
  240.           else
  241.           {
  242.           TDAT>>=1;
  243.           if(--TBIT==0)
  244.           {
  245.            TXB=1;
  246.            TING=0;
  247.            TEND=1;
  248.           }
  249.           else
  250.           {
  251.           TXB=CY;
  252.           }
  253.           }
  254.         }
  255.         }
  256. }
  257. void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  258.     IAP_CONTR = 0;           //
  259.         IAP_CMD = 0;           //
  260.         IAP_TRIG = 0;           //
  261.         IAP_ADDRH = 0x80;  //
  262.         IAP_ADDRL = 0;           //
  263. }
  264. uint8 IapReadByte(uint16 addr){//读数据
  265.    uint8 dat;
  266.    IAP_CONTR = ENABLE_IAP;
  267.    IAP_CMD = CMD_READ;
  268.    IAP_ADDRL = addr;
  269.    IAP_ADDRH = addr >> 8;
  270.    IAP_TRIG = 0x5A;
  271.    IAP_TRIG = 0xA5;
  272.    _nop_();
  273.    dat = IAP_DATA;
  274.    IapIdle();
  275.    return dat;
  276. }
  277. void IapProgramByte(uint16 addr, uint8 dat){//写数据
  278.    IAP_CONTR = ENABLE_IAP;
  279.    IAP_CMD = CMD_PROGRAM;
  280.    IAP_ADDRL = addr;
  281.    IAP_ADDRH = addr >> 8;
  282.    IAP_DATA = dat;
  283.    IAP_TRIG = 0x5A;
  284.    IAP_TRIG = 0xA5;
  285.    _nop_();
  286.    IapIdle();
  287. }
  288. void IapEraseSector(uint16 addr){//擦除数据
  289.    IAP_CONTR = ENABLE_IAP;
  290.    IAP_CMD = CMD_ERASE;
  291.    IAP_ADDRL = addr;
  292.    IAP_ADDRH = addr >> 8;
  293.    IAP_TRIG = 0x5A;
  294.    IAP_TRIG = 0xA5;
  295.    _nop_();
  296.    IapIdle();
  297. }
复制代码
【通信协议(字符控制协议)】购后提供源代码
单片机与PC机采用485通讯,波特率默认为9600.
单片机接收PC机发送的ASC||数据码表如下:
01、开关继电器:PC发送'A';继电器吸合 发送'a' 继电器断开
02、输出状态查询:PC发送B;单片机返回输出状态‘C’表示继电器开 ‘c’表示继电器关;
03、输入状态查询:PC发送b;单片机有输入返回输入状态‘D’无输入返回 ‘d’表示关;
04、继电器状态取反:PC发送E 继电器状态取反

【通信协议(仿mod bus控制协议)】购后提供源代码

全部资料51hei下载地址:

GYJ-0071_单路输入输出可编程485控制模块产品使用手册.doc

3.24 MB, 下载次数: 79, 下载积分: 黑币 -5

GYJ-0071_单路输入输出可编程485控制模块原理图及PCB图.pdf

307.29 KB, 下载次数: 88, 下载积分: 黑币 -5

单路输入输出带485模块带输入发送测试程序.rar

59.31 KB, 下载次数: 94, 下载积分: 黑币 -5

单路输入输出带485模块带输入输入查询方式.rar

50.24 KB, 下载次数: 77, 下载积分: 黑币 -5

配套程序.rar

152.93 KB, 下载次数: 94, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:47652 发表于 2018-2-27 15:31 | 只看该作者
好资料,收藏
回复

使用道具 举报

板凳
ID:834124 发表于 2020-10-24 20:54 | 只看该作者
没币,先收藏吧。
回复

使用道具 举报

地板
ID:65956 发表于 2020-10-26 08:58 | 只看该作者
按你写的这功能,程序是无比的简单,还用得着这么神秘,是在作广告吧
回复

使用道具 举报

5#
ID:97678 发表于 2020-10-26 11:31 | 只看该作者
当然是广告啊! 文章里面不是说了嘛! 购买后提供源码!!!
回复

使用道具 举报

6#
ID:830252 发表于 2020-11-6 10:39 | 只看该作者
好资料,收藏
回复

使用道具 举报

7#
ID:498757 发表于 2020-12-3 09:36 | 只看该作者
好东西   这是我一直想要的
回复

使用道具 举报

8#
ID:620291 发表于 2021-8-18 21:40 | 只看该作者
好东西   这是我一直想要的
回复

使用道具 举报

9#
ID:334781 发表于 2021-12-7 17:28 | 只看该作者
楼主毫无保留的把全部的资料都贡献了出来,太让人感动了,谢谢!下载这来学习一下。
回复

使用道具 举报

10#
ID:933601 发表于 2022-7-20 20:24 | 只看该作者
#在这里快速回复# 感谢楼主的资料
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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