找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3424|回复: 2
收起左侧

GYJ-0099_458通讯控制工控板(八路控制)单片机源码与资料分享

[复制链接]
ID:280979 发表于 2018-3-18 01:05 | 显示全部楼层 |阅读模式
GYJ-0099_458通讯控制工控板八路控制产品使用说明书
【简要说明】
一、尺寸:长176mmX宽72mmX高20mm
二、主要芯片:单片机STC12C2052AD 继电器 光耦
三、工作电压:有直流12V及24V可选。
四、特点:
电路结构简单,稳定可靠,采用最新款STC单片机,运行速度快
1、具有8继电器吸合指示灯,电源指示灯
2、板子功耗小于5W
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、485通信控制,可以多块联机。
14、8路输出开关量输出(即:干接点输出)
15、具有TTL(UART)通讯和RS485通讯两种模式可选。
16、资料开源,客户可以自己编程
17、可以选择使用内部EEPROM 作为存储单元
18、电路具有,防反接保护、过流保护、续流保护等
19、单片机可以自行更换,可以选择替换型的STC系列单片机
20、我们提供电路相关的,原理图、例程、开发环境、下载软件等相关资料
适用场合:工业控制、产品开发、项目设计,自动化改造等
【标注说明】
接线说明
  
输出控制设备

输出举例说明(开关量输出、干接点输出)
下载口说明也可以UART

