15入15出继电器工控板 简要说明: 一、 尺寸:长181mmX宽152mmX高25mm 二、 主要芯片:STC12C5A60S2(支持51单片机) 三、 工作电压:直流12伏(另有24V继电器)
四、串口下载程序 五、输出供电采用延时接通电路
功能:当输出接有被控制设备,避免单片机初次上电(或下载程序)时,输出设备误动作。此功能在实际应用中起到很大作用
六、 特点:
1、具有电源指示。
2、15路输入光电隔离引入信号。
3、15路输出光电隔离输出控制继电器。
4、标准的11.0592M晶振。(便于设置串口波特率)
5、具有上电复位和手动复位。
6、支持AT89SXX系列单片机。
7、带有掉电存储功能,该单片机内部集成。
8、输入15路具有LED指示。
9、输出15路具有LED指示。
10、15路12V继电器控制,控制设备。
11、可控制交流220V/10A一下设备。
12、具有双通信功能(可以上位机控制)。
13、单片机无加密,可插拔更换,带有程序下载口,可随意更改程序。 使用说明:【标注说明】 【接线图】 【应用举例】 【可以作为输入设备的产品】
【可作为输出控制的设备】 【原理图】 由于原理图比较大,购买后提供PDF格式的。 【PCB图】 【上位机控制界面】
【测试程序】 - /********************************************************************
-
-
- 实现功能:STC12C5A60S2单片机之测试程序
- 使用芯片:STC12C5A60S2
- 晶振:11.0592MHZ
- 波特率:115200
- 编译环境:Keil
- 作者:zhangxinchun
- 淘宝店:汇诚科技
- 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!
-
-
- *********************************************************************/
- #include "STC12C5A60S2.H"
- #include "INTRINS.H"
-
- #define uchar unsigned char//宏定义无符号字符型
- #define uint unsigned int //宏定义无符号整型
-
- bit write=0; //写的标志;
- uchar dat=0xee; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
- uchar sj1; //存储数据值
- uchar sj2; //存储数据值
- uchar sj3; //存储数据值
- /*
- sfr IAP_DATA = 0xC2;
- sfr IAP_ADDRH = 0xC3;
- sfr IAP_ADDRL = 0xC4;
- sfr IAP_CMD = 0xC5;
- sfr IAP_TRIG = 0xC6;
- sfr IAP_CONTR = 0xC7;
- sfr P4 = 0xC0;
- */
- //定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
- //#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值
- #define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值
- //#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值
-
- /********************************************************************
- 初始定义
- *********************************************************************/
-
- /*定义输入口*/
- sbit IN1=P1^0;
- sbit IN2=P1^1;
- sbit IN3=P1^4;
- sbit IN4=P1^5;
- sbit IN5=P1^6;
- sbit IN6=P1^7;
- sbit IN7=P3^2;
- sbit IN8=P3^3;
- sbit IN9=P3^4;
- sbit IN10=P3^5;
- sbit IN11=P3^6;
- sbit IN12=P3^7;
- sbit IN13=P2^2;
- sbit IN14=P2^1;
- sbit IN15=P2^0;
- /*定义输出口*/
- sbit OUT1=P2^3;
- sbit OUT2=P2^4;
- sbit OUT3=P2^5;
- sbit OUT4=P2^6;
- sbit OUT5=P2^7;
- sbit OUT6=P4^4;
- sbit OUT7=P4^5;
- sbit OUT8=P0^7;
- sbit OUT9=P0^6;
- sbit OUT10=P0^5;
- sbit OUT11=P0^4;
- sbit OUT12=P0^3;
- sbit OUT13=P0^2;
- sbit OUT14=P0^1;
- sbit OUT15=P0^0;
- /********************************************************************
- 函数声明
- *********************************************************************/
- union union_temp16
- {
- uint un_temp16;
- uchar un_temp8[2];
- }
- my_unTemp16;
-
- uchar Byte_Read(uint add); //读一字节,调用前需打开IAP 功能
- void Byte_Program(uint add, uchar ch); //字节编程,调用前需打开IAP 功能
- void Sector_Erase(uint add); //擦除扇区
- void IAP_Disable(); //关闭IAP 功能
- void Delay();
-
- /********************************************************************
- 延时函数
- *********************************************************************/
- void delay(uchar t)
- {
- uchar i,j;
- for(i=0;i<t;i++)
- {
- for(j=13;j>0;j--);
- { ;
- }
- }
- }
- /********************************************************************
- 功能:串口初始化,波特率9600,方式1
- *********************************************************************/
- void Init_Com(void)
- {
- TMOD = 0x20;
- PCON = 0x00;
- SCON = 0x50;
- TH1 = 0xFd;
- TL1 = 0xFd;
- TR1 = 1;
- }
- /********************************************************************
- 全开函数
- *********************************************************************/
- void quankai()
- {
- uchar k;
- k=10;
- OUT1=0;delay(k);
- OUT2=0;delay(k);
- OUT3=0;delay(k);
- OUT4=0;delay(k);
- OUT5=0;delay(k);
- OUT6=0;delay(k);
- OUT7=0;delay(k);
- OUT8=0;delay(k);
- OUT9=0;delay(k);
- OUT10=0;delay(k);
- OUT11=0;delay(k);
- OUT12=0;delay(k);
- OUT13=0;delay(k);
- OUT14=0;delay(k);
- OUT15=0;delay(k);
- }
-
- /********************************************************************
- 全关函数
- *********************************************************************/
- void quanguan()
- {
- uchar k;
- k=10;
- OUT1=1;delay(k);
- OUT2=1;delay(k);
- OUT3=1;delay(k);
- OUT4=1;delay(k);
- OUT5=1;delay(k);
- OUT6=1;delay(k);
- OUT7=1;delay(k);
- OUT8=1;delay(k);
- OUT9=1;delay(k);
- OUT10=1;delay(k);
- OUT11=1;delay(k);
- OUT12=1;delay(k);
- OUT13=1;delay(k);
- OUT14=1;delay(k);
- OUT15=1;delay(k);
- }
-
-
- /********************************************************************
- 接收数据判断函数
- *********************************************************************/
- chuankou()
- {
- switch(dat) //接收数据判断
- {
- uchar k;
- k=10;
- case 'I': quankai();SBUF = dat;dat=0xee;write=1;break; // 全开
- case 'i': quanguan();SBUF = dat;dat=0xee;write=1;break; // 全关
-
- case 'A': OUT1=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第一路开
- case 'B': OUT2=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第二路开
- case 'C': OUT3=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第三路开
- case 'D': OUT4=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第四路开
- case 'E': OUT5=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第五路开
- case 'F': OUT6=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第六路开
- case 'G': OUT7=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第七路开
- case 'H': OUT8=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第八路开
- case 'J': OUT9=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第九路开
- case 'K': OUT10=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第十路开
- case 'L': OUT11=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第十一路开
- case 'M': OUT12=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第十二路开
- case 'N': OUT13=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第十三路开
- case 'O': OUT14=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第十四路开
- case 'P': OUT15=0;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第十五路开
-
-
- case 'a': OUT1=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第一路关
- case 'b': OUT2=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第二路关
- case 'c': OUT3=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第三路关
- case 'd': OUT4=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第四路关
- case 'e': OUT5=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第五路关
- case 'f': OUT6=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第六路关
- case 'g': OUT7=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第七路关
- case 'h': OUT8=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // 第八路关
- case 'j': OUT9=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // ...
- case 'k': OUT10=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // ...
- case 'l': OUT11=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // ...
- case 'm': OUT12=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // ...
- case 'n': OUT13=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // ...
- case 'o': OUT14=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // ...
- case 'p': OUT15=1;delay(k);SBUF = dat;dat=0xee;write=1;break; // ...
-
- default:break; // 跳出
- }
- }
- /********************************************************************
- 按键函数
- *********************************************************************/
- KEY()
- {
- uchar k;
- k=200;
-
- if(IN1==0){delay(k);if(IN1==0){delay(k);OUT1=!OUT1;while(!IN1);delay(k);write=1;}}
- if(IN2==0){delay(k);if(IN2==0){delay(k);OUT2=!OUT2;while(!IN2);delay(k);write=1;}}
- if(IN3==0){delay(k);if(IN3==0){delay(k);OUT3=!OUT3;while(!IN3);delay(k);write=1;}}
- if(IN4==0){delay(k);if(IN4==0){delay(k);OUT4=!OUT4;while(!IN4);delay(k);write=1;}}
- if(IN5==0){delay(k);if(IN5==0){delay(k);OUT5=!OUT5;while(!IN5);delay(k);write=1;}}
- if(IN6==0){delay(k);if(IN6==0){delay(k);OUT6=!OUT6;while(!IN6);delay(k);write=1;}}
- if(IN7==0){delay(k);if(IN7==0){delay(k);OUT7=!OUT7;while(!IN7);delay(k);write=1;}}
- if(IN8==0){delay(k);if(IN8==0){delay(k);OUT8=!OUT8;while(!IN8);delay(k);write=1;}}
- if(IN9==0){delay(k);if(IN9==0){delay(k);OUT9=!OUT9;while(!IN9);delay(k);write=1;}}
-
- if(IN10==0){delay(k);if(IN10==0){delay(k);OUT10=!OUT10;while(!IN10);delay(k);write=1;}}
- if(IN11==0){delay(k);if(IN11==0){delay(k);OUT11=!OUT11;while(!IN11);delay(k);write=1;}}
- if(IN12==0){delay(k);if(IN12==0){delay(k);OUT12=!OUT12;while(!IN12);delay(k);write=1;}}
- if(IN13==0){delay(k);if(IN13==0){delay(k);OUT13=!OUT13;while(!IN13);delay(k);write=1;}}
- if(IN14==0){delay(k);if(IN14==0){delay(k);OUT14=!OUT14;while(!IN14);delay(k);write=1;}}
- if(IN15==0){delay(k);if(IN15==0){delay(k);OUT15=!OUT15;while(!IN15);delay(k);write=1;}}
- }
- /********************************************************************
- 主函数
- *********************************************************************/
- void main (void)
- {
- uint eeprom_address;
- P4SW|=0x20; //配置P4.5为IO口
- P4M0|=0x10; //配置P4.4为IO口
- P4M1|=0x10;
- Init_Com();//串口初始化
-
-
- eeprom_address = 0x01; //将测试起始地址送eeprom_address
- sj1 = Byte_Read(1); //读EEPROM的值,存到read_eeprom
- sj2 = Byte_Read(2); //读EEPROM的值,存到read_eeprom
- sj3 = Byte_Read(3); //读EEPROM的值,存到read_eeprom
- P0=sj1;
- P2=sj2;
- P4=sj3;
- while(1)
- {
- chuankou(); // 接收数据判断函数
-
- if ( RI ) //扫描判断是否接收到数据,
- {
- dat = SBUF; //接收数据SBUF赋与dat
- RI=0; //RI 清零。
- }
- KEY(); //调用按键函数
- if(write==1) //判断计时器是否计时一秒
- {
- write=0; //清零
- sj1=P0;
- sj2=P2;
- sj3=P4;
- Sector_Erase(1); //擦除整个扇区
- Byte_Program(1, sj1);//将 数据 写入 EEPROM
- //Sector_Erase(2); //擦除整个扇区
- Byte_Program(2, sj2);//将 数据 写入 EEPROM
- //Sector_Erase(3); //擦除整个扇区
- Byte_Program(3, sj3);//将 数据 写入 EEPROM
-
- }
-
- }
- }
- /********************************************************************
- 结束主函数
- *********************************************************************/
- //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
- uchar Byte_Read(uint add)
- {
- IAP_DATA = 0x00;
- IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
- IAP_CMD = 0x01; //IAP/ISP/EEPROM 字节读命令
-
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址
-
- //EA = 0;
- IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
- _nop_();
- //EA = 1;
- IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
- //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
- return (IAP_DATA);
- }
-
- //字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
- void Byte_Program(uint add, uchar ch)
- {
- IAP_CONTR = ENABLE_ISP; //打开 IAP 功能, 设置Flash 操作等待时间
- IAP_CMD = 0x02; //IAP/ISP/EEPROM 字节编程命令
-
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址
-
- IAP_DATA = ch; //要编程的数据先送进IAP_DATA 寄存器
- //EA = 0;
- IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
- _nop_();
- //EA = 1;
- IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
- //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
- }
-
- //擦除扇区, 入口:DPTR = 扇区地址
- void Sector_Erase(uint add)
- {
- IAP_CONTR = ENABLE_ISP; //打开IAP 功能, 设置Flash 操作等待时间
- IAP_CMD = 0x03; //IAP/ISP/EEPROM 扇区擦除命令
-
- my_unTemp16.un_temp16 = add;
- IAP_ADDRH = my_unTemp16.un_temp8[0]; //设置目标单元地址的高8 位地址
- IAP_ADDRL = my_unTemp16.un_temp8[1]; //设置目标单元地址的低8 位地址
-
- //EA = 0;
- IAP_TRIG = 0x5A; //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
- IAP_TRIG = 0xA5; //送完A5h 后,ISP/IAP 命令立即被触发起动
- _nop_();
- //EA = 1;
- IAP_Disable(); //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
- //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
- }
-
- void IAP_Disable()
- {
- //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
- //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
- IAP_CONTR = 0; //关闭IAP 功能
- IAP_CMD = 0; //清命令寄存器,使命令寄存器无命令,此句可不用
- IAP_TRIG = 0; //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
- IAP_ADDRH = 0;
- IAP_ADDRL = 0;
- }
复制代码
【图片预览】
【下载说明】 第一步:准备工控板、电源、串口通讯线、电脑 第二步:串口线连接工控板和电脑。 第三步:打开下载软件。(STC_ISP_V479) 第四步:下载设置。(查看串口号) 第五步:选择单片机型号,并选择对应的串口号。 注意:下载前一定要先安装串口线驱动程序。 第六步:调入要下载的文件(扩展名为:HEX的文件) 第七步:点击‘Download/下载’ 等待软件提示给工控板供电。 第八步:给工控板供电并等待下载完成。 第九步:下载进行中。。。。。。等待下载完成! 第十步:下载完成。即可进行测试。
全部资料51hei下载地址:
|