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

📄 main.c

📁 PIC16F917开发的modbus-RTU协议
💻 C
字号:
#include "main.h"

/******************************
modbus RTU 程序 
单片机pic16f917
通信波特率 9600 8位数据 1位停止位 485通信接口
单片机控制板地址 localAddr(变量)
通信可设置数据的地址:
字地址 0 - 255 (只取16位的低8位)
位地址 0 - 255 (只取16位的低8位)
*******************************/

uint8	 sendBuf[16],receBuf[16]; 	//发送接收缓冲区  
uint8	 receTimeOut;				//接收超时
bank2  uint16  bt1ms,g_wLstTick;			//定时计数
bank2 uint8  g_bRcvedOK, byTemp;
// 串行中断程序
void interrupt commIntProc(void)
{
	if(TXIF)
	{
		TXIF= 0; 
		if(sendPosi <=sendCount) 
		{
			TXREG = sendBuf[sendPosi];
			sendPosi++;
		}
		else
		{
		//	receCount = 0;   //清接收地址偏移寄存器
			sendPosi =0;
			b485Send = 0;    //发送完后将485置于接收状态
			TXIE =0;		//关闭发送中断
			TXEN = 0;
			RCIE =1;
		}
	}
	if(RCIF)
	{
		RCIF= 0;
		if(receCount < 16)
		{//最多一次只能接收16个字节
			receBuf[receCount] = RCREG;
			g_wLstTick = bt1ms;
			receCount++;          		//接收地址偏移寄存器加1
		}
		else
		{
			byTemp = RCREG;
		}
	}
	//定时器2处理
	if(TMR2IE && TMR2IF)
	{
	   	TMR2IE = 0;
		TMR2IF = 0;
	   	bt1ms++;
		if(bt1ms-g_wLstTick > 100 && receCount>0)
		{
			//这一帧结束
			g_bRcvedOK = 1;
		}
		TMR2IE = 1;
	} 
}

/*
//定时处理
void timeProc(void)
{
	TMR2IE = 0;
	if(bt1ms==10)
	{
		bt1ms = 0;

        if(receTimeOut>0)
        {
            receTimeOut--;
            if(receTimeOut==0 && receCount>0 )  //判断通讯接收是否超时
            {
                b485Send = 0;       			//将485置为接收状态
                receCount = 0;      			//将接收地址偏移寄存器清零
			}
        }
	}
	TMR2IE = 1;
} 
*/
//初始化串口
void initUart(void)
{
	//初始化UART
	SPBRG = 51;//12M--18,11.0592--17
	TXSTA = 0x04;
	RCSTA = 0x90;
	RCIF = 0;
	TXIF = 0;
	RCIE = 1;
	PEIE =1;
	b485Send = 0;
	TRISC4 = 0;
}

//初始化中断
void initInt(void)
{
//=====================================================
//T2定时1ms
	PR2 = 128;
	T2CON |= 0x07;//四分频
	PIE1 |= 0x02;//enable timer2
	PIR1 &= 0xfd;//clear timer2 interrupt flag
//=====================================================	
	initUart();
	GIE = 1;	
} 
void SetPort(void)
{
	//关闭LCD
	LCDCON = 0x40;
	LCDPS = 0;
	LCDSE0 = 0;
	LCDSE1 = 0;
	LCDSE2 = 0;
	LCDA = 0;
	PORTC = 0x00;
	TRISC = 0x80;
}
//初始化
void initProg(void)
{	
	initInt();
	b485Send = 0;
}

void main(void)
{
int iLp;
	receCount =0;


	INTCON=0;	// purpose of disabling the interrupts.
	SetPort();
	initProg();

	while(1)
	{
//		timeProc();
//	for(iLp=0; iLp<10000; iLp++);
		checkComm0Modbus();
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -