标题:
STM32 MOUBUS RTU主从站程序
[打印本页]
作者:
WANGRUIQI
时间:
2021-1-28 16:35
标题:
STM32 MOUBUS RTU主从站程序
本次发布经过验证的MODBUS RTU 主从程序 可以移植于其他的基于C语言的平台 本程序基于KEIL 已经用于部分项目上
单片机源程序如下:
#include "stm32f10x_wwdg.h"
#include "stm32f10x.h"
#include "stm32f10x_tim.h"
#include "stm32f10x_usart.h"
#include "misc.h"
#include "systic.h"
#include "rs485.h"
#include "sys.h"
#include "port.h"
#include "RTU.h"
#include "LED.h"
#define LAMP_OFF_1 GPIO_SetBits(GPIOA,GPIO_Pin_6);
#define LAMP_ON_1 GPIO_ResetBits(GPIOA,GPIO_Pin_6);
#define LAMP_OFF_2 GPIO_SetBits(GPIOA,GPIO_Pin_7);
#define LAMP_ON_2 GPIO_ResetBits(GPIOA,GPIO_Pin_7);
#define LAMP_OFF_3 GPIO_SetBits(GPIOB,GPIO_Pin_0);
#define LAMP_ON_3 GPIO_ResetBits(GPIOB,GPIO_Pin_0);
#define LAMP_OFF_4 GPIO_SetBits(GPIOB,GPIO_Pin_1);
#define LAMP_ON_4 GPIO_ResetBits(GPIOB,GPIO_Pin_1);
#define LAMP_OFF_5 GPIO_SetBits(GPIOB,GPIO_Pin_2);
#define LAMP_ON_5 GPIO_ResetBits(GPIOB,GPIO_Pin_2);
#define LAMP_OFF_9 GPIO_SetBits(GPIOB,GPIO_Pin_10);
#define LAMP_ON_9 GPIO_ResetBits(GPIOB,GPIO_Pin_10);
#define LAMP_OFF_7 GPIO_SetBits(GPIOB,GPIO_Pin_11);
#define LAMP_ON_7 GPIO_ResetBits(GPIOB,GPIO_Pin_11);
#define LAMP_OFF_8 GPIO_SetBits(GPIOB,GPIO_Pin_12);
#define LAMP_ON_8 GPIO_ResetBits(GPIOB,GPIO_Pin_12);
#define LAMP_OFF_6 GPIO_SetBits(GPIOB,GPIO_Pin_13);
#define LAMP_ON_6 GPIO_ResetBits(GPIOB,GPIO_Pin_13);
#define LAMP_OFF_10 GPIO_SetBits(GPIOB,GPIO_Pin_14);
#define LAMP_ON_10 GPIO_ResetBits(GPIOB,GPIO_Pin_14);
#define LAMP_OFF_11 GPIO_SetBits(GPIOB,GPIO_Pin_15);
#define LAMP_ON_11 GPIO_ResetBits(GPIOB,GPIO_Pin_15);
#define LAMP_OFF_12 GPIO_SetBits(GPIOA,GPIO_Pin_8);
#define LAMP_ON_12 GPIO_ResetBits(GPIOA,GPIO_Pin_8);
#define LAMP_OFF_13 GPIO_SetBits(GPIOA,GPIO_Pin_9);
#define LAMP_ON_13 GPIO_ResetBits(GPIOA,GPIO_Pin_9);
#define LAMP_OFF_14 GPIO_SetBits(GPIOA,GPIO_Pin_10);
#define LAMP_ON_14 GPIO_ResetBits(GPIOA,GPIO_Pin_10);
#define LAMP_OFF_15 GPIO_SetBits(GPIOA,GPIO_Pin_11);
#define LAMP_ON_15 GPIO_ResetBits(GPIOA,GPIO_Pin_11);
#define LAMP_OFF_16 GPIO_SetBits(GPIOA,GPIO_Pin_12);
#define LAMP_ON_16 GPIO_ResetBits(GPIOA,GPIO_Pin_12);
void RS485_Config(u32 bound); //485初始化
void Output_Init(void); //输出GPIO配置
void Modbus_CoilsRefresh(unsigned char *mbOuputs);//关联GPIO端口
void TIM2_NVIC_Configuration(void); //中断参数配置//100MS
void TIM2_Init(void); //时间2中断配置
void TIM3_NVIC_Configuration(void); //中断参数配置
void TIM3_Init(void); //时间3中断配置//5MS
void TIM3_IRQHandler(void); //定时中断3启用
void RTU_05 (void); //主站主动发送函数
void allLampOn();
void allLampOff();
void ledFlashType1StateFsm(int state);
void ledFlashType1(int state);
const int LED[15] = {3,3,3,3,3,3,3,3,3,3,3,3,3,3,3};
typedef struct ledFlashStru_T
{
int state;
int timeSet[15];
int timeCount[15];
int flash2To7Time;
int flash2To7Count;
int flash10To11Time;
int flash10To11Count;
}ledFlashStru_;
ledFlashStru_ ledFlash_t;
void ledFlash(int count);
//定时中断
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
ledFlashType1StateFsm(ledFlash_t.state);
ledFlashType1(ledFlash_t.state);
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
void ledFlashStruInit()
{
int i= 0;
ledFlash_t.state = 1;
for(i=0;i<16;i++)
{
ledFlash_t.timeSet[i] = LED[i];
}
ledFlash_t.flash2To7Time = 3;
ledFlash_t.flash10To11Time = 5;
ledFlash_t.flash2To7Count = 0;
ledFlash_t.flash10To11Count = 0;
}
//100ms进入一次
void ledFlashType1StateFsm(int state)
{
static int timeCount = 0;
timeCount ++;
switch(state)
{
case 1:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
ledFlash_t.state = 2;
}
break;
case 2:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
ledFlash_t.state = 3;
}
break;
case 3:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
ledFlash_t.state = 4;
}
break;
case 4:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
ledFlash_t.state = 5;
}
break;
case 5:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
ledFlash_t.state = 6;
}
break;
case 6:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
ledFlash_t.state = 7;
}
break;
case 7:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
if(ledFlash_t.flash2To7Count > ledFlash_t.flash2To7Time )
{
ledFlash_t.flash2To7Count = 0;
ledFlash_t.state = 8;
}else
{
ledFlash_t.flash2To7Count ++;
ledFlash_t.state = 2;
}
}
break;
case 8:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
ledFlash_t.state = 9;
}
break;
case 9:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
ledFlash_t.state = 10;
}
break;
case 10:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
ledFlash_t.state = 11;
}
break;
case 11:
if(timeCount >= ledFlash_t.timeSet[state-1])
{
timeCount = 0;
if(ledFlash_t.flash10To11Count > ledFlash_t.flash10To11Time)
{
ledFlash_t.flash10To11Count = 0;
ledFlash_t.state = 1;
}else
{
ledFlash_t.flash10To11Count ++;
ledFlash_t.state = 10;
}
}
break;
}
}
void ledFlashType1(int state)
{
switch(state)
{
case 1:
allLampOn();
break;
case 2:
allLampOff();
LAMP_ON_1;
LAMP_ON_2;
break;
case 3:
allLampOff();
LAMP_ON_3;
LAMP_ON_4;
break;
case 4:
allLampOff();
LAMP_ON_5;
LAMP_ON_6;
break;
case 5:
allLampOff();
LAMP_ON_7;
LAMP_ON_8;
break;
case 6:
allLampOff();
LAMP_ON_9;
LAMP_ON_10;
break;
case 7:
// allLampOn();
allLampOff();
LAMP_ON_11;
LAMP_ON_12;
break;
case 8: //全亮
//allLampOn();
allLampOff();
LAMP_ON_13;
LAMP_ON_14;
break;
case 9: //灭
allLampOff();
LAMP_ON_15;
LAMP_ON_16;
break;
case 10: //亮
//allLampOn();
break;
case 11: //灭
//allLampOff();
break;
}
}
void allLampOn()
{
LAMP_ON_1;
LAMP_ON_2;
LAMP_ON_3;
LAMP_ON_4;
LAMP_ON_5;
LAMP_ON_6;
LAMP_ON_7;
LAMP_ON_8;
LAMP_ON_9;
LAMP_ON_10;
LAMP_ON_11;
LAMP_ON_12;
LAMP_ON_13;
LAMP_ON_14;
LAMP_ON_15;
LAMP_ON_16;
}
void allLampOff()
{
LAMP_OFF_1;
LAMP_OFF_2;
LAMP_OFF_3;
LAMP_OFF_4;
LAMP_OFF_5;
LAMP_OFF_6;
LAMP_OFF_7;
LAMP_OFF_8;
LAMP_OFF_9;
LAMP_OFF_10;
LAMP_OFF_11;
LAMP_OFF_12;
LAMP_OFF_13;
LAMP_OFF_14;
LAMP_OFF_15;
LAMP_OFF_16;
}
int main()
{
SystemInit();
Output_Init();
RS485_Config(115200); //初始化RS485串口1
TIM2_Init(); //定时器初始化
TIM3_Init(); //定时器初始化
ledFlashStruInit();
while(1)
{
// LAMP_ON_1 ;
LAMP_ON_1;
LAMP_ON_2;
LAMP_ON_3;
LAMP_ON_4;
LAMP_ON_5;
LAMP_ON_6;
// LAMP_ON_7;
// LAMP_ON_8;
// LAMP_ON_9;
// LAMP_ON_10;
// LAMP_ON_11;
// LAMP_ON_12;
// LAMP_ON_13;
// LAMP_ON_14;
// LAMP_ON_15;
// LAMP_ON_16;
}
}
//void Modbus_02_Solve();
//void Modbus_01_Solve();
//void Modbus_04_Solve();
//void Modbus_05_Solve();
//void Modbus_15_Solve();
//void Modbus_03_Solve();
//void Modbus_06_Solve();
//void Modbus_16_Solve();
复制代码
51hei.png
(4.36 KB, 下载次数: 41)
下载附件
2021-1-28 17:05 上传
所有资料51hei提供下载:
Modbus_Master_slave.7z
(311.43 KB, 下载次数: 74)
2021-1-28 17:05 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
Icefish2010
时间:
2021-1-29 08:45
最近正在研究modbus,赞!
作者:
GlenXu
时间:
2021-1-29 21:23
没能看到需要的知识点。不过还是需要谢谢分享!
作者:
useridqq
时间:
2021-2-3 23:56
大半夜的来支持
作者:
Hephaestus
时间:
2021-2-7 17:14
楼主你贴的这段代码跟MODBUS没有任何关系,节约黑币我就不下载了。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1