GYJ006330路继电器可编程模块485及232产品使用手册.docx
《GYJ006330路继电器可编程模块485及232产品使用手册.docx》由会员分享,可在线阅读,更多相关《GYJ006330路继电器可编程模块485及232产品使用手册.docx(40页珍藏版)》请在冰点文库上搜索。
GYJ006330路继电器可编程模块485及232产品使用手册
30路继电器可编程模块485及232产品使用手册
简要说明:
一、 尺寸:
长233.7mmX宽182.7mmX高25mm
二、 主要芯片:
STC12C60S2支持双串口(支持51系列DIP40封装单片机)
三、 工作电压:
直流12伏供电(另有24V供电)
四、 串口1(COM1)下载程序,(RS485口使用单机机内部串口2均可与上位机通讯)
五、输出供电采用延时通电电路(1至10秒可调)
功能:
当输出接有被控制设备,避免单片机初次上电(或下载程序)时,输出设备误动作。
此功能在实际应用中起到很大作用
五、 特点:
1、具有电源指示。
2、三十路带光电隔离输出控制继电器。
3、标准的11.0592M晶振。
(便于设置串口波特率)
4、具有上电复位和手动复位。
5、支持51系列DIP40封装单片机。
5、输出三十路继电器的供电采用延时供电 (避免被控制设备误动作)
6、输出三十路具有LED指示。
7、三十路12V继电器控制,控制设备。
8、可控制交流220V/10A一下设备。
9、具有RS232和RS485通信功能(可以同时和上位机通信)。
10、单片机无加密,可插拔更换,可随意更改程序。
使用说明:
【标注说明】
【接线图】
【应用举例接线图】
【可以作为输入设备的产品】
【可作为输出控制的设备】
【原理图】
由于原理图比较大,购买后提供PDF格式的。
【PCB图】
【上位机界面】(提供源代码)
【测试程序】(其它测试程序购买后提供)
实现功能:
30路输出顺序闭合
*********************************************************************/
#include//库文件
#include
#defineucharunsignedchar//宏定义无符号字符型
#defineuintunsignedint//宏定义无符号整型
/********************************************************************
初始定义
*********************************************************************/
uchari;
/********************************************************************
延时函数
*********************************************************************/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************************************************
主函数
*********************************************************************/
voidmain()
{
P4SW|=0x20;//配置P4.5为IO口
P4M0|=0x10;//配置P4.4为IO口
P4M1|=0x10;
P0=P1=P2=P3=0xff;
P4|=0x30;
while
(1)
{
OUT1=0;
delay(3000);
OUT2=0;;
delay(3000);
OUT3=0;
delay(3000);
OUT4=0;
delay(3000);
OUT5=0;
delay(3000);
OUT6=0;
delay(3000);
OUT7=0;
delay(3000);
OUT8=0;
delay(3000);
OUT9=0;
delay(3000);
OUT10=0;
delay(3000);
OUT11=0;
delay(3000);
OUT12=0;
delay(3000);
OUT13=0;
delay(3000);
OUT14=0;
delay(3000);
OUT15=0;
delay(3000);
OUT16=0;
delay(3000);
OUT17=0;
delay(3000);
OUT18=0;
delay(3000);
OUT19=0;
delay(3000);
OUT20=0;
delay(3000);
OUT21=0;
delay(3000);
OUT22=0;
delay(3000);
OUT23=0;
delay(3000);
OUT24=0;
delay(3000);
OUT25=0;
delay(3000);
OUT26=0;
delay(3000);
OUT27=0;
delay(3000);
OUT28=0;
delay(3000);
OUT29=0;
delay(3000);
OUT30=0;
delay(3000);
P0=P1=P2=P3=0xff;
P4|=0x30;
delay(6000);
}
}
/********************************************************************
结束
*********************************************************************/
/******************************
程序功能:
modbusRTU模式设置读取十六个继电器状态,以及内部保持寄存器的设置读取
硬件测试环境:
单片机stc89C52RC十六继电器485接口控制板
通信协议:
晶振:
11.0592波特率:
96008位数据1位停止位偶校验485通位接口P3.7控制方向端
控制板地址:
修改localAddr(变量)
线圈个数:
16个线圈地址范围:
0x0000~0x000F
保持寄存器个数:
16个(字节型)寄存器地址:
0x0000~0x000F
\\******************************\\
功能码简介:
02:
读取单个线圈状态
03:
读取多个保持寄存器
05:
设置单个线圈状态
06:
设置单个寄存器值
0F:
设置多个线圈
10:
设置多个保持寄存器
汇成科技:
华龙电子直销
作者:
yang
QQ:
790244909
*******************************/
#include"hader\\main.h"
uint32dwTickCount,dwIntTick;//时钟
uint8idatasendBuf[32],receBuf[16];//发送接收缓冲区
uint8idatacheckoutError;//==2偶校验错
uint8idatareceTimeOut;//接收超时
uint8idatac10ms;//10ms计时
uint8idatac200ms;
bitb1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms;//定时标志位
bitrs232485;
//定时处理
voidtimeProc(void)
{
b1ms=0;
if(bt1ms)//如果1ms到
{
bt1ms=0;
b1ms=1;
if(receTimeOut>0)//如果接收超时值>0
{
receTimeOut--;//接收超时-1(1ms减1次)
if(receTimeOut==0&&receCount>0)//判断通讯接收是否超时
{
//b485Send=0;//将485置为接收状态
receCount=0;//将接收地址偏移寄存器清零
checkoutError=0;
}
}
}
}//voidTimerProc(void)
//初始化
voidinitInt(void)
{
SCON=0xd0;
TMOD=0x21;
PCON=0;
TH0=TIMER_HIGHT;
TL0=TIMER_LOW;
TH1=0xfd;
TL1=0xfd;//波特率9600
TR0=1;
TR1=1;
ET0=1;
ES=1;
EA=1;
//串口2设置
S2CON=0xd0;//方式1,9位数据,波特率不可变S2TB8偶校验位
BRT=0XFD;//设置波特率9600
AUXR=0x10;//启动串口1波特率发生器
IP=0x00;//优先级默认//开串口1中断
IE2=0x01;//开串口2中断
}
//初始化
voidinitProg(void)
{
P4SW|=0x20;//配置P4.5为IO口
P4M0|=0x10;//配置P4.4为IO口
P4M1|=0x10;
P0=P1=P2=P3=0xff;
P4|=0x30;
initInt();//初始化定时器
//b485Send=0;
}
//上电时读取上次线圈状态,并设置
voidforceMultipleCoils1()
{
uint8tempAddr;
uint8i,k;
uint8Data;
uint8exit=0;
for(k=0;k<4;k++)
{
switch(k)
{
case0:
Data=coilreg1;break;
case1:
Data=coilreg2;break;
case2:
Data=coilreg3;break;
case3:
Data=coilreg4;break;
}
for(i=0;i<8;i++)
{
if(Data&0x01==1)
setCoilVal(tempAddr,0);
else
setCoilVal(tempAddr,1);
Data=Data>>1;
tempAddr++;
if(tempAddr>=32)
{
exit=1;
break;
}
}
if(exit==1)
break;
}
}
voidmain(void)
{
initProg();
localAddr=EEPROMReadByte(0);//从EERPOM的相对0地址读取数据
coilreg1=EEPROMReadByte
(1);
coilreg2=EEPROMReadByte
(2);
coilreg3=EEPROMReadByte(3);
coilreg4=EEPROMReadByte(4);
forceMultipleCoils1();
if(localAddr>=10)
{
localAddr=1;
EEPROMSectorErase(0);//从EEPROM的相对0地址扇区擦除
EEPROMWriteByte(0,localAddr);
EEPROMWriteByte(1,coilreg1);
EEPROMWriteByte(2,coilreg2);
EEPROMWriteByte(3,coilreg1);
EEPROMWriteByte(4,coilreg2);
}
WDT_CONTR=0x32;//大概284.4ms
while
(1)
{
timeProc();
checkComm0Modbus();
}
}
//定时器01ms中断
voidtimer0IntProc()interrupt1
{
TL0=TIMER_LOW;
TH0=TIMER_HIGHT;
dwIntTick++;
bt1ms=1;
c10ms++;
c200ms++;
if(c10ms>=10)
{
c10ms=0;//20ms计时器清零
bt10ms=1;
WDT_CONTR=0x32;//
}
}//voidTimer0IntProc()
//串行中断1程序
voidcommIntProc()interrupt4
{
if(TI)
{
TI=0;
if(sendPosi{
sendPosi++;
ACC=sendBuf[sendPosi];
TB8=P;//加上校验位
SBUF=sendBuf[sendPosi];
}
else//否则发送完毕,置接收状态
{
//b485Send=0;//发送完后将485置于接收状态
receCount=0;//清接收地址偏移寄存器
checkoutError=0;
}
}
elseif(RI)
{
RI=0;
rs232485=1;
receTimeOut=10;//通讯超时值
receBuf[receCount]=SBUF;
ACC=receBuf[receCount];
if(P!
=RB8)
checkoutError=2;//偶校验出错
receCount++;//接收地址偏移寄存器加1
receCount&=0x0f;//最多一次只能接收16个字节
}
}//voidCommIntProc()
//串口2中断
voiduart2_isr()interrupt8
{
if(S2CON&0x02)
{
S2CON&=~0x02;
if(sendPosi{
sendPosi++;
ACC=receBuf[sendPosi];
if(P)
S2CON|=0x08;//76543210ResetValue
//sfrS2CON=0x9A;//S2ControlS2SM0S2SM1S2SM2S2RENS2TB8S2RB8S2TIS2RI00000000B
else
S2CON&=0xf7;
S2BUF=receBuf[sendPosi];
}
else//否则发送完毕,置接收状态
{
//b485Send=0;//发送完后将485置于接收状态
receCount=0;//清接收地址偏移寄存器
checkoutError=0;
}
}
elseif(S2CON&0x01)//接收
{
S2CON&=~0x01;
rs232485=0;
receTimeOut=10;//通讯超时值
receBuf[receCount]=S2BUF;
ACC=receBuf[receCount];
//if(P!
=RB8)
//checkoutError=2;//偶校验出错
receCount++;//接收地址偏移寄存器加1
receCount&=0x0f;//最多一次只能接收16个字节
}
}
/********************************************************************
*********************************************************************/
#include"STC12C5A60S2.H"
#include"INTRINS.H"
#defineucharunsignedchar//宏定义无符号字符型
#defineuintunsignedint//宏定义无符号整型
bitwrite=0;//写24C08的标志;
uchardat=0xee;//用于存储单片机接收发送缓冲寄存器SBUF里面的内容
ucharsj1;//存储数据值
ucharsj2;//存储数据值
ucharsj3;//存储数据值
ucharsj4;//存储数据值
ucharsj5;//存储数据值
/*
sfrIAP_DATA=0xC2;
sfrIAP_ADDRH=0xC3;
sfrIAP_ADDRL=0xC4;
sfrIAP_CMD=0xC5;
sfrIAP_TRIG=0xC6;
sfrIAP_CONTR=0xC7;
sfrP4=0xC0;
*/
//定义Flash操作等待时间及允许IAP/ISP/EEPROM操作的常数
//#defineENABLE_ISP0x80//系统工作时钟<30MHz时,对IAP_CONTR寄存器设置此值
//#defineENABLE_ISP0x81//系统工作时钟<24MHz时,对IAP_CONTR寄存器设置此值
#defineENABLE_ISP0x82//系统工作时钟<20MHz时,对IAP_CONTR寄存器设置此值
//#defineENABLE_ISP0x83//系统工作时钟<12MHz时,对IAP_CONTR寄存器设置此值
//#defineENABLE_ISP0x84//系统工作时钟<6MHz时,对IAP_CONTR寄存器设置此值
//#defineENABLE_ISP0x85//系统工作时钟<3MHz时,对IAP_CONTR寄存器设置此值
//#defineENABLE_ISP0x86//系统工作时钟<2MHz时,对IAP_CONTR寄存器设置此值
//#defineENABLE_ISP0x87//系统工作时钟<1MHz时,对IAP_CONTR寄存器设置此值
/********************************************************************
初始定义
*********************************************************************/
sbitOUT1=P2^6;
sbitOUT2=P2^7;
sbitOUT3=P4^4;
sbitOUT4=P4^5;
sbitOUT5=P0^7;
sbitOUT6=P0^6;
sbitOUT7=P0^5;
sbitOUT8=P0^4;
sbitOUT9=P0^3;
sbitOUT10=P0^2;
sbitOUT11=P0^1;
sbitOUT12=P0^0;
sbitOUT13=P1^0;
sbitOUT14=P1^1;
sbitOUT15=P1^4;
sbitOUT16=P1^5;
sbitOUT17=P1^6;
sbitOUT18=P1^7;
sbitOUT19=P3^2;
sbitOUT20=P3^3;
sbitOUT21=P3^4;
sbitOUT22=P3^5;
sbitOUT23=P3^6;
sbitOUT24=P3^7;
sbitOUT25=P2^5;
sbitOUT26=P2^4;
sbitOUT27=P2^3;
sbitOUT28=P2^2;
sbitOUT29=P2^1;
sbitOUT30=P2^0;
uchark=10;
/********************************************************************
函数声明
*********************************************************************/
unionunion_temp16
{
uintun_temp16;
ucharun_temp8[2];
}
my_unTemp16;
ucharByte_Read(uintadd);//读一字节,调用前需打开IAP功能
voidByte_Program(uintadd,ucharch);//字节编程,调用前需打开IAP功能
voidSector_Erase(uintadd);//擦除扇区
voidIAP_Disable();//关闭IAP功能
voidDelay();
/********************************************************************
延时函数
*********************************************************************/
voiddelay(uchart)
{
uchari,j;
for(i=0;i{
for(j=13;j>0;j--);
{;
}
}
}
/********************************************************************
功能:
串口初始化,波特率9600,方式1
*********************************************************************/
voidInit_Com(void)
{
//串口初始化
TMOD=0x20;
SCON=0x50;
TH1=0xFd;