找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3214|回复: 4
收起左侧

STM32 MOUBUS RTU主从站程序

[复制链接]
ID:403544 发表于 2021-1-28 16:35 | 显示全部楼层 |阅读模式
本次发布经过验证的MODBUS RTU 主从程序  可以移植于其他的基于C语言的平台  本程序基于KEIL 已经用于部分项目上

单片机源程序如下:
  1. #include "stm32f10x_wwdg.h"
  2. #include "stm32f10x.h"
  3. #include "stm32f10x_tim.h"
  4. #include "stm32f10x_usart.h"
  5. #include "misc.h"
  6. #include "systic.h"
  7. #include "rs485.h"
  8. #include "sys.h"
  9. #include "port.h"       
  10. #include "RTU.h"       
  11. #include "LED.h"

  12. #define LAMP_OFF_1 GPIO_SetBits(GPIOA,GPIO_Pin_6);         
  13. #define LAMP_ON_1 GPIO_ResetBits(GPIOA,GPIO_Pin_6);       

  14. #define LAMP_OFF_2 GPIO_SetBits(GPIOA,GPIO_Pin_7);         
  15. #define LAMP_ON_2 GPIO_ResetBits(GPIOA,GPIO_Pin_7);

  16. #define LAMP_OFF_3 GPIO_SetBits(GPIOB,GPIO_Pin_0);         
  17. #define LAMP_ON_3 GPIO_ResetBits(GPIOB,GPIO_Pin_0);

  18. #define LAMP_OFF_4 GPIO_SetBits(GPIOB,GPIO_Pin_1);         
  19. #define LAMP_ON_4 GPIO_ResetBits(GPIOB,GPIO_Pin_1);

  20. #define LAMP_OFF_5 GPIO_SetBits(GPIOB,GPIO_Pin_2);         
  21. #define LAMP_ON_5 GPIO_ResetBits(GPIOB,GPIO_Pin_2);

  22. #define LAMP_OFF_9 GPIO_SetBits(GPIOB,GPIO_Pin_10);         
  23. #define LAMP_ON_9 GPIO_ResetBits(GPIOB,GPIO_Pin_10);

  24. #define LAMP_OFF_7 GPIO_SetBits(GPIOB,GPIO_Pin_11);  
  25. #define LAMP_ON_7 GPIO_ResetBits(GPIOB,GPIO_Pin_11);

  26. #define LAMP_OFF_8 GPIO_SetBits(GPIOB,GPIO_Pin_12);         
  27. #define LAMP_ON_8 GPIO_ResetBits(GPIOB,GPIO_Pin_12);

  28. #define LAMP_OFF_6 GPIO_SetBits(GPIOB,GPIO_Pin_13);         
  29. #define LAMP_ON_6 GPIO_ResetBits(GPIOB,GPIO_Pin_13);

  30. #define LAMP_OFF_10 GPIO_SetBits(GPIOB,GPIO_Pin_14);         
  31. #define LAMP_ON_10 GPIO_ResetBits(GPIOB,GPIO_Pin_14);

  32. #define LAMP_OFF_11 GPIO_SetBits(GPIOB,GPIO_Pin_15);         
  33. #define LAMP_ON_11 GPIO_ResetBits(GPIOB,GPIO_Pin_15);

  34. #define LAMP_OFF_12 GPIO_SetBits(GPIOA,GPIO_Pin_8);         
  35. #define LAMP_ON_12 GPIO_ResetBits(GPIOA,GPIO_Pin_8);       

  36. #define LAMP_OFF_13 GPIO_SetBits(GPIOA,GPIO_Pin_9);         
  37. #define LAMP_ON_13 GPIO_ResetBits(GPIOA,GPIO_Pin_9);       

  38. #define LAMP_OFF_14 GPIO_SetBits(GPIOA,GPIO_Pin_10);         
  39. #define LAMP_ON_14 GPIO_ResetBits(GPIOA,GPIO_Pin_10);       

  40. #define LAMP_OFF_15 GPIO_SetBits(GPIOA,GPIO_Pin_11);         
  41. #define LAMP_ON_15 GPIO_ResetBits(GPIOA,GPIO_Pin_11);       

  42. #define LAMP_OFF_16 GPIO_SetBits(GPIOA,GPIO_Pin_12);         
  43. #define LAMP_ON_16 GPIO_ResetBits(GPIOA,GPIO_Pin_12);
  44. void RS485_Config(u32 bound);                      //485初始化
  45. void Output_Init(void);                           //输出GPIO配置
  46. void Modbus_CoilsRefresh(unsigned char *mbOuputs);//关联GPIO端口
  47. void TIM2_NVIC_Configuration(void);               //中断参数配置//100MS
  48. void TIM2_Init(void);                            //时间2中断配置
  49. void TIM3_NVIC_Configuration(void);               //中断参数配置
  50. void TIM3_Init(void);                            //时间3中断配置//5MS
  51. void TIM3_IRQHandler(void);                       //定时中断3启用
  52. void RTU_05 (void);                           //主站主动发送函数
  53. void allLampOn();
  54. void allLampOff();
  55. void ledFlashType1StateFsm(int state);
  56. void ledFlashType1(int state);
  57. const int LED[15] = {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3};
  58. typedef struct ledFlashStru_T
  59. {
  60.         int state;
  61.         int timeSet[15];
  62.         int timeCount[15];
  63.         int flash2To7Time;
  64.         int flash2To7Count;
  65.         int flash10To11Time;
  66.         int flash10To11Count;
  67. }ledFlashStru_;
  68. ledFlashStru_ ledFlash_t;
  69. void ledFlash(int count);

  70. //定时中断
  71. void TIM2_IRQHandler(void)
  72. {

  73.         if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
  74.   {
  75.                 ledFlashType1StateFsm(ledFlash_t.state);       
  76.                 ledFlashType1(ledFlash_t.state);
  77.                 TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
  78.         }
  79. }

  80. void ledFlashStruInit()
  81. {
  82.         int i= 0;
  83.         ledFlash_t.state = 1;
  84.         for(i=0;i<16;i++)
  85.         {
  86.                 ledFlash_t.timeSet[i] = LED[i];
  87.         }
  88.         ledFlash_t.flash2To7Time = 3;
  89.         ledFlash_t.flash10To11Time = 5;
  90.         ledFlash_t.flash2To7Count = 0;
  91.         ledFlash_t.flash10To11Count = 0;
  92. }
  93. //100ms进入一次
  94. void ledFlashType1StateFsm(int state)
  95. {
  96.         static int timeCount = 0;
  97.         timeCount ++;
  98.         switch(state)
  99.         {
  100.                 case 1:
  101.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  102.                         {
  103.                                 timeCount = 0;
  104.                                 ledFlash_t.state = 2;
  105.                         }
  106.                         break;
  107.                 case 2:
  108.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  109.                         {
  110.                                 timeCount = 0;
  111.                                 ledFlash_t.state = 3;
  112.                         }
  113.                         break;
  114.                 case 3:
  115.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  116.                         {
  117.                                 timeCount = 0;
  118.                                 ledFlash_t.state = 4;
  119.                         }
  120.                         break;
  121.                 case 4:
  122.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  123.                         {
  124.                                 timeCount = 0;
  125.                                 ledFlash_t.state = 5;
  126.                         }
  127.                         break;
  128.                 case 5:
  129.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  130.                         {
  131.                                 timeCount = 0;
  132.                                 ledFlash_t.state = 6;
  133.                         }
  134.                         break;
  135.                 case 6:
  136.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  137.                         {
  138.                                 timeCount = 0;
  139.                                 ledFlash_t.state = 7;
  140.                         }
  141.                         break;
  142.                 case 7:
  143.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  144.                         {
  145.                                 timeCount = 0;
  146.                                 if(ledFlash_t.flash2To7Count > ledFlash_t.flash2To7Time )
  147.                                 {
  148.                                         ledFlash_t.flash2To7Count = 0;
  149.                                         ledFlash_t.state = 8;
  150.                                 }else
  151.                                 {
  152.                                         ledFlash_t.flash2To7Count ++;
  153.                                         ledFlash_t.state = 2;
  154.                                 }                               
  155.                         }
  156.                         break;
  157.                 case 8:
  158.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  159.                         {
  160.                                 timeCount = 0;
  161.                                 ledFlash_t.state = 9;
  162.                         }
  163.                         break;
  164.                 case 9:
  165.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  166.                         {
  167.                                 timeCount = 0;
  168.                                 ledFlash_t.state = 10;
  169.                         }
  170.                         break;
  171.                 case 10:
  172.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  173.                         {
  174.                                 timeCount = 0;
  175.                                 ledFlash_t.state = 11;
  176.                         }
  177.                         break;
  178.                 case 11:
  179.                         if(timeCount >= ledFlash_t.timeSet[state-1])
  180.                         {
  181.                                 timeCount = 0;
  182.                                 if(ledFlash_t.flash10To11Count > ledFlash_t.flash10To11Time)
  183.                                 {
  184.                                         ledFlash_t.flash10To11Count = 0;
  185.                                         ledFlash_t.state = 1;
  186.                                 }else
  187.                                 {
  188.                                         ledFlash_t.flash10To11Count ++;
  189.                                         ledFlash_t.state = 10;
  190.                                 }               
  191.                         }
  192.                         break;
  193.         }
  194. }
  195. void ledFlashType1(int state)
  196. {
  197.         switch(state)
  198.         {
  199.                 case 1:  
  200.                         allLampOn();
  201.                         break;
  202.                 case 2:  
  203.                         allLampOff();
  204.         LAMP_ON_1;
  205.         LAMP_ON_2;
  206.                         break;
  207.                 case 3:   
  208.                         allLampOff();
  209.         LAMP_ON_3;
  210.         LAMP_ON_4;       
  211.                         break;
  212.                 case 4:  
  213.                         allLampOff();
  214.         LAMP_ON_5;
  215.         LAMP_ON_6;
  216.        
  217.                         break;
  218.                 case 5:  
  219.                         allLampOff();
  220.         LAMP_ON_7;
  221.         LAMP_ON_8;
  222.                         break;
  223.                 case 6:  
  224.                         allLampOff();
  225.                         LAMP_ON_9;
  226.                         LAMP_ON_10;
  227.                         break;
  228.                 case 7:  
  229.                 //        allLampOn();
  230.                 allLampOff();
  231.                         LAMP_ON_11;
  232.                         LAMP_ON_12;
  233.                         break;
  234.                 case 8:  //全亮
  235.                         //allLampOn();
  236.                 allLampOff();
  237.                         LAMP_ON_13;
  238.                         LAMP_ON_14;
  239.                         break;
  240.                 case 9:  //灭
  241.                         allLampOff();
  242.                         LAMP_ON_15;
  243.                         LAMP_ON_16;
  244.                         break;
  245.                 case 10: //亮
  246.                         //allLampOn();
  247.                         break;       
  248.                 case 11: //灭
  249.                         //allLampOff();
  250.                         break;
  251.         }
  252. }

  253. void allLampOn()
  254. {
  255.         LAMP_ON_1;
  256.         LAMP_ON_2;
  257.         LAMP_ON_3;
  258.         LAMP_ON_4;
  259.         LAMP_ON_5;
  260.         LAMP_ON_6;
  261.         LAMP_ON_7;
  262.         LAMP_ON_8;
  263.         LAMP_ON_9;
  264.         LAMP_ON_10;
  265.         LAMP_ON_11;
  266.         LAMP_ON_12;
  267.         LAMP_ON_13;
  268.         LAMP_ON_14;
  269.         LAMP_ON_15;
  270.         LAMP_ON_16;
  271. }

  272. void allLampOff()
  273. {
  274.         LAMP_OFF_1;
  275.         LAMP_OFF_2;
  276.         LAMP_OFF_3;
  277.         LAMP_OFF_4;
  278.         LAMP_OFF_5;
  279.         LAMP_OFF_6;
  280.         LAMP_OFF_7;
  281.         LAMP_OFF_8;
  282.         LAMP_OFF_9;
  283.         LAMP_OFF_10;
  284.         LAMP_OFF_11;
  285.         LAMP_OFF_12;
  286.         LAMP_OFF_13;
  287.         LAMP_OFF_14;
  288.         LAMP_OFF_15;
  289.         LAMP_OFF_16;
  290. }
  291.        

  292. int main()
  293. {        
  294.         SystemInit();
  295.         Output_Init();
  296.   RS485_Config(115200);                             //初始化RS485串口1
  297.         TIM2_Init();                                     //定时器初始化
  298.         TIM3_Init();                                    //定时器初始化
  299.         ledFlashStruInit();
  300.   while(1)
  301.         {
  302.             
  303. // LAMP_ON_1 ;       
  304.   LAMP_ON_1;
  305.         LAMP_ON_2;
  306.         LAMP_ON_3;
  307.         LAMP_ON_4;
  308.         LAMP_ON_5;
  309.         LAMP_ON_6;
  310. //        LAMP_ON_7;
  311. //        LAMP_ON_8;
  312. //        LAMP_ON_9;
  313. //        LAMP_ON_10;
  314. //        LAMP_ON_11;
  315. //        LAMP_ON_12;
  316. //        LAMP_ON_13;
  317. //        LAMP_ON_14;
  318. //        LAMP_ON_15;
  319. //  LAMP_ON_16;  
  320.         }       

  321. }


  322. //void Modbus_02_Solve();
  323. //void Modbus_01_Solve();
  324. //void Modbus_04_Solve();
  325. //void Modbus_05_Solve();
  326. //void Modbus_15_Solve();
  327. //void Modbus_03_Solve();
  328. //void Modbus_06_Solve();
  329. //void Modbus_16_Solve();
复制代码
51hei.png
所有资料51hei提供下载:
Modbus_Master_slave.7z (311.43 KB, 下载次数: 74)

评分

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

查看全部评分

回复

使用道具 举报

ID:881297 发表于 2021-1-29 08:45 | 显示全部楼层
最近正在研究modbus,赞!
回复

使用道具 举报

ID:469589 发表于 2021-1-29 21:23 | 显示全部楼层
没能看到需要的知识点。不过还是需要谢谢分享!
回复

使用道具 举报

ID:94359 发表于 2021-2-3 23:56 | 显示全部楼层
大半夜的来支持
回复

使用道具 举报

ID:883242 发表于 2021-2-7 17:14 | 显示全部楼层
楼主你贴的这段代码跟MODBUS没有任何关系,节约黑币我就不下载了。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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