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

  • 格式:doc
  • 大小:3.28 MB
  • 文档页数:19

GYJ-0071_单路输入输出可编程485控制模块产品使用手册【简要说明】一、尺寸:长78mmX宽47mmX高24mm二、主要芯片:STC单片机 MAX485芯片三、工作电压:直流5~36V四、特点:可编程控制,提供原理图,例程及相关资料,提供程序源代码,提供相关资料!客户可以通过485端口对继电器进行开关控制,也可以通过编程自由控制!1、具有信号指示灯,继电器吸合指示灯。

2、板子功耗小于1W3、额定切换电流10A以内,切换电压250V以内4、最大切换功率300W5、继电器寿命1000000次以上。

6、电器绝缘电阻100M7、触电耐压1000V8、继电器最大吸合时间15mS 毫秒9、继电器最大释放时间5mS 毫秒10、工作温度-40度至+70度11、工作湿度40% ~ 80%RH适用场合:远程通信控制,可编程控制,输入输出控制,仪器仪表监控。

12、使用说明:【标注说明】【接线说明】【应用举例下载线连接图同时可以TTL控制】【应用举例485接线图】【实用接线】【通信协议(字符控制协议)】购买后提供源代码单片机与PC机采用485通讯,波特率默认为9600.单片机接收PC机发送的ASC||数据码表如下:01、开关继电器:PC发送'A';继电器吸合发送'a' 继电器断开02、输出状态查询:PC发送B;单片机返回输出状态‘C’表示继电器开‘c’表示继电器关;03、输入状态查询:PC发送b;单片机有输入返回输入状态‘D’无输入返回‘d’表示关;04、继电器状态取反:PC发送E 继电器状态取反【通信协议(仿mod bus控制协议)】购买后提供源代码波特率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:关闭继电器举例:关闭第二路板子的继电器协议启始位地址位功能位数据位结束位解释开始数据向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)协议启始位地址位功能位数据位结束位解释开始数据00地址返回返回功能输入状态关闭数据结束查询返回信息分析输入返回值(打开返回01)协议启始位地址位功能位数据位结束位控制AA 00 09 FF BB解释开始数据00地址返回返回功能输入状态打开数据结束板子地址清零控制(用于地址不清晰或者忘记,在485总线下禁止操作,只可对其单独清零) 协议启始位地址位功能位数据位结束位控制AA 00 00 00 BB解释开始数据00 地址清零数据结束【原理图】【尺寸图】#include "main.h"#include "init.h"#define ENABLE_IAP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值#define CMD_IDLE 0#define CMD_READ 1#define CMD_PROGRAM 2#define CMD_ERASE 3#define ENABLE_IAP 0x83//SYSCLK<12MH#define IAP_ADDRESS 0x0000 //存储地址uint8 add; //掉电保持485的地址uint8 j=0;uint8 dat=0X00;bit flag_zx=0;uint8 sendPosi=0; //发送缓冲区指针uint8 receCount=0; //接收缓冲区指针uint8 sendCount=0; //需要发送数据个数uint8 receTimeOut=0; //通讯超时值uint8 byteCount=5; //发送个数uint8 sendBuf[10]; //发送缓冲区uint8 receBuf[10]; //接收缓冲区/********************************************************************定义数据类型*********************************************************************/ uint8 TBUF,RBUF;uint8 TDAT,RDAT;uint8 TCNT,RCNT;uint8 TBIT,RBIT;bit TING,RING;bit TEND,REND;bit bz1=0;uint8 t,r,ii; //定义数据类型uint8 but[16]; //数据存储数组/********************************************************************定义ISP/IAP/EEPROM 命令*********************************************************************/void IapIdle();//禁用ISP/IAP/EEPROM functionmake 单片机在一安全状态uint8 IapReadByte(uint16 addr);//读数据void IapProgramByte(uint16 addr, uint8 dat);//写数据void IapEraseSector(uint16 addr);//擦除数据void delay()//延时程序{uint8 m,n,s;for(m=100;m>0;m--)for(n=200;n>0;n--)for(s=248;s>0;s--);}void delay1()//延时程序{uint8 m,n,s;for(m=10;m>0;m--)for(n=20;n>0;n--)for(s=148;s>0;s--);}/****************发送函数*********************/void send1(){sendBuf[0]=0xaa;sendBuf[1]=add;sendBuf[2]=0x10;sendBuf[3]=0xff;sendBuf[4]=0xbb;}/****************发送函数*********************/void senduart2(){ RS485_DIR=1;for(ii=0;ii<5;ii++){if(TEND) //允许发送{TEND=0;TBUF=sendBuf[t++&0x0F];TING=1;}while(!TEND);}t=0;RS485_DIR=0;}/*****************清空发送缓冲区*************************/void clear_receBuf(){uint8 i;for(i=0;i<5;i++){receBuf[i]=0;}}void main(){delay();clear_receBuf();add= IapReadByte(0x01);//读取存储的值if(add==0xff)add=0x00;ConfigUART1();TR0=1;EA=1;// TEND=0;// REND=0;while(1){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;}if(REND) //如果有接收{REND=0; //接收标志清零receBuf[r++&0x0F]=RBUF; //把接受的数据存储到BUT数组中if(receBuf[0]!=0xaa){r=0;}if(r>=5){ r=0;flag_zx=1;}}if(flag_zx==1){flag_zx=0;//0 1 2 3 4//起始位地址位功能位数据位结束位if((receBuf[0]==0xaa)&&(receBuf[4]==0xbb)&&(receBuf[1]==add)) //如果开始位和结束位,还有地址都正确,进行下一步判断{if(receBuf[2]==0x01) //修改板子地址{add=receBuf[3];IapEraseSector(0); //擦除扇区IapProgramByte(0x01,add);//写入新的地址}else if(receBuf[2]==0x02) //打开单路继电器{switch(receBuf[3]){case 0x01: OUT1=0; break;}}else if(receBuf[2]==0x03) //关闭单路继电器{switch(receBuf[3]){case 0x01: OUT1=1; break;}}else if(receBuf[2]==0x04) //打开全部继电器{if(receBuf[3]==0xff){OUT1=0;}}else if(receBuf[2]==0x05) //关闭全部继电器{if(receBuf[3]==0x00){OUT1=1;}}else if(receBuf[2]==0x06) //查询继电器{sendBuf[0]=0xaa;sendBuf[1]=add;sendBuf[2]=0x07;//sendBuf[3]=0xfe;sendBuf[4]=0xbb;switch(receBuf[3]){case 0x01: if(OUT1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;default:break;}senduart2();}else if(receBuf[2]==0x08) //查询输入{sendBuf[0]=0xaa;sendBuf[1]=add;sendBuf[2]=0x09;//sendBuf[3]=0xfe;sendBuf[4]=0xbb;switch(receBuf[3]){case 0x01: if(IN1==0) sendBuf[3]=0xFF;else sendBuf[3]=0x00;break;default:break;}senduart2();}}if((receBuf[0]==0xaa)&&(receBuf[1]==0x00)&&(receBuf[2]==0x00)&&(receBuf[3] ==0x00)&&(receBuf[4]==0xbb)){add=0x00;IapEraseSector(0); //擦除扇区IapProgramByte(0x01,0x00);//写入新的地址sendBuf[0]=0xaa;sendBuf[1]=add;sendBuf[2]=0x00;sendBuf[3]=0x00;sendBuf[4]=0xbb;senduart2();}clear_receBuf();}}}// /********************************************************** //放在主函数,定时0溢出中断函数,//*********************/void tm0()interrupt 1 using 1{if(RING){if(--RCNT==0){RCNT=3;if(--RBIT==0){RBUF=RDA T;RING=0;REND=1;}else{RDA T>>=1;if(RXB)RDAT|=0X80;}}}else if(!RXB){RING=1;RCNT=4;RBIT=9;}if(--TCNT==0){TCNT=3;if(TING){if(TBIT==0){TXB=0;TDA T=TBUF;TBIT=9;}else{TDA T>>=1;if(--TBIT==0){TXB=1;TING=0;TEND=1;}else{TXB=CY;}}}}}void IapIdle(){//禁用ISP/IAP/EEPROM functionmake 单片机在一安全状态IAP_CONTR = 0; //IAP_CMD = 0; //IAP_TRIG = 0; //IAP_ADDRH = 0x80; //IAP_ADDRL = 0; //}uint8 IapReadByte(uint16 addr){//读数据uint8 dat;IAP_CONTR = ENABLE_IAP;IAP_CMD = CMD_READ;IAP_ADDRL = addr;IAP_ADDRH = addr >> 8;IAP_TRIG = 0x5A;IAP_TRIG = 0xA5;_nop_();dat = IAP_DATA;IapIdle();return dat;}void IapProgramByte(uint16 addr, uint8 dat){//写数据IAP_CONTR = ENABLE_IAP;IAP_CMD = CMD_PROGRAM;IAP_ADDRL = addr;IAP_ADDRH = addr >> 8;IAP_DATA = dat;IAP_TRIG = 0x5A;IAP_TRIG = 0xA5;_nop_();IapIdle();}void IapEraseSector(uint16 addr){//擦除数据IAP_CONTR = ENABLE_IAP;IAP_CMD = CMD_ERASE;IAP_ADDRL = addr;IAP_ADDRH = addr >> 8;IAP_TRIG = 0x5A;IAP_TRIG = 0xA5;_nop_();IapIdle();}【图片展示】。