⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modbusfunc.c

📁 用于C51上的modbus协议
💻 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 + -