📄 modbusfunc.c
字号:
#include "STC89C58.h"
#include "TG01R.h"
#include "Modbus.h"
#include "ErrCheck.c"
#include "HexAsc.c"
#include "Serial.c"
#include <stdio.h>
void Delay_50us(uint _time); //延时函数,非中断方式,延时时间基准50us
void TimeOut_Start(uint _time50us); //开始时间溢出,中断方式,时间基准50us
void TimeOut_ReStart(uint _time); //
void TimeOut_Stop(void); //停止时间溢出定时
bit T0IR;
uchar ModeFlag;
/*------------------------------------------------------------------------------------------*
* 定义Modbus的模式关键字 *
*------------------------------------------------------------------------------------------*/
#define ASCII 0 /*ASCII 模式关键字 */
#define RTU 1 /*RTU 模式关键字 */
/*-------------------------------------------------------------------------------------------*
* 定义波特率关键字@ 24M (24.01065M) *
*-------------------------------------------------------------------------------------------*/
#define ByteRate_4800k 0x00 //波特率4800kbps
#define ByteRate_9600k 0x01 //波特率9600kbps
uchar code BTR_CODETAB[]={
0xf3, //;4800KBPS的预设值
0xf5 //;9600KBPS的预设值
};
/*-------------------------------------------------------------------------------------------
*函数原型: void ModbusInit(uchar Modbus_mode,uchar ByteRate) *
*参数说明: Modbus_mode:modbus的运行模式,可选模式为ASCII_MODE或RTU_MODE; *
* ByteRate:串口的波特率,可选的参数为ByteRate_4800k或ByteRate_9600k; *
*返回值: 无 *
*说明: 用于初始化串口 *
-------------------------------------------------------------------------------------------*/
void ModbusInit(uchar Modbus_mode,uchar ByteRate) {
ModeFlag=Modbus_mode;
if(ModeFlag==ASCII) { //ASCII_MODE
SCON = 0x52; //串口工作方式1,REN=1(Receive Enable),无TB8、RB8
}
else if(ModeFlag==RTU) { //RTU_MODE
SCON = 0xD2; //串口工作方式3,REN=1(Receive Enable),有TB8、RB8
}
TMOD|= 0x20; //T1,初值自动重装
TH1 = BTR_CODETAB[ByteRate];
TL1 = BTR_CODETAB[ByteRate];
TR1 = 1; //开始计数
IE |= 0x80;
// IE |= 0x90; //开放串口中断
/********************************************************************************************
if(Modbus_mode==ASCII_MODE) {
SCON = 0x50; //串口工作方式1,REN=1(Receive Enable),无TB8、RB8
TMOD|= 0x20; //T1,初值自动重装
TH1 = BTR_CODETAB[ByteRate];
TL1 = BTR_CODETAB[ByteRate];
TR1 = 1; //开始计数
IE |= 0x90; //开放串口中断
}
else {
SCON = 0x50; //串口工作方式1,REN=1(Receive Enable),无TB8、RB8
TMOD|= 0x20; //T1,初值自动重装
TH1 = BTR_CODETAB[ByteRate];
TL1 = BTR_CODETAB[ByteRate];
TR1 = 1; //开始计数
IE |= 0x90; //开放串口中断
}
*********************************************************************************************/
}
ModbusFrame QueryFrame, //查询消息暂存器
RespFrame; //回应消息暂存器
Frame_Style_A Rd_Coil_St;
uchar Rcv_Str_intime(uchar *RcvDataBuf) {
uchar counter,oyetempData;
counter=0;
while(RI==0);
RI=0;
oyetempData=SBUF;
*(RcvDataBuf+counter)=SBUF;
counter++;
TimeOut_Start(10);
while(1) {
while((RI==0)&&(T0IR==0));
if(T0IR==1) {
return(counter);
}
if(RI==1) {
RI=0;
*(RcvDataBuf+counter)=SBUF;
counter++;
TimeOut_ReStart(2);
}
}
}
/*
main() {
uchar tempData,i;
uchar xdata DataBuf[0x10];
ModbusInit(RTU,ByteRate_4800k);
printf("Start=%c",tempData);
for(i=0;i<16;i++) {
DataBuf[i]=0x03;
}
i=Rcv_Str_intime(DataBuf);
// Uart_Send_Str(DataBuf);
Uart_Send_Char(i);
while(1);
}
*/
uchar idata trdata[10]={'M','C','S','-','5','1',0x0d,0x0a,0x00};
main() {
uchar i;
TMOD=0x20;
TL1=0xf3;TH1=0xf3;
SCON=0xd3;PCON=0x00;
TR1=1;
while(1) {
i=0;
while(trdata[i]!=0x00) {
// while(SBUF!=trdata[i]) {
SBUF=trdata[i];
// };
while(TI==0);
TI=0;
i++;
}
Delay_50us(10000);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -