找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10183|回复: 14
收起左侧

51单片机8 IO继电器工控板设计 含上位机源程序及PCB工程与原理图

  [复制链接]
ID:386157 发表于 2018-8-14 14:23 | 显示全部楼层 |阅读模式
网上找的一个板子,全套资料都 有,可参考性强
微信图片_20180814142218.png 微信图片_201808141422181.png 微信图片_201808141422182.png 微信图片_201808141422183.png

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png 0.png

V1394_八入八出继电器工控板掉电存储
简要说明:
一、 尺寸:长150mmX宽122mmX高25mm
二、 主要芯片:AT89S52单片机(或者STC89C52)
三、 工作电压:直流12伏
四、 单片机标准十针下载接口。(可使用并口下载线和USB下载线下载)
五、 特点:
             1、具有电源指示。
             2、八路输入光电隔离引入信号。
             3、八路输出光电隔离输出控制继电器。
              4、标准的11.0592M晶振。(便于设置串口波特率)
             5、具有上电复位和手动复位。
             6、支持AT89SXX系列单片机。
             7、带有掉电存储功能,芯片24C08。
             8、输入八路具有LED指示。
             9、输出八路具有LED指示。
             10、八路12V继电器控制,控制设备。
             11、可控制交流220V/10A一下设备。(最大控制设备2000W)
             12、具有串口通信功能(可以上位机控制)。
             13、单片机无加密,可插拔更换,带有程序下载口,可随意更改程序。
使用说明:
【输入部分标注说明】
【输出部分标注说明】
主要器件标注说明】
上位机界面(提供源代码)
测试程序
实现功能:
  • 实现输入对输出一对一控制,第一次按下开关,继电器吸合,再次按下继电器断开。
  • 实现上位机(计算机)对继电器控制,发送不同的代码,控制对应的继电器(详细内容看程序)。
  • 具有掉电存储功能,即,断电后,再恢复通电,继电器输出断电前状态。

图片展示

