找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10318|回复: 18
收起左侧

单片机四路输入输出继电器工控板全套资料下载 含485modbus协议上位机+源码+pcb

  [复制链接]
ID:284341 发表于 2018-2-18 21:30 | 显示全部楼层 |阅读模式
51单片机做的主控芯片.
图片2.jpg
Altium Designer画的四路输入输出继电器工控板原理图和PCB图如下:(51hei附件中可下载工程文件)
0.png 0.png

【简要说明】
一、 尺寸:长93mmX宽87mmX高28mm
二、 主要芯片:STC12C2052AD(兼容51程序)
三、 工作电压:12V(工作电压等于继电器额定工作电压)
四、 串口下载程序
五、 特点:1、具有电源指示。
              2、输入输出具有信号指示灯。
              3、光隔离输出控制继电器
              4、标准的11.0592M晶振。
              5、具有上电复位和手动复位。
              6、主芯片完全兼容51程序。
              7、有内部看门狗,EEPROM
             8、高效率电源稳压芯片给单片机供电,工作更稳定。。
             9、可控制交流220V/10A一下设备。
             10、具有串口通信功能(可以上位机控制)。
六、有详细使用说明书
七、提供相关软件
八、提供例程及其学习资料
适用场合:工业控制、单片机学习、电子竞赛、产品开发、毕业设计。。。

该板配套参考程序
01、1对1输入输出点动控制程序
02、1对1输入输出自锁控制程序
03、1对1输入输出互锁控制程序
04、延时控制程序
05、顺序控制程序
06、串口通信参考程序_无返回值
07、串口通信参考程序_有返回值
08、随机输出控制程序
09、掉电存储控制程序
10、加密设定使用次数
11、4路其中3路就是给信号通电,信号没了就断电,其中1路给信号通电,0.5-1秒断电

0.png

继电器控制vb上位机及其源代码
0.png

下位机单片机源码:
0.png

四入四出485modbus协议上位机程序:
0.png

