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

📄 uart2_rs485.c

📁 USART构成RS485程序
💻 C
字号:
/*****************************************************************************/
/*+++++++++++++++++++++++++++++ DsPIC30F6010A +++++++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++ UART2---》rs485 ++++++++++++++++++++++++++++++*/
/*++++++++++++++++++++++++++++++++ 源文件 +++++++++++++++++++++++++++++++++++*/
/*****************************************************************************/
#include <p30f6010A.h>
#include "UART2_RS485.h"
/*****************************************************************************/

/*RS485输入输出切换控制引脚*/
#define RD	LATDbits.LATD1            //1;input; 

/*485通讯变量定义*/
unsigned char functionF,RXnum; 	//功能标志字,接收存储位置
unsigned int receive[8];        //接收缓冲数组 
unsigned int monitor_data[10];  //监视发送数组
unsigned int set_data[3];		//设置发送数组

/* inverter */
void INIT_UART2_485(void)
{
	TRISDbits.TRISD1=0;
/**	5MHZ 2400
    U2BRG=129;            // 波特率需要设定2400
    U2STA=0x0000;
    U2MODE=0x8000;        // 使能UART
    U2STAbits.UTXEN=1;    // 使能发送
    IEC1bits.U2RXIE=1;	  // 接收使用中断
    IPC6bits.U2RXIP=6;  
    IFS1bits.U2RXIF=0;  
**/

/**	10MHZ 9600**/
    U2BRG=64;            // 波特率需要设定9600
    U2STA=0x0000;
    U2MODE=0x8000;        // 使能UART
    U2STAbits.UTXEN=1;    // 使能发送
    IEC1bits.U2RXIE=1;	  // 接收使用中断
    IPC6bits.U2RXIP=6;  
    IFS1bits.U2RXIF=0;  

	RD=1;			//input	

//    ClrWdt(); 
/*
	unsigned char i=0;
    for(;i<12;i++)
	{monitor_data[i]=i;}
*/
	monitor_data[0]=0;
	monitor_data[1]=1;
	monitor_data[2]=2;
	monitor_data[3]=3;
	monitor_data[4]=4;
	monitor_data[5]=5;
	monitor_data[6]=6;
	monitor_data[7]=7;
	monitor_data[8]=8;
	monitor_data[9]=9;
	set_data[0]=0x0010;
	set_data[1]=0x0020;
	set_data[2]=0x0030;

}
/*发送一个字节*/
void UART2_Send485(unsigned int t) 
{

   U2MODEbits.UARTEN=1;         
   U2STAbits.UTXEN=1;             //使能发送器

//开始发送一个字节(8位)  
   U2TXREG=t&0x00ff;              //发送低字节
   do{
       ;
     }while(U2STAbits.TRMT==0);      
   U2STAbits.TRMT=0;
//一个字节传送完毕

//   ClrWdt(); 

}
/*实时数据*/ 
void SendMonitor485(void)
{
	RD=0;//

	unsigned int send_temp=0;

//	UART2_Send485(0x00E0);				//功能代码
//	UART2_Send485(0x00E0);				//功能代码

	UART2_Send485(0x00aa);				//验证性报头
	UART2_Send485(0x0055);				//
	UART2_Send485(0x00aa);				//
	UART2_Send485(0x0055);				//
	UART2_Send485(0x00aa);				//
	UART2_Send485(0x0055);				//验证性报头

	UART2_Send485(0x00E0);				//功能代码
	UART2_Send485(0x00E0);				//功能代码
	UART2_Send485(MyAddress);			//地址站号

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//	
//	send_temp=0x0401;
//	UART2_Send485(send_temp);
//	send_temp=0x0401;
//	send_temp=send_temp>>8;
//	UART2_Send485(send_temp);			//data1
//
//	send_temp=0x0302;
//	UART2_Send485(send_temp);
//	send_temp=0x0302;
//	send_temp=send_temp>>8;
//	UART2_Send485(send_temp);			//data2
//	
//	send_temp=0x0203;
//	UART2_Send485(send_temp);		
//	send_temp=0x0203;
//	send_temp=send_temp>>8;
//	UART2_Send485(send_temp);			//data3
//
//	send_temp=0x0104;
//	UART2_Send485(send_temp);
//	send_temp=0x0104;
//	send_temp=send_temp>>8;
//	UART2_Send485(send_temp);			//data4

	unsigned char num;
	for(num=0;num<10;num++)					//发送监视数组中的所有数据
	{
		send_temp=monitor_data[num];
		UART2_Send485(send_temp);
		send_temp=monitor_data[num];
		send_temp=send_temp>>8;
		UART2_Send485(send_temp);
	}

//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++//	
	
	UART2_Send485(0x000d);				//结束码

/*
	UART2_Send485(0x00e0);
	UART2_Send485(0x00e0);
*/

	receive[0]=0;					//清除接收存储区
	receive[1]=0;
	receive[2]=0;
	receive[3]=0;
	receive[4]=0;
	receive[5]=0;
	RD=1;
}
/*设置值*/
void SendSet485(void)
{
	UART2_Send485(0xEA);
	UART2_Send485(MyAddress);
	UART2_Send485(receive[2]);

	UART2_Send485(set_data[1]);		//set_data数组
    UART2_Send485(set_data[2]);

	UART2_Send485(0x0d);

	receive[0]=0;
	receive[1]=0;
	receive[2]=0;
	receive[3]=0;
	receive[4]=0;
	receive[5]=0;

}
/*通讯功能*/
void communicate485(void)
{


	RD=1;

	if(receive[1]!=MyAddress)return;	//地址
	else
	{
	RD=0;
	asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
	asm("nop");asm("nop");asm("nop");asm("nop");asm("nop");
//中断使能屏蔽
	    IEC1bits.U2RXIE=0;	  // 接收使用中断
//
		functionF=receive[0];
		if((functionF==0xe0)){RD=0;SendMonitor485();}//&&(receive[2]==0x0d)
//		else if((functionF==0xea)&&(receive[5]==0x0d)){RD=0;SendSet485();}
		else {asm("nop");}	//RD=0:output;UART2_Send485(255);
	}
    IEC1bits.U2RXIE=1;	  // 接收使用中断
//中断使能恢复
	RD=1;					//receive
//    ClrWdt(); 


/***********************************************************************
//响应
	RD=0;
	unsigned char check_num=0;
	for(;check_num<8;check_num++)
	{
		if(receive[(check_num+8-2)%8]==0x00e0)
			{
			  if(receive[(check_num+8-1)%8]==MyAddress)
				 if(receive[check_num]==0x000d)
					functionF=0x00e0;
			}
		else functionF=0;
	}
	if(functionF==0x00e0){RD=0;SendMonitor485();}
	RD=1;	
************************************************************************/

}
/*接收功能在中断程序中完成*/
void __attribute__((__interrupt__,auto_psv)) _U2RXInterrupt(void)
{
    IFS1bits.U2RXIF=0; 
/**********************************************************************/
	receive[RXnum]=U2RXREG&0x00ff;

/*	switch(receive[0])
	  {
		case 0x00e0:
			if(RXnum<2)RXnum++;	// e0 01(YY) 0d
			else RXnum=0;
			break;
		case 0xe5:
			if(RXnum>2)RXnum=0;
			else RXnum++;
			break;	
		case 0x00ea:				// ea 01(YY) XX xx xx 0d
			if(RXnum<5)RXnum++;
			else RXnum=0;
			break;
		default:
			receive[0]=0; receive[1]=0; receive[2]=0;
			receive[3]=0; receive[4]=0; receive[5]=0;
			RXnum=0; 
	  }
	if(RXnum>5)RXnum=0;
*/
	if( receive[0]==0x00e0)
		{
			if(RXnum<2)RXnum++;	// e0 01(YY) 0d
			else RXnum=0;
		}
	else
		{
 			receive[0]=0; receive[1]=0; receive[2]=0;
			receive[3]=0; receive[4]=0; receive[5]=0;
			RXnum=0; 
		}	

/***********************************************************************/
/***********************************************************************
//只做接收
	receive[RXnum]=U2RXREG & 0x00ff;
	if(RXnum<8)RXnum++;
	else RXnum=0;
************************************************************************/
    U2STAbits.FERR=0;
    U2STAbits.OERR=0;
    IFS1bits.U2RXIF=0;          			// 清接收中断标志
}








⌨️ 快捷键说明

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