485通信说明
默认发货程序协议提供源代码客户可以自己更改。
485通讯控制板通讯协议
波特率 9600
通讯协议格式如下:发送十六进制
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00~FF
01~05
00~FF
BB
解释
第一个数据
第二个数据
第三个数据
第四个数据
最后一个数据
功能1:改变板子地址
举例:更改地址:(发货默认地址00注意:多个板子并联使用时需要不同地址

协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
01
01
BB
解释
开始数据
向00地址发送
改变地址
将地址改成01
数据结束
功能2:打开某个继电器
举例:打开第一块板子的第一个继电器

协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
02
01
BB
解释
开始数据
向00地址发送
打开某路功能
打开第一路
数据结束
功能3:关闭某个继电器
举例:关闭第二路板子的第三个继电器

协议
启始位
地址位
功能位
数据位
结束位
控制
AA
01
03
03
BB
解释
开始数据
向01地址发送
关闭某路功能
关闭第三路
数据结束
功能4:打开某块板子的所有继电器
举例:打开第一块板子的全部继电器

协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
04
FF
BB
解释
开始数据
向00地址发送
打开所有功能
打开所有继电器
数据结束
功能5:关闭某块板子的所有继电器
举例:关闭第三块板子的全部继电器

协议
启始位
地址位
功能位
数据位
结束位
控制
AA
02
05
00
BB
解释
开始数据
向02地址发送
关闭所有功能
关闭所有继电器
数据结束
功能6:查询继电器状态
举例:查询第一块板子的第二路状态

协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
06
02
BB
解释
开始数据
向00地址发送
查询功能
查询第二路
数据结束
查询返回信息分析 继电器关闭返回值(关闭返回00)
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
07
00
BB
解释
开始数据
00地址返回
返回功能
继电器状态关闭
数据结束
查询返回信息分析 继电器打开返回值(打开返回01)
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
07
01
BB
解释
开始数据
00地址返回
返回功能
继电器状态打开
数据结束
板子地址清零控制
协议
启始位
地址位
功能位
数据位
结束位
控制
AA
00
00
00
BB
解释
开始数据
00
地址清零

数据结束

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

默认发货程序提供源代码客户可以自己更改。
  1. #include "main.h"
  2. #include "init.h"

  3. //#define address 0x00                    //板子地址
  4. #define ENABLE_IAP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
  5. #define CMD_IDLE 0jm
  6. #define CMD_READ 1
  7. #define CMD_PROGRAM 2
  8. #define CMD_ERASE 3
  9. #define ENABLE_IAP 0x83//SYSCLK<12MH
  10. #define IAP_ADDRESS 0x0000              //存储地址
  11. sfr IAP_DATA = 0xE2;
  12. sfr IAP_ADDRH = 0xE3;
  13. sfr IAP_ADDRL = 0xE4;
  14. sfr IAP_CMD = 0xE5;
  15. sfr IAP_TRIG = 0xE6;
  16. sfr IAP_CONTR = 0xE7;

  17. uint8 add;    //掉电保持485的地址
  18. uint8 j=0;
  19. uint8 dat=0X00;   
  20. bit flag_zx=0;

  21. uint8 sendPosi=0;     //发送缓冲区指针
  22. uint8 receCount=0;    //接收缓冲区指针
  23. uint8 sendCount=0;    //需要发送数据个数
  24. uint8 receTimeOut=0;  //通讯超时值
  25. uint8 byteCount=5;    //发送个数

  26. uint8 sendBuf[10];                //发送缓冲区
  27. uint8 receBuf[10];    //接收缓冲区
  28. /********************************************************************
  29.                             定义 ISP/IAP/EEPROM 命令
  30. *********************************************************************/

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


  35. void delay()//延时程序
  36. {
  37.               uint8 m,n,s;
  38.               for(m=100;m>0;m--)
  39.               for(n=200;n>0;n--)
  40.               for(s=248;s>0;s--);
  41. }




  42. /****************发送函数*********************/
  43. void senduart2()
  44. {
  45.     sendPosi++;
  46.     SBUF=sendBuf[0];
  47. }
  48. /*****************清空发送缓冲区*************************/
  49. void clear_receBuf()
  50. {
  51.     uint8 i;
  52.               for(i=0;i<8;i++)
  53.               {
  54.                   receBuf[i]=0;
  55.               }
  56. }
  57. void main()
  58. {
  59.               delay();
  60.     clear_receBuf();
  61.     add= IapReadByte(0x01);//读取存储的值
  62.               if(add==0xff)
  63.                  add=0x00;
  64.     t0_init(1);     //1ms
  65.     ConfigUART1(9600);
  66.               TR0=1;
  67.               EA=1;

  68.                                  

  69.     while(1)
  70.               {

  71.                  if(flag_zx==1)
  72.                  {  
  73.                       flag_zx=0;
  74.                                 //0         1       2       3        4                           
  75.                                           //起始位   地址位  功能位   数据位  结束位
  76.                                           if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add))                //如果开始位和结束位,还有地址都正确,进行下一步判断
  77.                                           {
  78.                                              if(receBuf[2]==0x01)  //修改板子地址
  79.                                              {
  80.                                                   add=receBuf[3];
  81.                                                             IapEraseSector(0);  //擦除扇区
  82.                     IapProgramByte(0x01,add);//写入新的地址                                      
  83.                                              }
  84.                                              else if(receBuf[2]==0x02)  //打开单路继电器
  85.                                              {
  86.                                                                switch(receBuf[3])
  87.                                                                       {
  88.                                                                           case 0x01: OUT1=0; break;
  89.                                                                                     case 0x02: OUT2=0; break;
  90.                                                                                     case 0x03: OUT3=0; break;
  91.                                                                                     case 0x04: OUT4=0; break;
  92.                                                                                     case 0x05: OUT5=0; break;
  93.                                                                                     case 0x06: OUT6=0; break;
  94.                                                                                     case 0x07: OUT7=0; break;
  95.                                                                                     case 0x08: OUT8=0; break;
  96.                                                                       }
  97.                                              }
  98.                                              else if(receBuf[2]==0x03)  //关闭单路继电器
  99.                                              {
  100.                                                                switch(receBuf[3])
  101.                                                                       {
  102.                                                                           case 0x01: OUT1=1; break;
  103.                                                                                     case 0x02: OUT2=1; break;
  104.                                                                                     case 0x03: OUT3=1; break;
  105.                                                                                     case 0x04: OUT4=1; break;
  106.                                                                                     case 0x05: OUT5=1; break;
  107.                                                                                     case 0x06: OUT6=1; break;
  108.                                                                                     case 0x07: OUT7=1; break;
  109.                                                                                     case 0x08: OUT8=1; break;
  110.                                                                       }                                 
  111.                                              }
  112.                                              else if(receBuf[2]==0x04)  //打开全部继电器
  113.                                              {
  114.                                                   if(receBuf[3]==0xff)
  115.                                                   {
  116.                                                                           OUT1=0;
  117.                                                                                     OUT2=0;
  118.                                                                                     OUT3=0;
  119.                                                                                     OUT4=0;
  120.                                                                                     OUT5=0;
  121.                                                                                     OUT6=0;
  122.                                                                                     OUT7=0;
  123.                                                                                     OUT8=0;
  124.                                                                       }
  125.                                              }
  126.                                              else if(receBuf[2]==0x05)  //关闭全部继电器
  127.                                              {
  128.                                                   if(receBuf[3]==0x00)
  129.                                                   {
  130.                                                                           OUT1=1;
  131.                                                                                     OUT2=1;
  132.                                                                                     OUT3=1;
  133.                                                                                     OUT4=1;
  134.                                                                                     OUT5=1;
  135.                                                                                     OUT6=1;
  136.                                                                                     OUT7=1;
  137.                                                                                     OUT8=1;
  138.                                                                       }                                 
  139.                                              }
  140.                                              else if(receBuf[2]==0x06)  //查询继电器
  141.                                              {
  142.                                                                       sendBuf[0]=0xaa;
  143.                                                                       sendBuf[1]=add;
  144.                                                                       sendBuf[2]=0x07;
  145.                                                                       //sendBuf[3]=0xfe;
  146.                                                                       sendBuf[4]=0xbb;
  147.                                                                       senduart2();
  148.                                                  switch(receBuf[3])
  149.                                                            {
  150.                                                                case 0x01: if(OUT1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  151.                                                                          case 0x02: if(OUT2==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  152.                                                                          case 0x03: if(OUT3==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  153.                                                                          case 0x04: if(OUT4==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  154.                                                                          case 0x05: if(OUT5==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  155.                                                                          case 0x06: if(OUT6==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  156.                                                                          case 0x07: if(OUT7==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  157.                                                                          case 0x08: if(OUT8==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;
  158.                                                                          default:break;
  159.                                                            }
  160.                                              }                                          
  161.                                           }
  162.                                           if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3]==0x00)&&(receBuf[4]==0xbb))
  163.                                           {
  164.                                                   add=0x00;
  165.                                                             IapEraseSector(0);  //擦除扇区
  166.                     IapProgramByte(0x01,0x00);//写入新的地址                                                         
  167.                                           }
  168.                                           clear_receBuf();
  169.                             }
  170.               }
  171. }


  172. /**********************************************************
  173. 放在主函数,定时0溢出中断函数,
  174. *********************/
  175. void t0(void) interrupt 1 using 0 //定时中断服务函数
  176. {
  177.                 TH0=T0RH;
  178.               TL0=T0RL;
  179.               if(receTimeOut>0)                 
  180.               {
  181.                     receTimeOut--;
  182.                               if((receTimeOut==0)&&(receCount>0))    //如果10ms接收不到数据,把数据指针清零,重新更新缓冲区
  183.                               {
  184.                                              receCount=0;                      //接收缓冲区指针
  185.                               }
  186.               }
  187. }
  188. /********************* 串口1中断服务函数 ********************************/
  189. void InterruptUART() interrupt 4
  190. {
  191.               if(TI)
  192.               {
  193.                             TI = 0;
  194.                             if(sendPosi<byteCount)
  195.         {
  196.                      SBUF=sendBuf[sendPosi];                           
  197.                      sendPosi++;
  198.                   }
  199.                   else
  200.                      sendPosi=0;
  201.                    }
  202.               else if(RI)
  203.               {
  204.                             RI = 0;
  205.                             receTimeOut = 10;    //通讯超时值
  206.                             receBuf[receCount] = SBUF;
  207.                             receCount++;          //接收地址偏移寄存器加1
  208.                             if(receCount>4)
  209.                               flag_zx=1;
  210.                             receCount &= 0x0f;    //最多一次只能接收16个字节
  211.               }
  212. }

  213. void IapIdle(){//禁用 ISP/IAP/EEPROM functionmake 单片机 在 一 安全 状态
  214.     IAP_CONTR = 0;                 //
  215.               IAP_CMD = 0;                 //
  216.               IAP_TRIG = 0;                 //
  217.               IAP_ADDRH = 0x80;  //
  218.               IAP_ADDRL = 0;                 //
  219. }
  220. uint8 IapReadByte(uint16 addr){//读数据
  221.    uint8 dat;
  222.    IAP_CONTR = ENABLE_IAP;
  223.    IAP_CMD = CMD_READ;
  224.    IAP_ADDRL = addr;
  225.    IAP_ADDRH = addr >> 8;
  226.    IAP_TRIG = 0x46;
  227.    IAP_TRIG = 0xb9;
  228.    _nop_();
  229.    dat = IAP_DATA;
  230.    IapIdle();
  231.    return dat;
  232. }
  233. void IapProgramByte(uint16 addr, uint8 dat){//写数据
  234.    IAP_CONTR = ENABLE_IAP;
  235.    IAP_CMD = CMD_PROGRAM;
  236.    IAP_ADDRL = addr;
  237.    IAP_ADDRH = addr >> 8;
  238.    IAP_DATA = dat;
  239.    IAP_TRIG = 0x46;
  240.    IAP_TRIG = 0xb9;
  241.    _nop_();
  242.    IapIdle();
  243. }
  244. void IapEraseSector(uint16 addr){//擦除数据
  245.    IAP_CONTR = ENABLE_IAP;
  246.    IAP_CMD = CMD_ERASE;
  247.    IAP_ADDRL = addr;
  248.    IAP_ADDRH = addr >> 8;
  249.    IAP_TRIG = 0x46;
  250.    IAP_TRIG = 0xb9;
  251.    _nop_();
  252.    IapIdle();
  253. }
复制代码
0.png

全部资料51hei下载地址:
GYJ-0099_458通讯控制工控板八路控制发货资料.rar (9.45 MB, 下载次数: 28)
回复

使用道具 举报

ID:338810 发表于 2018-10-12 13:28 | 显示全部楼层
黑币太贵了,希望有用
回复

使用道具 举报

ID:140085 发表于 2018-11-9 15:26 | 显示全部楼层
波特率可以修改吗,只能9600?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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