单片机源程序如下:

  1. /********************************************************************
  2.                           汇诚科技
  3. 实现功能:此版配套测试程序
  4. 使用芯片:AT89S52
  5. 晶振:11.0592MHZ
  6. 波特率:9600
  7. 编译环境:Keil
  8. 作者:zhangxinchunleo

  9. 淘宝店:汇诚科技
  10. 【声明】此程序仅用于学习与参考,引用请注明版权和作者信息!   
  11. *********************************************************************/
  12. /********************************************************************
  13. 单片机与PC机采用9针串口,MAX232通讯,波特率默认为9600.
  14. 单片机接收PC机发送的十六进制码表如下:
  15. 01、全开:PC发送0xFF; 单片机返回0XFF;
  16. 02、全关:PC发送0X00; 单片机返回0X00;
  17. 03、第一路开:PC发送0x01;单片机返回0X01;
  18. 04、第二路开:PC发送0x02;单片机返回0X02;
  19. 05、第三路开:PC发送0x03;单片机返回0X03;
  20. 06、第四路开:PC发送0x04;单片机返回0X04;
  21. 07、第五路开:PC发送0x05;单片机返回0X05;
  22. 08、第六路开:PC发送0x06;单片机返回0X06;
  23. 09、第七路开:PC发送0x07;单片机返回0X07;
  24. 10、第八路开:PC发送0x08;单片机返回0X08;
  25. 11、第一路关:PC发送0xFE;单片机返回0XFE;
  26. 12、第二路关:PC发送0xFD;单片机返回0XFD;
  27. 13、第三路关:PC发送0xFC;单片机返回0XFC;
  28. 14、第四路关:PC发送0xFB;单片机返回0XFB;
  29. 15、第五路关:PC发送0xFA;单片机返回0XFA;
  30. 16、第六路关:PC发送0xF9;单片机返回0XF9;
  31. 17、第七路关:PC发送0xF8;单片机返回0XF8;
  32. 18、第八路关:PC发送0xF7;单片机返回0XF7;
  33. 19、输入状态查询:PC发送0x55;单片机返回输出状态(返回值十六进制);
  34. 20、输出状态查询:PC发送0xAA;单片机返回输出状态(返回值十六进制);
  35. 21、输出取反指令:PC发送0X11;单片机返回0x11;

  36. *********************************************************************/
  37. #include<reg52.h>
  38. #define uchar unsigned char//宏定义无符号字符型
  39. #define uint unsigned int  //宏定义无符号整型
  40. /********************************************************************
  41.                             初始定义
  42. *********************************************************************/
  43. uchar sj; //存储数据值
  44. bit write=0; //写24C08 的标志;
  45. uchar dat=0xee; //用于存储单片机接收发送缓冲寄存器SBUF里面的内容
  46. /*定义八位出为单片机P2口*/
  47. sbit K1=P2^0;
  48. sbit K2=P2^1;
  49. sbit K3=P2^2;
  50. sbit K4=P2^3;
  51. sbit K5=P2^4;
  52. sbit K6=P2^5;
  53. sbit K7=P2^6;
  54. sbit K8=P2^7;
  55. /*定义八位入为单片机P1口*/
  56. sbit IN0=P1^0;
  57. sbit IN1=P1^1;
  58. sbit IN2=P1^2;
  59. sbit IN3=P1^3;
  60. sbit IN4=P1^4;
  61. sbit IN5=P1^5;
  62. sbit IN6=P1^6;
  63. sbit IN7=P1^7;
  64. /********************************************************************
  65.                     24C08 读写驱动程序
  66. *********************************************************************/
  67. sbit scl=P3^6; // 24c08 SCL
  68. sbit sda=P3^7; // 24c08 SDA

  69. void delay1(uchar x)
  70. {
  71. uint i;
  72. for(i=0;i<x;i++);
  73. ;
  74. }
  75. void flash(){ ; ; }
  76. void x24c08_init() //24c08 初始化子程序
  77. {
  78. scl=1;
  79. flash();
  80. sda=1;                    
  81. flash();
  82. }
  83. void start() //启动(I方C)总线
  84. {
  85. sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();
  86. }
  87. void stop() //停止(I方C)总线
  88. {
  89. sda=0; flash(); scl=1; flash(); sda=1; flash();
  90. }
  91. void writex(uchar j) //写一个字节
  92. {
  93. uchar i,temp;
  94. temp=j;
  95. for (i=0;i<8;i++)
  96. {
  97. temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();
  98. }
  99. scl=0; flash(); sda=1; flash();
  100. }
  101. uchar readx() //读一个字节
  102. {
  103. uchar i,j,k=0;
  104. scl=0; flash(); sda=1;
  105. for (i=0;i<8;i++)
  106. {
  107. flash(); scl=1; flash();
  108. if (sda==1) j=1;
  109. else j=0;
  110. k=(k<<1)|j;
  111. scl=0;}
  112. flash(); return(k);
  113. }
  114. void clock() //(I方C)线时钟
  115. {
  116. unsigned char i=0;
  117. scl=1; flash();
  118. while ((sda==1)&&(i<255))i++;
  119. scl=0; flash();
  120. }
  121. /********************************************************************
  122.                 从24c08 的地址address 中读取一个字节数据
  123. *********************************************************************/
  124. unsigned char x24c08_read(unsigned char address)
  125. {
  126. unsigned char i;
  127. start(); writex(0xa0);
  128. clock(); writex(address);
  129. clock(); start();
  130. writex(0xa1); clock();
  131. i=readx(); stop();
  132. delay1(10);
  133. return(i);
  134. }
  135. /********************************************************************
  136.                 向24c08 的address地址中写入一字节数据
  137. *********************************************************************/
  138. void x24c08_write(unsigned char address,unsigned char info)
  139. {
  140. EA=0;
  141. start(); writex(0xa0);
  142. clock(); writex(address);
  143. clock(); writex(info);
  144. clock(); stop();
  145. EA=1;
  146. delay1(50);
  147. }
  148. /********************************************************************
  149.                             延时函数
  150. *********************************************************************/
  151. void delay(uchar t)
  152. {
  153.   uchar i,j;
  154.    for(i=0;i<t;i++)
  155.    {
  156.                  for(j=13;j>0;j--);
  157.               { ;
  158.               }
  159.    }
  160. }

  161. /********************************************************************
  162.               功能:串口初始化,波特率9600,方式1
  163. *********************************************************************/
  164. void Init_Com(void)
  165. {
  166. TMOD = 0x20;
  167. PCON = 0x00;
  168. SCON = 0x50;
  169. TH1 = 0xFd;
  170. TL1 = 0xFd;
  171. TR1 = 1;
  172. }
  173. /********************************************************************
  174.                             接收数据判断函数
  175. *********************************************************************/
  176. chuankou()
  177. {
  178. switch(dat) //接收数据判断
  179. {
  180. uchar k;
  181. k=10;
  182. case 0xff: P2=0X00;delay(k);SBUF = dat;dat=0xee;write=1;break; //  全开
  183. case 0x00: P2=0XFF;delay(k);SBUF = dat;dat=0xee;write=1;break; //  全关
  184. case 0x01: K1=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第一路开
  185. case 0x02: K2=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第二路开
  186. case 0x03: K3=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第三路开
  187. case 0x04: K4=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第四路开
  188. case 0x05: K5=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第五路开
  189. case 0x06: K6=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第六路开
  190. case 0x07: K7=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第七路开
  191. case 0x08: K8=0;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第八路开
  192. case 0xFE: K1=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第一路关
  193. case 0xFD: K2=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第二路关
  194. case 0xFC: K3=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第三路关
  195. case 0xFB: K4=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第四路关
  196. case 0xFA: K5=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第五路关
  197. case 0xF9: K6=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第六路关
  198. case 0xF8: K7=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第七路关
  199. case 0xF7: K8=1;delay(k);SBUF = dat;dat=0xee;write=1;break;                 //  第八路关
  200. case 0x55: SBUF = P1;delay(k);dat=0xee;break;                 //  读输入口状态
  201. case 0xAA: SBUF = P2;delay(k);dat=0xee;write=1;break;                 //  读输出口状态
  202. case 0x11: P2=~P2;delay(k);SBUF = dat;dat=0xee;write=1;break;  //  输出口取反
  203. default:break;                                                                         //  跳出
  204. }
  205. }
  206. /********************************************************************
  207.                             按键函数
  208. *********************************************************************/
  209. KEY()
  210. {
  211. uchar k;
  212. k=100;
  213. if(IN0==0){delay(k);while(!IN0);K8=!K8;write=1;}
  214. if(IN1==0){delay(k);while(!IN1);K7=!K7;write=1;}
  215. if(IN2==0){delay(k);while(!IN2);K6=!K6;write=1;}
  216. if(IN3==0){delay(k);while(!IN3);K5=!K5;write=1;}
  217. if(IN4==0){delay(k);while(!IN4);K4=!K4;write=1;}
  218. if(IN5==0){delay(k);while(!IN5);K3=!K3;write=1;}
  219. if(IN6==0){delay(k);while(!IN6);K2=!K2;write=1;}
  220. if(IN7==0){delay(k);while(!IN7);K1=!K1;write=1;}
  221. }
  222. /********************************************************************
  223.                             主函数
  224. *********************************************************************/
  225. void main()
  226. {
  227. Init_Com();//串口初始化
  228. x24c08_init(); //初始化24C08
  229. sj=x24c08_read(2);//读出保存的数据赋于dat
  230. P2=sj;//将存储的数据赋予P2口
  231. while(1)
  232. {
  233. chuankou();              // 接收数据判断函数

  234. if ( RI ) //扫描判断是否接收到数据,
  235. {
  236. dat = SBUF; //接收数据SBUF赋与dat
  237. RI=0; //RI 清零。
  238. }
  239. KEY(); //调用按键函数
  240. if(write==1) //判断计时器是否计时一秒
  241. {
  242. write=0; //清零
  243. sj=P2;              //将P2口的值赋予dat
  244. x24c08_write(2,sj); //在24c08 的地址2 中写入数据dat
  245. }               
  246. }
  247. }
  248. /********************************************************************
  249.                               结束
  250. *********************************************************************/
