单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2217|回复: 7
收起左侧

STC12C5A60S2单片机15路继电器工控板源码等资料 支持NPN及PNP输入带RS485

  [复制链接]
zhangxinchun 发表于 2018-2-24 13:30 | 显示全部楼层 |阅读模式
1515出继电器工控板
简要说明:
一、 尺寸:长181mmX宽152mmX高25mm
二、 主要芯片:STC12C5A60S2(支持51单片机)
三、 工作电压:直流12伏(另有24V继电器)
四、串口下载程序
五、输出供电采用延时接通电路
www.7434.ag_【官方首页】-澳门银河娱乐场       功能:当输出接有被控制设备,避免单片机初次上电(或下载程序)时,输出设备误动作。此功能在实际应用中起到很大作用
六、 特点:
             1、具有电源指示。
             2、15路输入光电隔离引入信号。
             3、15路输出光电隔离输出控制继电器。
www.7434.ag_【官方首页】-澳门银河娱乐场             4、标准的11.0592M晶振。(便于设置串口波特率)
             5、具有上电复位和手动复位。
www.7434.ag_【官方首页】-澳门银河娱乐场             6、支持AT89SXX系列单片机。
             7、带有掉电存储功能,该单片机内部集成。
             8、输入15路具有LED指示。
             9、输出15路具有LED指示。
             10、15路12V继电器控制,控制设备。
             11、可控制交流220V/10A一下设备。
             12、具有双通信功能(可以上位机控制)。
             13、单片机无加密,可插拔更换,带有程序下载口,可随意更改程序。
使用说明:
【标注说明】
接线图
应用举例
可以作为输入设备的产品

可作为输出控制的设备
原理图
由于原理图比较大,购买后提供PDF格式的。
PCB
上位机控制界面


