找回密码
 立即注册

QQ登录

只需一步,快速开始

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

RS485双通讯单片机控制30路继电器工控板VB上位机与下位机源码等资料

  [复制链接]
ID:280979 发表于 2018-2-24 12:22 | 显示全部楼层 |阅读模式
应用举例.JPG
0.png
【上位机界面】(提供源代码)
0.png

一、 尺寸:长233.7mmX宽182.7mmX高25mm
二、 主要芯片:STC12C60S2支持双串口(支持51系列DIP40封装单片机)
三、 工作电压:直流24伏供电(另有12V供电)
四、 串口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、单片机无加密,可插拔更换,可随意更改程序。

单片机下位机源程序如下:

  1. #include <STC12C5A60S2.H>

  2. unsigned char T0RH = 0;  //T0重载值的高字节
  3. unsigned char T0RL = 0;  //T0重载值的低字节
  4. sbit p01=P2^6;
  5. sbit p02=P2^7;
  6. sbit p03=P4^4;
  7. sbit p04=P4^5;
  8. sbit p05=P0^7;
  9. sbit p06=P0^6;
  10. sbit p07=P0^5;
  11. sbit p08=P0^4;
  12. sbit p09=P0^3;
  13. sbit p10=P0^2;

  14. sbit p11=P0^1;
  15. sbit p12=P0^0;
  16. sbit p13=P1^0;
  17. sbit p14=P1^1;
  18. sbit p15=P1^4;
  19. sbit p16=P1^5;
  20. sbit p17=P1^6;
  21. sbit p18=P1^7;
  22. sbit p19=P3^2;
  23. sbit p20=P3^3;

  24. sbit p21=P3^4;
  25. sbit p22=P3^5;
  26. sbit p23=P3^6;
  27. sbit p24=P3^7;
  28. sbit p25=P2^5;
  29. sbit p26=P2^4;
  30. sbit p27=P2^3;
  31. sbit p28=P2^2;
  32. sbit p29=P2^1;
  33. sbit p30=P2^0;
  34. unsigned char ck1=0;
  35. unsigned char ck2=0;
  36. unsigned char ck3=0;
  37. unsigned char ck4=0;
  38. unsigned char ck5=0;
  39. unsigned char ck6=0;
  40. unsigned char ck7=0;
  41. unsigned char ck8=0;
  42. void ConfigTimer0(unsigned int ms);           //配置并启动T0,ms-T0定时时间

  43. extern void UUartDriver();                                                                     //串口驱动函数,监测数据帧的接收          放到while里最顶部
  44. extern void init(void);                                     //波特率配置            放到main函数里 ConfigUART(9600);波特率9600
  45. extern void UUartRxMonitor(unsigned char ms);                             //串口接收监控,由空闲时间判定帧结束 放到中断里  中断设置为1ms                UUartRxMonitor(1);
  46. extern void UUartWrite(unsigned char buf);//串口写函数                                                  直接调用

  47. unsigned char receivepath1='1';//表示发送的地址01,第一块板子的地址为01,第二块板子的地址为02
  48. unsigned char receivepath2='0';//表示发送的地址
  49. unsigned char receiveb1='e';//报头报尾用
  50. unsigned char receivebt='a';//表示报头
  51. unsigned char receivebw='b';//表示报尾
  52. unsigned char receiveexcess='0';//表示多余的位
  53. unsigned char receiveopen='0';//开
  54. unsigned char receiveclose='1';//关
  55. void main()
  56. {
  57.    P4SW|=0x20;                   //配置P4.5为IO口
  58.    P4M0|=0x10;                   //配置P4.4为IO口
  59.   
  60.     EA = 1;            //开总中断
  61.     ConfigTimer0(1);   //配置T0定时1ms
  62.     init();
  63.    
  64.     while (1)
  65.     {
  66.         UUartDriver();  //调用串口驱动
  67.     }
  68. }

  69. /* 串口动作函数,根据接收到的命令帧执行响应的动作
  70.    buf-接收到的命令帧指针,len-命令帧长度 */
  71. void UUartAction(unsigned char *buf, unsigned char len)
  72. {
  73. //接收上位机的命令

  74.         if((buf[0] == receiveb1)&&(buf[1] == receivebt)&&(buf[2] == receivepath1)&&(buf[3] == receivepath2)&&(buf[8] == receiveb1)&&(buf[9] == receivebw )&&(len == 10)){
  75.                 if((buf[4] == '0')&&(buf[5] == '0')&&(buf[6] == '0')&&(buf[7] == '0')){//开
  76.                         p01 = 0;p02 = 0;p03 = 0;p04 = 0;p05 = 0;p06 = 0;p07 = 0;p08 = 0;p09 = 0;p10 = 0;
  77.                         p11 = 0;p12 = 0;p13 = 0;p14 = 0;p15 = 0;p16 = 0;p17 = 0;p18 = 0;p19 = 0;p20 = 0;
  78.                         p21 = 0;p22 = 0;p23 = 0;p24 = 0;p25 = 0;p26 = 0;p27 = 0;p28 = 0;p29 = 0;p30 = 0;
  79.                 }
  80.                 if((buf[4] == '0')&&(buf[5] == '0')&&(buf[6] == '1')&&(buf[7] == '1')){//关
  81.                         p01 = 1;p02 = 1;p03 = 1;p04 = 1;p05 = 1;p06 = 1;p07 = 1;p08 = 1;p09 = 1;p10 = 1;
  82.                         p11 = 1;p12 = 1;p13 = 1;p14 = 1;p15 = 1;p16 = 1;p17 = 1;p18 = 1;p19 = 1;p20 = 1;
  83.                         p21 = 1;p22 = 1;p23 = 1;p24 = 1;p25 = 1;p26 = 1;p27 = 1;p28 = 1;p29 = 1;p30 = 1;
  84.                 }
  85.         }
  86.         if((buf[0] == receiveb1)&&(buf[1] == receivebt)&&(buf[2] == receivepath1)&&(buf[3] == receivepath2)&&(buf[8] == receiveb1)&&(buf[9] == receivebw )&&(len == 10)){
  87.                 if((buf[6] == receiveexcess)&&(buf[7] == receiveopen)){//开
  88.                         if((buf[4] == '0')&&(buf[5] == '1')){p01 = 0;}
  89.                         if((buf[4] == '0')&&(buf[5] == '2')){p02 = 0;}               
  90.                         if((buf[4] == '0')&&(buf[5] == '3')){p03 = 0;}
  91.                         if((buf[4] == '0')&&(buf[5] == '4')){p04 = 0;}       
  92.                         if((buf[4] == '0')&&(buf[5] == '5')){p05 = 0;}       
  93.                         if((buf[4] == '0')&&(buf[5] == '6')){p06 = 0;}       
  94.                         if((buf[4] == '0')&&(buf[5] == '7')){p07 = 0;}       
  95.                         if((buf[4] == '0')&&(buf[5] == '8')){p08 = 0;}       
  96.                         if((buf[4] == '0')&&(buf[5] == '9')){p09 = 0;}       
  97.                         if((buf[4] == '1')&&(buf[5] == '0')){p10 = 0;}
  98.                                
  99.                         if((buf[4] == '1')&&(buf[5] == '1')){p11 = 0;}       
  100.                         if((buf[4] == '1')&&(buf[5] == '2')){p12 = 0;}       
  101.                         if((buf[4] == '1')&&(buf[5] == '3')){p13 = 0;}       
  102.                         if((buf[4] == '1')&&(buf[5] == '4')){p14 = 0;}       
  103.                         if((buf[4] == '1')&&(buf[5] == '5')){p15 = 0;}       
  104.                         if((buf[4] == '1')&&(buf[5] == '6')){p16 = 0;}       
  105.                         if((buf[4] == '1')&&(buf[5] == '7')){p17 = 0;}       
  106.                         if((buf[4] == '1')&&(buf[5] == '8')){p18 = 0;}       
  107.                         if((buf[4] == '1')&&(buf[5] == '9')){p19 = 0;}       
  108.                         if((buf[4] == '2')&&(buf[5] == '0')){p20 = 0;}
  109.                                
  110.                         if((buf[4] == '2')&&(buf[5] == '1')){p21 = 0;}       
  111.                         if((buf[4] == '2')&&(buf[5] == '2')){p22 = 0;}       
  112.                         if((buf[4] == '2')&&(buf[5] == '3')){p23 = 0;}       
  113.                         if((buf[4] == '2')&&(buf[5] == '4')){p24 = 0;}       
  114.                         if((buf[4] == '2')&&(buf[5] == '5')){p25 = 0;}       
  115.                         if((buf[4] == '2')&&(buf[5] == '6')){p26 = 0;}       
  116.                         if((buf[4] == '2')&&(buf[5] == '7')){p27 = 0;}       
  117.                         if((buf[4] == '2')&&(buf[5] == '8')){p28 = 0;}       
  118.                         if((buf[4] == '2')&&(buf[5] == '9')){p29 = 0;}       
  119.                         if((buf[4] == '3')&&(buf[5] == '0')){p30 = 0;}       
  120.                 }
  121.                 if((buf[6] == receiveexcess)&&(buf[7] == receiveclose)){//关
  122.                         if((buf[4] == '0')&&(buf[5] == '1')){p01 = 1;}
  123.                         if((buf[4] == '0')&&(buf[5] == '2')){p02 = 1;}       
  124.                         if((buf[4] == '0')&&(buf[5] == '3')){p03 = 1;}
  125.                         if((buf[4] == '0')&&(buf[5] == '4')){p04 = 1;}       
  126.                         if((buf[4] == '0')&&(buf[5] == '5')){p05 = 1;}       
  127.                         if((buf[4] == '0')&&(buf[5] == '6')){p06 = 1;}       
  128.                         if((buf[4] == '0')&&(buf[5] == '7')){p07 = 1;}       
  129.                         if((buf[4] == '0')&&(buf[5] == '8')){p08 = 1;}       
  130.                         if((buf[4] == '0')&&(buf[5] == '9')){p09 = 1;}       
  131.                         if((buf[4] == '1')&&(buf[5] == '0')){p10 = 1;}
  132.                                
  133.                         if((buf[4] == '1')&&(buf[5] == '1')){p11 = 1;}       
  134.                         if((buf[4] == '1')&&(buf[5] == '2')){p12 = 1;}       
  135.                         if((buf[4] == '1')&&(buf[5] == '3')){p13 = 1;}       
  136.                         if((buf[4] == '1')&&(buf[5] == '4')){p14 = 1;}       
  137.                         if((buf[4] == '1')&&(buf[5] == '5')){p15 = 1;}       
  138.                         if((buf[4] == '1')&&(buf[5] == '6')){p16 = 1;}       
  139.                         if((buf[4] == '1')&&(buf[5] == '7')){p17 = 1;}       
  140.                         if((buf[4] == '1')&&(buf[5] == '8')){p18 = 1;}       
  141.                         if((buf[4] == '1')&&(buf[5] == '9')){p19 = 1;}       
  142.                         if((buf[4] == '2')&&(buf[5] == '0')){p20 = 1;}       
  143.                        
  144.                         if((buf[4] == '2')&&(buf[5] == '1')){p21 = 1;}       
  145.                         if((buf[4] == '2')&&(buf[5] == '2')){p22 = 1;}       
  146.                         if((buf[4] == '2')&&(buf[5] == '3')){p23 = 1;}       
  147.                         if((buf[4] == '2')&&(buf[5] == '4')){p24 = 1;}       
  148.                         if((buf[4] == '2')&&(buf[5] == '5')){p25 = 1;}       
  149.                         if((buf[4] == '2')&&(buf[5] == '6')){p26 = 1;}       
  150.                         if((buf[4] == '2')&&(buf[5] == '7')){p27 = 1;}       
  151.                         if((buf[4] == '2')&&(buf[5] == '8')){p28 = 1;}       
  152.                         if((buf[4] == '2')&&(buf[5] == '9')){p29 = 1;}       
  153.                         if((buf[4] == '3')&&(buf[5] == '0')){p30 = 1;}       
  154.                 }
  155.         }
  156. }
  157. /* 配置并启动T0,ms-T0定时时间 */
  158. void ConfigTimer0(unsigned int ms)
  159. {
  160.     unsigned long tmp;  //临时变量
  161.    
  162.     tmp = 11059200 / 12;      //定时器计数频率
  163.     tmp = (tmp * ms) / 1000;  //计算所需的计数值
  164.     tmp = 65536 - tmp;        //计算定时器重载值
  165.     tmp = tmp + 33;           //补偿中断响应延时造成的误差
  166.     T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节
  167.     T0RL = (unsigned char)tmp;
  168.     TMOD &= 0xF0;   //清零T0的控制位
  169.     TMOD |= 0x01;   //配置T0为模式1
  170.     TH0 = T0RH;     //加载T0重载值
  171.     TL0 = T0RL;
  172.     ET0 = 1;        //使能T0中断
  173.     TR0 = 1;        //启动T0
  174. }
  175. /* T0中断服务函数,执行串口接收监控 */
  176. void InterruptTimer0() interrupt 1
  177. {
  178.     TH0 = T0RH;  //重新加载重载值
  179.     TL0 = T0RL;
  180.     UUartRxMonitor(1);  //串口接收监控
  181. }
