找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1045|回复: 12
打印 上一主题 下一主题
收起左侧

STC8952单片机通过串口控制30个继电器模组(带上位机)

[复制链接]
跳转到指定楼层
楼主
上位机界面:





51单片机源码:
  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include "STC89C51RC_EEPROM.h"  //调用STC89C51RC的EEPROM读写头文件

  4. /*************  本地常量声明    **************/
  5. #define uchar unsigned char
  6. #define uint  unsigned int
  7. //------------------------------------------------------------------
  8. unsigned char code OnOffTab[10] = {0x80, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0xFF, 0x00};
  9. //------------------------------------------------------------------
  10. unsigned char HDAddr = 0x01;//模块地址 默认01
  11. unsigned char HdSerID[7];//模块ID
  12. //------------------------------------------------------------------
  13. void SendtoCom(unsigned char CCode, Data1, Data2, Data3, Data4); //向串口发送数据
  14. //------------------------------------------------------------------
  15. void ProcessData( void );//处理来自串口接收到的数据
  16. //------------------------------------------------------------------
  17. void SaveEEProm( void );//保存系统变量
  18. //------------------------------------------------------------------
  19. void ReadEEProm( void );//读取系统变量
  20. //------------------------------------------------------------------

  21. //
  22. uchar tClock = 3;//默认3秒关闭
  23. uchar vTotal = 0;
  24. /*********************串口数据通讯 开始******************************/
  25. #define INBUF_LEN 8 //8位数据长度
  26. //字节1     字节2   字节3   字节4   字节5   字节6     字节7
  27. //同步字节  地址码  指令码1 数据码2 数据码3 数据码4   校验码
  28. //通信协议: 第1字节,恒为AF,为协议同步字标志,第2字节,为地址码00-FF, 第3-6字节为数据码,字节7为校验码,即1-6个字节后7位的异或校验和。
  29. unsigned char inBuf[INBUF_LEN], outBuf[INBUF_LEN];
  30. //
  31. unsigned char Cnum;
  32. //
  33. //
  34. bit B_TX1_Busy = 0; //发送忙标志

  35. #define BAUD_1200  0xD0  // 波特率为1200   
  36. #define BAUD_2400  0xE8     // 波特率为2400
  37. #define BAUD_4800  0xF4     // 波特率为4800
  38. #define BAUD_7200  0xF8     // 波特率为7200
  39. #define BAUD_9600  0xFA     // 波特率为9600
  40. #define BAUD_14400  0xFC     // 波特率为14400
  41. #define BAUD_19200  0xFD     // 波特率为19200
  42. //11.0592最高所支持的波特率为19200

  43. //------------------------------------------------------------------
  44. //串口初始化
  45. //------------------------------------------------------------------

  46. //------------------------------------------------------------------
  47. //向串口发送数据(带校验)
  48. //------------------------------------------------------------------
  49. void SendtoCom(unsigned char CCode, Data1, Data2, Data3, Data4)
  50. {
  51.     unsigned char i = 0;
  52.     {
  53.         //--------------------------------------------
  54.         outBuf[0] = 0xFE; //同步字 恒为FE
  55.         outBuf[1] = HDAddr; //地址码01-FF
  56.         outBuf[2] = CCode; //指令码
  57.         outBuf[3] = Data1; //数据码1
  58.         outBuf[4] = Data2; //数据码2
  59.         outBuf[5] = Data3; //数据码3
  60.         outBuf[6] = Data4; //数据码4
  61.         outBuf[7] = 0x80; //校验码
  62.         //--------------------------------------------
  63.         for (i == 0; i < 7; i++)
  64.         {
  65.             outBuf[7] ^= outBuf[i]; //校验
  66.         }
  67.         //
  68.         if(!B_TX1_Busy)     //发送空闲
  69.         {
  70.             i = 0;
  71.             B_TX1_Busy = 1;     //标志发送忙
  72.             do
  73.             {
  74.                 SBUF = outBuf[i]; //发一个字节
  75.                 i++;
  76.                 Delay_ms(20);      //延时
  77.             }
  78.             while (i < 8);
  79.         }
  80.         B_TX1_Busy = 0;     //清除发送忙标志
  81.         //--------------------------------------------
  82.     }
  83. }
  84. sbit JDQ00 = P0 ^ 0;
  85. sbit JDQ01 = P0 ^ 1;
  86. sbit JDQ02 = P0 ^ 2;
  87. [b]。。。发贴长度受限,详见附件代码。sbit JDQ26 = P3 ^ 2;[/b]
  88. sbit JDQ27 = P3 ^ 3;
  89. sbit JDQ28 = P3 ^ 4;
  90. sbit JDQ29 = P3 ^ 5;
  91. sbit JDQ30 = P3 ^ 6;
  92. sbit JDQ31 = P3 ^ 7;
  93. //------------------------------------------------------------------
  94. //串口接收中断函数
  95. //------------------------------------------------------------------
  96. void serial () interrupt 4 using 3

  97. /*********************串口数据通讯 结束******************************/
  98. //------------------------------------------------------------------
  99. //定时器中断,用于自动校准称重数据
  100. //------------------------------------------------------------------
  101. void DingShi() interrupt 1 using 1    //声明定时器中断处理函数,所以X的值为1
  102. {
  103.     uchar i;        //定义一个临时变量
  104.     //
  105.     if (i >= 20) //因为是50ms发生一次中断,每次中断i的值就加1,当i=20时,50ms*20=1秒时间到了
  106.     {
  107.         i = 0;       //i的值清零
  108.         vTotal++;//累加1秒
  109.         if (vTotal >= tClock - 1)
  110.         {
  111.             vTotal = 0;
  112.             P0 = 0xFF;
  113.             P2 = 0xFF;
  114.             P1 = 0xFF;
  115.             P3 = 0xFF | 0x03;
  116.             SendtoCom(0xB0, P0, P2, P1, P3); //返回信息
  117.             TR0 = 0;   //TR=1是定时器工作,0是停止工作
  118.         }
  119.     }

  120.     i++;            //每发生一次中断,i的值就加1
  121.     TH0 = (65536 - 50000) / 256; //重新给定时器TH0装初始值  50000微秒=50ms
  122.     TL0 = (65536 - 50000) % 256;  //重新给定时器TL0装初始值  50000微秒=50ms
  123. }


  124. /[b]。。。发贴长度受限,详见附件代码。sbit JDQ26 = P3 ^ 2;[/b]

  125. /*****************main主函数*****************/
  126. void main()
  127. {
  128.     P0 = 0xFF;
  129.     P1 = 0xFF;
  130.     P2 = 0xFF;
  131.     P3 = 0xFF;
  132.     //
  133.     tClock = STC89CXX_EEPROM_Char_Read(0x20, 0x00);
  134.     /*
  135.        uint temp = -100;
  136.        unsigned char i = 0;
  137.        Cnum = 0;
  138.        AutoTrans = 0;*/
  139.     //-----------------------------------------------------------
  140.     //看门狗定时器溢出时间计算公式: (12 * 32768 * PS) / FOSC (秒)
  141.     //设置看门狗定时器分频数为32,溢出时间如下:
  142.     //11.0592M : 1.14s
  143.     //18.432M  : 0.68s
  144.     //20M      : 0.63s
  145.     //启动看门狗
  146.     //WDT_reset(D_WDT_SCALE_64);//初始化WDT,喂狗1.25s喂一次
  147.     //-----------------------------------------------------------
  148.     Timer0Init();
  149.     Delay_ms(1000);
  150.     init_serialCom(); //初始化串口
  151.     Delay_ms(1000);
  152.     //-----------------------------------------------------------
  153.     //
  154.     while(1)//主函数大循环
  155.     {
  156.     }
  157. }