复制代码

所有资料51hei提供下载:
AT89S52_8IO继电器工控板_掉电存储DXP资料.rar (5.2 MB, 下载次数: 285)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:387700 发表于 2018-8-28 23:11 | 显示全部楼层
这个有没有现成的卖啊
回复

使用道具 举报

ID:388329 发表于 2018-9-2 23:20 | 显示全部楼层
还可以啊,这个东西
回复

使用道具 举报

ID:426763 发表于 2018-11-15 10:12 来自手机 | 显示全部楼层
原理图和pcn在哪里呢
回复

使用道具 举报

ID:459158 发表于 2019-1-1 19:35 来自手机 | 显示全部楼层
很好,非常好,留个脚印
回复

使用道具 举报

ID:165792 发表于 2019-1-9 19:57 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:79631 发表于 2019-2-22 10:02 | 显示全部楼层
很好,非常好,留个脚印
回复

使用道具 举报

ID:250631 发表于 2019-2-22 14:40 | 显示全部楼层
感谢楼主的无私奉献。
回复

使用道具 举报

ID:8190 发表于 2019-2-22 14:52 | 显示全部楼层
学习了  谢谢分享
回复

使用道具 举报

ID:487335 发表于 2019-3-9 12:48 | 显示全部楼层
板子可好用了,已经用过好多块,没想到这里还有这么好的资料,可惜积分不够
回复

使用道具 举报

ID:425600 发表于 2019-3-9 21:06 | 显示全部楼层
非常好的资料,谢谢
回复

使用道具 举报

ID:571679 发表于 2019-6-25 13:39 | 显示全部楼层

很好,非常好,留个脚印
回复

使用道具 举报

ID:570488 发表于 2019-6-26 11:47 | 显示全部楼层
这个东西确实有用了,最近正在研究类似的东西~ 其实也可以自己用一个最小系统,输出好搞定,因为淘宝上有继电器模块卖,5V的20块钱八个继电器的,但是输入的话,没有直接的,需要自己弄光耦隔离~
回复

使用道具 举报

ID:84000 发表于 2019-9-26 13:09 | 显示全部楼层
这个板子看上去很不错,自己学着坐一块用在工控上应该很理想。
回复

使用道具 举报

ID:476284 发表于 2024-7-26 22:36 | 显示全部楼层
这个案例不错,资料比较齐全,谢谢分享!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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