测试程序
  1. /********************************************************************


  2. 实现功能:STC12C5A60S2单片机之测试程序
  3. 使用芯片:STC12C5A60S2
  4. 晶振:11.0592MHZ
  5. 波特率:115200
  6. 编译环境:Keil
  7. 作者:zhangxinchun
  8. 淘宝店:汇诚科技
  9. 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!


  10. *********************************************************************/
  11. #include "STC12C5A60S2.H"
  12. #include "INTRINS.H"

  13. #define uchar unsigned char//宏定义无符号字符型
  14. #define uint unsigned int  //宏定义无符号整型

  15. bit write=0; //写的标志;
  16. uchar dat=0xee; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
  17. uchar sj1; //存储数据值
  18. uchar sj2; //存储数据值
  19. uchar sj3; //存储数据值
  20. /*
  21. sfr IAP_DATA    = 0xC2;
  22. sfr IAP_ADDRH   = 0xC3;
  23. sfr IAP_ADDRL   = 0xC4;
  24. sfr IAP_CMD     = 0xC5;
  25. sfr IAP_TRIG    = 0xC6;
  26. sfr IAP_CONTR   = 0xC7;
  27. sfr P4   = 0xC0;
  28. */
  29. //定义Flash 操作等待时间及允许IAP/ISP/EEPROM 操作的常数
  30. //#define ENABLE_ISP 0x80 //系统工作时钟<30MHz 时,对IAP_CONTR 寄存器设置此值
  31. //#define ENABLE_ISP 0x81 //系统工作时钟<24MHz 时,对IAP_CONTR 寄存器设置此值
  32. #define ENABLE_ISP 0x82 //系统工作时钟<20MHz 时,对IAP_CONTR 寄存器设置此值
  33. //#define ENABLE_ISP 0x83 //系统工作时钟<12MHz 时,对IAP_CONTR 寄存器设置此值
  34. //#define ENABLE_ISP 0x84 //系统工作时钟<6MHz 时,对IAP_CONTR 寄存器设置此值
  35. //#define ENABLE_ISP 0x85 //系统工作时钟<3MHz 时,对IAP_CONTR 寄存器设置此值
  36. //#define ENABLE_ISP 0x86 //系统工作时钟<2MHz 时,对IAP_CONTR 寄存器设置此值
  37. //#define ENABLE_ISP 0x87 //系统工作时钟<1MHz 时,对IAP_CONTR 寄存器设置此值

  38. /********************************************************************
  39.                             初始定义
  40. *********************************************************************/

  41. /*定义输入口*/
  42. sbit IN1=P1^0;
  43. sbit IN2=P1^1;
  44. sbit IN3=P1^4;            
  45. sbit IN4=P1^5;
  46. sbit IN5=P1^6;
  47. sbit IN6=P1^7;
  48. sbit IN7=P3^2;
  49. sbit IN8=P3^3;
  50. sbit IN9=P3^4;
  51. sbit IN10=P3^5;
  52. sbit IN11=P3^6;
  53. sbit IN12=P3^7;
  54. sbit IN13=P2^2;
  55. sbit IN14=P2^1;
  56. sbit IN15=P2^0;
  57. /*定义输出口*/
  58. sbit OUT1=P2^3;
  59. sbit OUT2=P2^4;
  60. sbit OUT3=P2^5;
  61. sbit OUT4=P2^6;
  62. sbit OUT5=P2^7;
  63. sbit OUT6=P4^4;
  64. sbit OUT7=P4^5;
  65. sbit OUT8=P0^7;
  66. sbit OUT9=P0^6;
  67. sbit OUT10=P0^5;
  68. sbit OUT11=P0^4;
  69. sbit OUT12=P0^3;
  70. sbit OUT13=P0^2;
  71. sbit OUT14=P0^1;
  72. sbit OUT15=P0^0;
  73. /********************************************************************
  74.                             函数声明
  75. *********************************************************************/
  76. union union_temp16
  77. {
  78. uint un_temp16;
  79. uchar  un_temp8[2];
  80. }
  81. my_unTemp16;

  82. uchar Byte_Read(uint add);              //读一字节,调用前需打开IAP 功能
  83. void Byte_Program(uint add, uchar ch);  //字节编程,调用前需打开IAP 功能
  84. void Sector_Erase(uint add);            //擦除扇区
  85. void IAP_Disable();                       //关闭IAP 功能
  86. void Delay();

  87. /********************************************************************
  88.                             延时函数
  89. *********************************************************************/
  90. void delay(uchar t)
  91. {
  92.   uchar i,j;
  93.    for(i=0;i<t;i++)
  94.    {
  95.                  for(j=13;j>0;j--);
  96.               { ;
  97.               }
  98.    }
  99. }
  100. /********************************************************************
  101.               功能:串口初始化,波特率9600,方式1
  102. *********************************************************************/
  103. void Init_Com(void)
  104. {
  105. TMOD = 0x20;
  106. PCON = 0x00;
  107. SCON = 0x50;
  108. TH1 = 0xFd;
  109. TL1 = 0xFd;
  110. TR1 = 1;
  111. }
  112. /********************************************************************
  113.                            全开函数
  114. *********************************************************************/
  115. void quankai()
  116. {
  117. uchar k;
  118. k=10;
  119. OUT1=0;delay(k);
  120. OUT2=0;delay(k);
  121. OUT3=0;delay(k);
  122. OUT4=0;delay(k);
  123. OUT5=0;delay(k);
  124. OUT6=0;delay(k);
  125. OUT7=0;delay(k);
  126. OUT8=0;delay(k);
  127. OUT9=0;delay(k);
  128. OUT10=0;delay(k);
  129. OUT11=0;delay(k);
  130. OUT12=0;delay(k);
  131. OUT13=0;delay(k);
  132. OUT14=0;delay(k);
  133. OUT15=0;delay(k);
  134. }

  135. /********************************************************************
  136.                            全关函数
  137. *********************************************************************/
  138. void quanguan()
  139. {
  140. uchar k;
  141. k=10;
  142. OUT1=1;delay(k);
  143. OUT2=1;delay(k);
  144. OUT3=1;delay(k);
  145. OUT4=1;delay(k);
  146. OUT5=1;delay(k);
  147. OUT6=1;delay(k);
  148. OUT7=1;delay(k);
  149. OUT8=1;delay(k);
  150. OUT9=1;delay(k);
  151. OUT10=1;delay(k);
  152. OUT11=1;delay(k);
  153. OUT12=1;delay(k);
  154. OUT13=1;delay(k);
  155. OUT14=1;delay(k);
  156. OUT15=1;delay(k);
  157. }


  158. /********************************************************************
  159.                             接收数据判断函数
  160. *********************************************************************/
  161. chuankou()
  162. {
  163. switch(dat) //接收数据判断
  164. {
  165. uchar k;
  166. k=10;
  167. case 'I': quankai();SBUF = dat;dat=0xee;write=1;break; //  全开
  168. case 'i': quanguan();SBUF = dat;dat=0xee;write=1;break; //  全关

  169. case 'A': OUT1=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第一路开
  170. case 'B': OUT2=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第二路开
  171. case 'C': OUT3=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第三路开
  172. case 'D': OUT4=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第四路开
  173. case 'E': OUT5=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第五路开
  174. case 'F': OUT6=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第六路开
  175. case 'G': OUT7=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第七路开
  176. case 'H': OUT8=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第八路开
  177. case 'J': OUT9=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第九路开
  178. case 'K': OUT10=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第十路开
  179. case 'L': OUT11=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第十一路开
  180. case 'M': OUT12=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第十二路开
  181. case 'N': OUT13=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第十三路开
  182. case 'O': OUT14=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第十四路开
  183. case 'P': OUT15=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第十五路开

  184.                                          
  185. case 'a': OUT1=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第一路关
  186. case 'b': OUT2=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第二路关
  187. case 'c': OUT3=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第三路关
  188. case 'd': OUT4=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第四路关
  189. case 'e': OUT5=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第五路关
  190. case 'f': OUT6=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第六路关
  191. case 'g': OUT7=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第七路关
  192. case 'h': OUT8=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第八路关
  193. case 'j': OUT9=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  ...
  194. case 'k': OUT10=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  ...
  195. case 'l': OUT11=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  ...
  196. case 'm': OUT12=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  ...
  197. case 'n': OUT13=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  ...
  198. case 'o': OUT14=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  ...
  199. case 'p': OUT15=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  ...

  200. default:break;                                                                         //  跳出
  201. }
  202. }
  203. /********************************************************************
  204.                             按键函数
  205. *********************************************************************/
  206. KEY()
  207. {
  208. uchar k;
  209. k=200;

  210. if(IN1==0){delay(k);if(IN1==0){delay(k);OUT1=!OUT1;while(!IN1);delay(k);write=1;}}
  211. if(IN2==0){delay(k);if(IN2==0){delay(k);OUT2=!OUT2;while(!IN2);delay(k);write=1;}}
  212. if(IN3==0){delay(k);if(IN3==0){delay(k);OUT3=!OUT3;while(!IN3);delay(k);write=1;}}
  213. if(IN4==0){delay(k);if(IN4==0){delay(k);OUT4=!OUT4;while(!IN4);delay(k);write=1;}}
  214. if(IN5==0){delay(k);if(IN5==0){delay(k);OUT5=!OUT5;while(!IN5);delay(k);write=1;}}
  215. if(IN6==0){delay(k);if(IN6==0){delay(k);OUT6=!OUT6;while(!IN6);delay(k);write=1;}}
  216. if(IN7==0){delay(k);if(IN7==0){delay(k);OUT7=!OUT7;while(!IN7);delay(k);write=1;}}
  217. if(IN8==0){delay(k);if(IN8==0){delay(k);OUT8=!OUT8;while(!IN8);delay(k);write=1;}}
  218. if(IN9==0){delay(k);if(IN9==0){delay(k);OUT9=!OUT9;while(!IN9);delay(k);write=1;}}

  219. if(IN10==0){delay(k);if(IN10==0){delay(k);OUT10=!OUT10;while(!IN10);delay(k);write=1;}}
  220. if(IN11==0){delay(k);if(IN11==0){delay(k);OUT11=!OUT11;while(!IN11);delay(k);write=1;}}
  221. if(IN12==0){delay(k);if(IN12==0){delay(k);OUT12=!OUT12;while(!IN12);delay(k);write=1;}}
  222. if(IN13==0){delay(k);if(IN13==0){delay(k);OUT13=!OUT13;while(!IN13);delay(k);write=1;}}
  223. if(IN14==0){delay(k);if(IN14==0){delay(k);OUT14=!OUT14;while(!IN14);delay(k);write=1;}}
  224. if(IN15==0){delay(k);if(IN15==0){delay(k);OUT15=!OUT15;while(!IN15);delay(k);write=1;}}
  225. }
  226. /********************************************************************
  227.                             主函数
  228. *********************************************************************/
  229. void main (void)
  230. {
  231.    uint eeprom_address;
  232.    P4SW|=0x20;                               //配置P4.5为IO口
  233.    P4M0|=0x10;                               //配置P4.4为IO口
  234.    P4M1|=0x10;
  235.               Init_Com();//串口初始化


  236.     eeprom_address = 0x01;  //将测试起始地址送eeprom_address
  237.     sj1 = Byte_Read(1);    //读EEPROM的值,存到read_eeprom
  238.               sj2 = Byte_Read(2);    //读EEPROM的值,存到read_eeprom
  239.               sj3 = Byte_Read(3);    //读EEPROM的值,存到read_eeprom
  240.               P0=sj1;
  241.               P2=sj2;
  242.               P4=sj3;
  243. while(1)
  244. {
  245. chuankou();              // 接收数据判断函数

  246. if ( RI ) //扫描判断是否接收到数据,
  247. {
  248. dat = SBUF; //接收数据SBUF赋与dat
  249. RI=0; //RI 清零。
  250. }
  251. KEY(); //调用按键函数
  252. if(write==1) //判断计时器是否计时一秒
  253. {
  254. write=0; //清零
  255.                                sj1=P0;
  256.                             sj2=P2;
  257.                             sj3=P4;
  258.                   Sector_Erase(1);           //擦除整个扇区
  259.         Byte_Program(1, sj1);//将 数据 写入 EEPROM
  260.                             //Sector_Erase(2);           //擦除整个扇区
  261.         Byte_Program(2, sj2);//将 数据 写入 EEPROM
  262.                   //Sector_Erase(3);           //擦除整个扇区
  263.         Byte_Program(3, sj3);//将 数据 写入 EEPROM

  264. }               

  265. }
  266. }
  267. /********************************************************************
  268.                             结束主函数
  269. *********************************************************************/
  270. //读一字节,调用前需打开IAP 功能,入口:DPTR = 字节地址,返回:A = 读出字节
  271. uchar Byte_Read(uint add)
  272. {
  273.     IAP_DATA = 0x00;
  274.     IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
  275.     IAP_CMD = 0x01;                 //IAP/ISP/EEPROM 字节读命令

  276.     my_unTemp16.un_temp16 = add;
  277.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
  278.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

  279.     //EA = 0;
  280.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
  281.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
  282.     _nop_();
  283.     //EA = 1;
  284.     IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  285.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  286.     return (IAP_DATA);
  287. }

  288. //字节编程,调用前需打开IAP 功能,入口:DPTR = 字节地址, A= 须编程字节的数据
  289. void Byte_Program(uint add, uchar ch)
  290. {
  291.     IAP_CONTR = ENABLE_ISP;         //打开 IAP 功能, 设置Flash 操作等待时间
  292.     IAP_CMD = 0x02;                 //IAP/ISP/EEPROM 字节编程命令

  293.     my_unTemp16.un_temp16 = add;
  294.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
  295.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

  296.     IAP_DATA = ch;                  //要编程的数据先送进IAP_DATA 寄存器
  297.     //EA = 0;
  298.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
  299.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
  300.     _nop_();
  301.     //EA = 1;
  302.     IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  303.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  304. }

  305. //擦除扇区, 入口:DPTR = 扇区地址
  306. void Sector_Erase(uint add)
  307. {
  308.     IAP_CONTR = ENABLE_ISP;         //打开IAP 功能, 设置Flash 操作等待时间
  309.     IAP_CMD = 0x03;                 //IAP/ISP/EEPROM 扇区擦除命令

  310.     my_unTemp16.un_temp16 = add;
  311.     IAP_ADDRH = my_unTemp16.un_temp8[0];    //设置目标单元地址的高8 位地址
  312.     IAP_ADDRL = my_unTemp16.un_temp8[1];    //设置目标单元地址的低8 位地址

  313.     //EA = 0;
  314.     IAP_TRIG = 0x5A;   //先送 5Ah,再送A5h 到ISP/IAP 触发寄存器,每次都需如此
  315.     IAP_TRIG = 0xA5;   //送完A5h 后,ISP/IAP 命令立即被触发起动
  316.     _nop_();
  317.     //EA = 1;
  318.     IAP_Disable();  //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  319.                     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  320. }

  321. void IAP_Disable()
  322. {
  323.     //关闭IAP 功能, 清相关的特殊功能寄存器,使CPU 处于安全状态,
  324.     //一次连续的IAP 操作完成之后建议关闭IAP 功能,不需要每次都关
  325.     IAP_CONTR = 0;      //关闭IAP 功能
  326.     IAP_CMD   = 0;      //清命令寄存器,使命令寄存器无命令,此句可不用
  327.     IAP_TRIG  = 0;      //清命令触发寄存器,使命令触发寄存器无触发,此句可不用
  328.     IAP_ADDRH = 0;
  329.     IAP_ADDRL = 0;
  330. }
复制代码

【图片预览】

【下载说明】
第一步:准备工控板、电源、串口通讯线、电脑
第二步:串口线连接工控板和电脑。
www.7434.ag_【官方首页】-澳门银河娱乐场第三步:打开下载软件。(STC_ISP_V479
步:下载设置。(查看串口号)
步:选择单片机型号,并选择对应的串口号。
www.7434.ag_【官方首页】-澳门银河娱乐场注意:下载前一定要先安装串口线驱动程序。
第六步:调入要下载的文件(扩展名为:HEX的文件)
第七步:点击Download/下载 等待软件提示给工控板供电。
第八步:给工控板供电并等待下载完成。
第九步:下载进行中。www.7434.ag_【官方首页】-澳门银河娱乐场。。。。。等待下载完成!
第十步:下载完成即可进行测试。


0.png

全部资料51hei下载地址:
GYJ-0067_继电器15入15出(有源输入)发货资料.rar (8.64 MB, 下载次数: 87)
回复

使用道具 举报

bhjyqjs 发表于 2018-3-2 10:23 | 显示全部楼层
不知上位机是用什么语言写的?
回复

使用道具 举报

fwc 发表于 2018-3-2 14:46 | 显示全部楼层
上位机应该是VB c#
回复

使用道具 举报

wuxishun 发表于 2018-3-7 11:11 来自手机 | 显示全部楼层
谢谢分享,资料好强大
回复

使用道具 举报

wanli2018 发表于 2018-9-12 18:48 | 显示全部楼层
不能下载呢
回复

使用道具 举报

liufeng180840 发表于 2020-1-5 10:24 | 显示全部楼层
学习一下,很好的。
回复

使用道具 举报

hxszrb 发表于 2020-1-13 10:54 | 显示全部楼层
学习了,感谢分享
回复

使用道具 举报

难得糊涂2018 发表于 2020-1-14 19:16 | 显示全部楼层
要是可以支持标准的MODBUS RTU就可以连接触摸屏来使用了,这样用处就大了!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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