下位机单片机源程序如下:
  1. #include "hader\\main.h"
  2. //#include"hader\\STC12C5A60S2.H"
  3. /******************************
  4. 微控电子 www.mcuc.cn
  5. modbus RTU 的C51程序
  6. 单片机89S52  晶振:11.0592
  7. 通信波特率 9600 8位数据 1位停止位 偶校验 485通位接口
  8. 单片机控制板地址 localAddr(变量)
  9. 通信可设置数据的地址:
  10. 字地址 0 - 255 (只取16位的低8位)
  11. 位地址 0 - 255 (只取16位的低8位)
  12. P3^4;        //运行指示灯
  13. P1^7;        //看门狗复位
  14. P1^4;        //75LBC184 发送接收控制
  15. *******************************/

  16. uint32        dwTickCount,dwIntTick;        //时钟
  17. uint8        idata sendBuf[16],receBuf[16]; //发送接收缓冲区
  18. uint8        idata checkoutError;        // ==2 偶校验错  
  19. uint8        idata receTimeOut;                //接收超时
  20. uint8        idata c10ms;                        //10ms 计时
  21. bit                b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms;        //定时标志位
  22. uint8 dat;
  23. bit write=0; //写24C08 的标志
  24. sfr WDT_CONTR=0XE1;
  25. // 串行中断程序
  26. void commIntProc() interrupt 4
  27. {
  28.         if(TI)
  29.         {
  30.                 TI = 0;
  31.                 if(sendPosi < sendCount) //如果发送位置小于发送计数,那么继续发送
  32.                 {
  33.                         sendPosi++;
  34.                         ACC = sendBuf[sendPosi];
  35.                         TB8 = P;        //加上校验位
  36.                         SBUF = sendBuf[sendPosi];
  37.                 }
  38.                 else //否则发送完毕,置接收状态
  39.                 {
  40.                         b485Send = 0;    //发送完后将485置于接收状态
  41.                         receCount = 0;   //清接收地址偏移寄存器
  42.                         checkoutError = 0;
  43.                 }
  44.         }
  45.         else if(RI)
  46.         {
  47.                 RI = 0;
  48.                 receTimeOut = 10;    //通讯超时值
  49.                 receBuf[receCount] = SBUF;
  50.                 ACC = receBuf[receCount];
  51.                 if(P != RB8)
  52.                         checkoutError = 2;        //偶校验出错
  53.                 receCount++;          //接收地址偏移寄存器加1
  54.                 receCount &= 0x0f;    //最多一次只能接收16个字节
  55.         }

  56. }   // void CommIntProc()

  57. //定时器0 1ms 中断
  58. void timer0IntProc() interrupt 1
  59. {
  60.         TL0 = TIMER_LOW;
  61.     TH0 = TIMER_HIGHT;
  62.     dwIntTick++;
  63.         bt1ms = 1;
  64.     c10ms++;
  65.     if(c10ms >= 10)
  66.     {
  67.         c10ms = 0;      //10ms计时器清零
  68.         bt10ms = 1;
  69.     }
  70. }   // void Timer0IntProc()

  71. //定时处理
  72. void timeProc(void)
  73. {
  74.         static uint8 c200ms;

  75.   //  bWatchDog = ~ bWatchDog;    //看门狗取反
  76.         b1ms = 0;
  77.         b10ms = 0;
  78.         b100ms = 0;
  79.        
  80. //        ET0 = 0;        //禁用定时器0
  81. //        dwTickCount = dwIntTick;        //
  82.         ET0 = 1;

  83.         if(bt1ms)        //如果1ms到
  84.         {
  85.                 bt1ms = 0;
  86.                 b1ms = 1;

  87.         if(receTimeOut>0)        //如果接收超时值>0
  88.         {
  89.             receTimeOut--;        //接收超时-1(1ms减1次)
  90.             if(receTimeOut==0 && receCount>0)   //判断通讯接收是否超时
  91.             {
  92.                 b485Send = 0;       //将485置为接收状态
  93.                 receCount = 0;      //将接收地址偏移寄存器清零
  94.                                 checkoutError = 0;
  95.             }
  96.         }
  97.         }
  98.        
  99.         if(bt100ms)
  100.         {
  101.                 bt100ms = 0;
  102.                 b100ms = 1;
  103.         }
  104.     if(bt10ms)      //判断中断10ms标志位是否1
  105.     {
  106.         bt10ms = 0;     //清中断10ms标志位
  107.                 b10ms = 1;

  108.         c200ms++;                   //200ms计时器加1
  109.         if(c200ms >= 20)            //判断是否计时到200ms
  110.         {
  111.             c200ms = 0;             //清200ms计时器
  112.       //      bRunLED = ~bRunLED;     //取反运行指示灯         
  113.         }
  114.     }
  115. }   // void TimerProc(void)

  116. //初始化串口
  117. void initUart(void)
  118. {
  119.   //串口2波特率
  120.         SCON = 0x50;                                 //方式1,8位数据,波特率可变
  121.         TH1=  0xfd;       
  122.         TL1 = 0xfd;                             //波特率 9600
  123.     TR1=1;               
  124.         SCON = 0xd0;
  125.     PCON = 0;
  126.     ES = 1;
  127. }//void initUart(void)

  128. //初始化中断
  129. void initInt(void)
  130. {

  131.         TMOD = 0x21;
  132.         TH0 = TIMER_HIGHT;
  133.         TL0 = TIMER_LOW;
  134.         TR0 = 1;       
  135.     ET0 = 1;
  136.         initUart();        //串口初始化
  137.         EA = 1;               
  138. }
  139. //初始化
  140. void initProg(void)
  141. {       
  142.         initInt();
  143.         b485Send = 0;          //接收
  144. }

  145. /********************************************************************
  146.                     24C08 读写驱动程序
  147. *********************************************************************/
  148. void delay1(uint16 x)
  149. {
  150.         uint16 i;
  151.         for(i=0;i<x;i++)
  152.         ;
  153. }
  154. void flash(){ ; ; }
  155. //24c08 初始化子程序
  156. void x24c08_init()
  157. {
  158.         scl=1;
  159.         flash();
  160.         sda=1;                     
  161.         flash();
  162. }
  163. //启动(I方C)总线
  164. void start()
  165. {
  166.   sda=1; flash(); scl=1; flash(); sda=0; flash(); scl=0; flash();
  167. }
  168. //停止(I方C)总线
  169. void stop()
  170. {
  171. sda=0; flash(); scl=1; flash(); sda=1; flash();
  172. }
  173. //写一个字节
  174. void writex(uint8 j)
  175. {
  176.         uint8 i,temp;
  177.         temp=j;
  178.         for (i=0;i<8;i++)
  179.         {
  180.           temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash();
  181.         }
  182.         scl=0; flash(); sda=1; flash();
  183. }
  184. //读一个字节
  185. uint8 readx()
  186. {
  187.         uint8 i,j,k=0;
  188.         scl=0; flash(); sda=1;
  189.         for (i=0;i<8;i++)
  190.         {
  191.         flash(); scl=1; flash();
  192.         if (sda==1) j=1;
  193.         else j=0;
  194.         k=(k<<1)|j;
  195.         scl=0;}
  196.         flash(); return(k);
  197. }
  198. //(I方C)线时钟
  199. void clock()
  200. {
  201.         unsigned char i=0;
  202.         scl=1; flash();
  203.         while ((sda==1)&&(i<255))i++;
  204.         scl=0; flash();
  205. }
  206. /********************************************************************
  207.                 从24c08 的地址address 中读取一个字节数据
  208. *********************************************************************/
  209. unsigned char x24c08_read(unsigned char address)
  210. {
  211.         unsigned char i;
  212.         start(); writex(0xa0);
  213.         clock(); writex(address);
  214.         clock(); start();
  215.         writex(0xa1); clock();
  216.         i=readx(); stop();
  217.         delay1(10);
  218.         return(i);
  219. }
  220. /********************************************************************
  221.                 向24c08 的address地址中写入一字节数据
  222. *********************************************************************/
  223. void x24c08_write(unsigned char address,unsigned char info)
  224. {
  225.         EA=0;
  226.         start(); writex(0xa0);
  227.         clock(); writex(address);
  228. ……………………

  229. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png

所有资料51hei提供下载(pcb工程+源码等全套资料):

测试程序.rar

17.16 KB, 下载次数: 289, 下载积分: 黑币 -5

该板配套参考程序.rar

198.55 KB, 下载次数: 285, 下载积分: 黑币 -5

继电器控制上位机及其源代码.rar

39.93 KB, 下载次数: 299, 下载积分: 黑币 -5

四路输入输出继电器工控板DXP资料.rar

423.9 KB, 下载次数: 277, 下载积分: 黑币 -5

四入四出485modbus协议.rar

101.76 KB, 下载次数: 339, 下载积分: 黑币 -5

原理图.doc

53 KB, 下载次数: 237, 下载积分: 黑币 -5

评分

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

查看全部评分

回复

使用道具 举报

ID:280944 发表于 2018-2-26 13:12 | 显示全部楼层
单片机四路输入输出继电器工控板全套资料下载 含485modbus协议上位机+源码+pcb
回复

使用道具 举报

ID:302960 发表于 2018-4-6 23:35 | 显示全部楼层
单片机四路输入输出继电器工控板全套资料下载 含485modbus协议上位机+源码+pcb
回复

使用道具 举报

ID:302500 发表于 2018-4-19 01:07 | 显示全部楼层
请问P1.4口接的哪里
回复

使用道具 举报

ID:369315 发表于 2018-7-11 10:56 来自手机 | 显示全部楼层
我来学习
回复

使用道具 举报

ID:358547 发表于 2018-7-12 11:51 | 显示全部楼层
很好!解析详细,值得学习!
回复

使用道具 举报

ID:350762 发表于 2018-7-12 15:46 | 显示全部楼层
楼主不错顶一下
回复

使用道具 举报

ID:350762 发表于 2018-7-12 15:47 | 显示全部楼层
很安逸的分享谢啦!!!!
回复

使用道具 举报

ID:79874 发表于 2018-7-12 16:12 | 显示全部楼层
谢谢分享学习下
回复

使用道具 举报

ID:373124 发表于 2018-7-17 11:00 | 显示全部楼层
谢谢分享学习
回复

使用道具 举报

ID:169063 发表于 2018-7-26 22:47 | 显示全部楼层
非常好,感谢
回复

使用道具 举报

ID:385629 发表于 2018-8-13 08:16 | 显示全部楼层
mark,学习一下
回复

使用道具 举报

ID:394808 发表于 2018-9-17 21:03 | 显示全部楼层

楼主不错顶一下
回复

使用道具 举报

ID:63317 发表于 2019-1-29 08:48 | 显示全部楼层
很好!解析详细,值得学习!
回复

使用道具 举报

ID:106792 发表于 2019-12-28 19:42 | 显示全部楼层
值得学习!
回复

使用道具 举报

ID:283261 发表于 2019-12-29 18:51 | 显示全部楼层
看着都是好东西,可惜没分,下不了
回复

使用道具 举报

ID:387558 发表于 2020-1-1 13:33 来自手机 | 显示全部楼层
谢谢分享,好资料,顶!
回复

使用道具 举报

ID:643329 发表于 2020-2-14 21:46 | 显示全部楼层
谢谢分享,好资料,顶!
回复

使用道具 举报

ID:899981 发表于 2023-11-13 10:11 | 显示全部楼层
不错,很有参考价值。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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