复制代码





上位机源码: 无
上位机exe文件和51的Keil工程下载:
STC8952通过串口控制30个继电器模组(带上位机).rar (242.54 KB, 下载次数: 0)




评分

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

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:170693 发表于 2025-10-15 16:14 | 只看该作者
感谢楼主的无私奉献。
回复

使用道具 举报

板凳
ID:187303 发表于 2025-10-15 19:09 | 只看该作者
回复

使用道具 举报

地板
ID:123917 发表于 2025-10-15 20:07 | 只看该作者
你好,上位机是什么软件做的?
回复

使用道具 举报

5#
ID:187303 发表于 2025-10-16 08:51 | 只看该作者
wjfw 发表于 2025-10-15 20:07
你好,上位机是什么软件做的?

Delphi 7
回复

使用道具 举报

6#
ID:712493 发表于 2025-10-16 09:45 | 只看该作者
能把01-32改成可以修改的?
回复

使用道具 举报

7#
ID:1134482 发表于 2025-10-16 10:13 | 只看该作者
用CAN总线是不是会更好?
回复

使用道具 举报

8#
ID:1107340 发表于 2025-10-16 19:10 | 只看该作者
非常感谢楼主的无私奉献。
回复

使用道具 举报

9#
ID:187303 发表于 2025-10-17 17:05 | 只看该作者
fj51hei 发表于 2025-10-16 09:45
能把01-32改成可以修改的?

没明白什么意思,是自由修改上位机窗口按键的文字?
回复

使用道具 举报

10#
ID:187303 发表于 2025-10-17 17:08 | 只看该作者
上位机源码来了,D7开发

Delphi7上位机源码-TComPort.rar

892.92 KB, 下载次数: 0, 下载积分: 黑币 -5

回复

使用道具 举报

11#
ID:187303 发表于 2025-10-17 18:21 | 只看该作者
craigtao 发表于 2025-10-16 10:13
用CAN总线是不是会更好?

看你用在什么地方了,51需要另加IC才可以用CAN
RS232有效传输距离一般为15米左右,RS485是1200米,CAN低速率下最远10公里,简单控制开关没有哪种更好一说。
回复

使用道具 举报

12#
ID:712493 发表于 2025-10-18 08:47 | 只看该作者
cm7626 发表于 2025-10-17 17:05
没明白什么意思,是自由修改上位机窗口按键的文字?

对 这样控制什么对象就明白了
回复

使用道具 举报

13#
ID:187303 发表于 2025-10-18 11:07 | 只看该作者

上位机_v1.1.rar

206.28 KB, 下载次数: 0, 下载积分: 黑币 -5

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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