复制代码

所有资料51hei提供下载:
标示图.JPG
接线图.JPG
应用举例 - 副本.JPG

30路继电器可编程模块485及232尺寸图.pdf

1.03 MB, 下载次数: 70, 下载积分: 黑币 -5

30路继电器可编程模块带485及232设计资料使用说明.doc

2.66 MB, 下载次数: 84, 下载积分: 黑币 -5

300路上下位机.7z

573.87 KB, 下载次数: 89, 下载积分: 黑币 -5

330路上下位机通讯源码.7z

572.96 KB, 下载次数: 90, 下载积分: 黑币 -5

定时发送命令30路源码安装包下位机.7z

17.22 MB, 下载次数: 84, 下载积分: 黑币 -5

多板子通讯上下位机通讯源码.7z

577.79 KB, 下载次数: 92, 下载积分: 黑币 -5

回复

使用道具 举报

ID:356451 发表于 2018-6-21 21:55 | 显示全部楼层
找了好久的单片机控制继电器代码学习,终于让我找到了
回复

使用道具 举报

ID:265485 发表于 2018-6-22 20:37 | 显示全部楼层
垃圾 你这发出来有什么用 卖板子吗
回复

使用道具 举报

ID:336629 发表于 2018-8-4 11:56 | 显示全部楼层
学习学习吧
回复

使用道具 举报

ID:63042 发表于 2018-8-14 14:44 | 显示全部楼层
555在电路里是干嘛用的?
回复

使用道具 举报

ID:322594 发表于 2018-8-14 15:32 | 显示全部楼层
可以的   
回复

使用道具 举报

ID:322594 发表于 2018-8-14 15:33 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:452173 发表于 2018-12-27 22:51 | 显示全部楼层
485双通信,学习了,谢谢楼主。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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