標(biāo)題:
STM32 MOUBUS RTU主從站程序
[打印本頁(yè)]
作者:
WANGRUIQI
時(shí)間:
2021-1-28 16:35
標(biāo)題:
STM32 MOUBUS RTU主從站程序
本次發(fā)布經(jīng)過(guò)驗(yàn)證的MODBUS RTU 主從程序 可以移植于其他的基于C語(yǔ)言的平臺(tái) 本程序基于KEIL 已經(jīng)用于部分項(xiàng)目上
單片機(jī)源程序如下:
#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);//關(guān)聯(lián)GPIO端口
void TIM2_NVIC_Configuration(void); //中斷參數(shù)配置//100MS
void TIM2_Init(void); //時(shí)間2中斷配置
void TIM3_NVIC_Configuration(void); //中斷參數(shù)配置
void TIM3_Init(void); //時(shí)間3中斷配置//5MS
void TIM3_IRQHandler(void); //定時(shí)中斷3啟用
void RTU_05 (void); //主站主動(dòng)發(fā)送函數(shù)
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);
//定時(shí)中斷
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進(jìn)入一次
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(); //定時(shí)器初始化
TIM3_Init(); //定時(shí)器初始化
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();
復(fù)制代碼
51hei.png
(4.36 KB, 下載次數(shù): 41)
下載附件
2021-1-28 17:05 上傳
所有資料51hei提供下載:
Modbus_Master_slave.7z
(311.43 KB, 下載次數(shù): 74)
2021-1-28 17:05 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
作者:
Icefish2010
時(shí)間:
2021-1-29 08:45
最近正在研究modbus,贊!
作者:
GlenXu
時(shí)間:
2021-1-29 21:23
沒能看到需要的知識(shí)點(diǎn)。不過(guò)還是需要謝謝分享!
作者:
useridqq
時(shí)間:
2021-2-3 23:56
大半夜的來(lái)支持
作者:
Hephaestus
時(shí)間:
2021-2-7 17:14
樓主你貼的這段代碼跟MODBUS沒有任何關(guān)系,節(jié)約黑幣我就不下載了。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1