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

📄 main.c

📁 Microchip 公司16F648 芯片实现RS485通讯,符合Modbus通讯协议,可用PICC环境编译.文件完整,可供参考.
💻 C
字号:
#include  "pic16f62xa.h"
#include  "pic.h"
#include  "typedefine.h"
#include  "extern.h"

extern  void  time0init(void);
char ParityBit(const char *p_data )	;
//uchar testAddr=0xd3;
bank1 uchar RX9DBuf;
 
void test(void)
{
// RecFrameCheck(receBuf,receCount)
	LedSLink = 10;
}


//eeprom 写入 
//数组首地址指针,写入数组长,写入的地址.
void WriteEEPROM(uchar *p_eedata,uchar length,uchar addr)
{
	uchar var_ii;
	GIE = 0;
	for(var_ii=0;var_ii<length;var_ii++)
	{
		EEDATA = *p_eedata++;
		EEADR = addr++;
	#asm
 		NOP
		BSF 	_STATUS,5			//RP0
		BSF     _EECON1,2			//WREN
 		BCF		_INTCON,7			//GIE
		BTFSC	_INTCON,7	
		GOTO    $-2					
		MOVLW	  0X55				
		MOVWF   _EECON2				
		MOVLW     0XAA				
		MOVWF   _EECON2				
		BSF		_EECON1,1			//WR
	#endasm
		while(WR!=0)
		{
			NOP();
		}	
	}
	GIE = 1;
}


void interrupt isr(void) @ 0x04						
{													
  uchar tmp;
	if(T0IE & T0IF)
    {
    	T0IF = 0;      			 // 清Flag
		TMR0  =  0x84;		     //  1ms every time.
        timeBase.bits.bt1ms = 1;		 
 	}
/*
	if(TXIE & TXIF)
	{
		if(UartSlaveStruct.bits.SendEnd)
		{	
			UartSlaveDelayStruct.SendLastStatus.bits.LastByteCountTag = 1;
			UartSlaveStruct.bits.SendEnd = 0;

				goto Tloop;   
		}
		TXREG = GetDataBus[sendPosi++];  

		if(SendFrameLength == sendPosi)   // TxCnt考虑
		{
			sendPosi = 0;
			UartSlaveStruct.bits.SendEnd = 1;
		}
		NOP();
	}
*/
	if(TXIE&TXIF) 
	{	
#ifdef  TEST_TX
	 		RA1 = !RA1;
#endif	
#ifdef TEST_RB4
		  RB4 = !RB4;
#endif
		if(sendPosi<sendCount)  
		{	
			sendPosi++;   
		//	TX9D = ParityBit(sendBuf[sendPosi]);  
			TXREG = sendBuf[sendPosi];  
		}	 
		else	
		{	
		//	receEnable();	 		//485芯片
	 		if(TRMT){
			receCount = 0;	
			checkoutError = 0;	
//-----------------------
			TXIE = 0;            //在一组数据发送完成后关闭
			//TXEN = 0;           
			sendCount = 0;          
//--------------------------
						}
		}	
	} 	
		
//	if(RCIE&RCIF) 
//	{ 
//		if( UartSlaveStruct.bits.SlaveStatus==0 ) 
//		{ 
//			UartSlaveStruct.bits.SlaveStatus = 1;
//			UartSlaveDelayStruct.ReceiveCountStatus.bits.ReceiveCountTag = 1;
//		} 
//		UartSlaveDelayStruct.RecevieCou = 0;
//		if(FERR | OERR) 
//		{ 
//			FERR = 0;
//			OERR = 0;
//			UartSlaveStruct.bits.GetByteErr = 1;
//		}	
//		RCBuf = RCREG ;               // 取数据.
//		if(UartSlaveStruct.bits.GetByteErr)
//		{ 
//			UartSlaveStruct.bits.GetByteErr = 0;
//		} 
//		else
//		{ 
//			receBuf[GetCnt++] = RCBuf;
//		} 
//	} 
	
	if(RCIE&RCIF) 
	{ 

#ifdef TEST_RB4
		  RB4 = !RB4;
#endif

		receTimeOut = 10;    //通讯超时值
		if(FERR==1)	
		{	
#ifdef   TEST_RX
			RA1 = !RA1;
#endif
//                receCount = 0;
			CREN = 0;
			FERR = 0;
			CREN = 1; 
			tmp = RCREG;
//-------------------------------------------
		}	
		else if(OERR==1)	
		{ 
#ifdef	TEST_RX
			RA1 = !RA1;
#endif
	//			receCount = 0;
//--------------test error code--------------
//				EEDATA = 0xa5;
//-------------------------------------------
			CREN = 0;	 
			OERR = 0;
			CREN = 1;	
 			tmp = RCREG;
		}	
		else
		{ 
//			receTimeOut = 10;//FrameOverCou;    // 通讯超时值 4ms	
			RX9DBuf = RX9D; 	
			receBuf[receCount] = RCREG; 
			if(RX9DBuf != ParityBit(&receBuf[receCount]) )
						checkoutError = 1; 
			receCount++;				   // 接收地址偏移寄存器加1. 
			receCount &= 0x0f; 
		} 
 	} //if(RCIE&RCIF); 
	NOP(); 
 	return; 
} // void interrupt isr(void) @ 0x04




//---------------- 
void main(void)
{
	 NOP();
	 NOP();
	 NOP();
 		
	 NOP();
	 NOP();
	 NOP();
     test();
     sysinit();
     GIE = 1;
	while(1)
	{
		NOP();
	    time_mission();
		ReceiveFrameDisFun();
		NOP();
	    LedDrive();
         
	}
}

void IOinit(void)
{
	CM0=1;
	CM1=1;
	CM2=1;

	TRISA &= ~0b00000010;
	TRISA |= 0b00000111;
	RA1 = 0;
	TRISB4 = 0;
	RB4 = 1;
}

void sysinit(void)
{
    NOP();
 	
	IOinit();
	time0init();
	Uart_init();
    NOP();
}


 
//调用 ParityBit(),返回添加奇偶校验位.(64us once)
char ParityBit(const char *p_data )	
{
	char tempchar=0, tempcount ,temp_a=0,result=0;
	tempchar = *p_data;

	for(tempcount = 8; tempcount > 0; tempcount--) 
	{ 
		temp_a = tempchar & 0x01;
		if(1 == temp_a)
		{ 
			result += 1;  
		} 
		tempchar >>= 1;
	} 
	return(result&0x01);
}//char ParityBit(const char *p_data )	
 

 

⌨️ 快捷键说明

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