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

📄 485.c

📁 飞利浦2114处理器
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
* 文件名:RcvData.C                                                                ---串口1接RS485
* 功能:向串口0 串口1发送数据,并接受1个字节的数据。
* 说明:使用外部11.0592MHz晶振,根据CONFIG.H文件配置,Fpclk=11.0592MHz;
*      通讯波特率9600,8位数据位,1位停止位,无奇偶校验。
* P1.24 方向控制--485DIR COM1
* P0.10 方向控制--485DIR COM0
****************************************************************************/
#include  "config.h"
#define  UART_BPS	9600			/* 定义通讯波特率 */ 
#define  DIRECT0     (1<<23)		//P1.23
#define  DIRECT1     (1<<10)	    //P0.10

volatile uint8 rcv_new;            // 接收新数据标志
uint8 rcv_buf[1];                  // UART1数据接收缓冲区
extern volatile uint8 cRcvEnter;          // 接收回车标志
extern volatile uint8 cRcvSpace;          // 接收空格标志
volatile uint8 cRcvKeyNum;         // 接收数据标志
volatile uint8 cRcvKeyNum1;        // 接收空格标志
uint16 rcv_byte_num;
uint8 const  SEND_STRING[] = "System Init OK!\n";


volatile uint8 cRcv_Stat1=0;
volatile uint8 cRcv_Stat0=0;

extern volatile uint8 cData485_Valid1;
extern volatile uint8 cData485_Valid0;

uint16 iRcv_Nmb1,iRcv_Nmb_Max;
uint16 iRcv_Nmb0,iRcv_Nmb_Max0;
extern uint8 work_mode;


union zhongjian2
	{
  		uint16 i;
  		uint8 ii[2];
	}exchange_data2;
	
extern uint8  cTData[2];  //温度数据,2个字节 
extern uint8  cHData;  //湿度数据,1个字节	
/****************************************************************************
* 名称:fnDelayNS()
* 功能:长软件延时
* 入口参数:dly		延时参数,值越大,延时越久
* 出口参数:无
****************************************************************************/
void  fnDelay(uint32  dly)
{  uint32  i;

   for(; dly>0; dly--) 
      for(i=0; i<5000; i++);
}
/****************************************************************************
* 名称:InitAllPort()
* 功能:初始化所有P0 P1端口,设置功能为第一功能或第二功能
* 入口参数:无	
* 出口参数:无
****************************************************************************/  
void InitAllPort(void)
{
	PINSEL0 = 0x00050005;		           // 设置I/O P0.0-P0.15  UART0  P0.0 TXD  P0.1 RXD UART1  P0.8 TXD  P0.9 RXD
	PINSEL1 = 0x00000000;				   // 设置I/O P0.16-P0.31 A0-A3
}
/****************************************************************************
* 名称:IRQ_UART0()
* 功能:串口UART0接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
volatile uint8  cRcv_Data0[500];
void   __irq IRQ_UART0(void)
{   
	uint16 i;   
	uint8 static new_data,last_data,last_last_data;
     
   if(work_mode==0)//增加"硬件测试程序"--开始
   {
	   if( 0x04==(U0IIR&0x0F) ) 
	   rcv_new = 1;// 设置接收到新的数据标志
	   for(i=0; i<1; i++)
	   { rcv_buf[i] = U0RBR;              	// 读取FIFO的数据,并清除中断标志
	   }
	   cRcvKeyNum=0;
	   cRcvEnter=0;
	   switch(U0RBR)
	   {
	   	  case 0x0d:
	   	  cRcvEnter=1;
	   	  break;
	   	  case 0x20://空格 返回主菜单
	   	  cRcvKeyNum=20;
	   	  break;   	  
	   	  case 0x31:
	   	  cRcvKeyNum=1;
	   	  break;
	   	  case 0x32:
	   	  cRcvKeyNum=2;
	   	  break;
	   	  case 0x33:
	   	  cRcvKeyNum=3;
	   	  break;
	   	  case 0x34:
	   	  cRcvKeyNum=4;
	   	  break;
	   	  case 0x35:
	   	  cRcvKeyNum=5;
	   	  break;
	   	  case 0x36:
	   	  cRcvKeyNum=6;
	   	  break;  
	   	  case 0x37:
	   	  cRcvKeyNum=7;
	   	  break; 
	   	  case 0x38:
	   	  cRcvKeyNum=8;
	   	  break;   
	   	  case 0x39:
	   	  cRcvKeyNum=9;
	   	  break; 
	   	  case 0x1B://ESC键
	   	  cRcvKeyNum=10;
	   	  cRcvKeyNum1=10;
	   	  break;     	      	  
	   	  default:
	   	  break; 	     	   	     	     	     	     	  
	   }
   
   }
   else 
   {
   
	    //VICIntEnClr=VICIntEnClr|(1<<7);
	    switch(cRcv_Stat0)
	    {
	      case 0:
	      	if( 0x04==(U0IIR&0x0F) );
	        new_data=U0RBR; 
	        if(last_last_data==0x00 && last_data==0x02 && new_data==0xa6)
	          {
	          
	            cRcv_Data0[5]=new_data;            
	            cRcv_Data0[4]=last_data;
	            cRcv_Data0[3]=last_last_data;
	            cRcv_Data0[2]=0x00;
	            cRcv_Data0[1]=0x00;
	            cRcv_Data0[0]=0x00;
	             
	            iRcv_Nmb0=6;
	            cRcv_Stat0=1;       //是帧头
	            //UART0_SendStr((uint8 *)"接收帧头正确!");          
	            //g_iTimer1=0;		//启动接收定时器
	          } 
	          else              //
	          {
				last_last_data=last_data;          
	          	last_data=new_data;
	            cRcv_Stat0=0;
	          } 

	         
	        break;
	        
	     case 1:
	      	if( 0x04==(U0IIR&0x0F) );
	        cRcv_Data0[iRcv_Nmb0]=U0RBR;   //帧数据
	        if(iRcv_Nmb0==6)
	        	exchange_data2.ii[1]=cRcv_Data0[iRcv_Nmb0];
	        if(iRcv_Nmb0==7)
	        	exchange_data2.ii[0]=cRcv_Data0[iRcv_Nmb0];//计算有效数据长度,以此作为帧判断的第一步
	        //UART0_SendStr((uint8 *)"接收帧头正确!");
	        if(iRcv_Nmb0==exchange_data2.i+11) //判长度---1
	        {
	          	iRcv_Nmb_Max0=iRcv_Nmb0;        //接收完一帧
	          	cRcv_Stat0=0;                   //准备下一帧的接收
	          	iRcv_Nmb0=0;  
	 
				if((cRcv_Data0[iRcv_Nmb_Max0]==0x0a)&&(cRcv_Data0[iRcv_Nmb_Max0-1]==0x0d))//判结束字---2
				{

	                for(i=0;i<=iRcv_Nmb_Max0;i++)   //接收数据回送,以便调试
	          		{
						//URRcvData.cData[i]=cRcv_Data1[i];		//将接收到得数据赋值给接收缓冲区结构体 URRcvData.cData[i] 便于解析
						//UART0_SendByte(cRcv_Data1[i]);
					}	
	                cData485_Valid0=0x55;        //建立已接收485标志
	    
			
				}
				else
				{
					cRcv_Stat0=0;
				}
				
	          	
	    
	        }
	        else 
	        {
	          if(iRcv_Nmb0>500)
	          {
	            cRcv_Stat0=0;
	    
			  }  
	          iRcv_Nmb0++;   //帧数据
	        }
	        break;
	        
	    default:
	        cRcv_Stat0=0;
	        break;
	                                
	    }   
	   //VICVectAddr = 0x00;              	// 中断处理结束
	   //VICIntEnable = VICIntEnable|(1<<7); 
   
   }
   //增加"硬件测试程序"--结束
   
   VICVectAddr = 0x00;              	// 中断处理结束
}  
/****************************************************************************
* 名称:UART0_Ini()
* 功能:初始化串口0。设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  UART0_Ini(void)
{  uint16 Fdiv;

   U0LCR = 0x83;		            // DLAB = 1,可设置波特率
   Fdiv = (Fpclk / 16) / UART_BPS;  // 设置波特率
   U0DLM = Fdiv / 256;							
   U0DLL = Fdiv % 256;						
   U0LCR = 0x03;
   
   U0FCR = 0x01;                        // 使能FIFO,并设置触发点为1字节 0000 0001   
   U0IER = 0x01;                        // 允许RBR中断,即接收中断
   /* 设置中断允许 */
   VICIntSelect = 0x00000000;           // 设置所有通道为IRQ中断
   VICVectCntl6 = VICVectCntl6|0x26;                 // UART1中断通道分配到IRQ slot 0,即优先级最高 0010 0111
   VICVectAddr6 = (int)IRQ_UART0;       // 设置UART1向量地址
   VICIntEnable = VICIntEnable|0x00000040;           // 使能UART1中断 1000 0000  参考P63页中断源表
 
}
/****************************************************************************
* 名称:UART0_SendByte()
* 功能:向串口发送字节数据,并等待发送完毕。
* 入口参数:data		要发送的数据
* 出口参数:无
****************************************************************************/
void  UART0_SendByte(uint8 data)
{  U0THR = data;				    // 发送数据
   IO1SET = DIRECT0;				// P1.23 = 1
   while( (U0LSR&0x40)==0 );	    // 等待数据发送完毕
   IO1CLR = DIRECT0;				// P1.23 = 0
}

/****************************************************************************
* 名称:UART0_SendStr()
* 功能:向串口发送一字符串
* 入口参数:srt		要发送的字符串的指针
* 出口参数:无
****************************************************************************/
void  UART0_SendStr(uint8 const *str)
{  while(1)
   {  if( *str == '\0' ) break;
      UART0_SendByte(*str++);	    // 发送数据
   }
}
/****************************************************************************
* 名称:ISendBuf()
* 功能:将缓冲区的数据发送回主机(使用FIFO),并等待发送完毕。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void  ISendBuf0(void)
{  
   uint8  i;
   for(i=0; i<1; i++) UART0_SendByte(rcv_buf[i]);
   while( (U0LSR&0x20)==0 );       // 等待数据发送
   rcv_byte_num=0;
}  
  
/****************************串口1-start*************************************/
/****************************串口1-start*************************************/
/****************************************************************************
* 名称:IRQ_UART1()
* 功能:串口UART1接收中断。
* 入口参数:无
* 出口参数:无
****************************************************************************/
void   __irq IRQ_UART1(void)
{  
     
    uint16 i;   
	uint8 static new_data,last_data,last_last_data;
  	uint8 static cRcv_Data1[500];

    
    switch(cRcv_Stat1)
    {
      case 0:
      	if( 0x04==(U1IIR&0x0F) );
        new_data=U1RBR; 
        if(last_last_data==0x00 && last_data==0x02 && new_data==0xa6)
          {
          
            cRcv_Data1[5]=new_data;            
            cRcv_Data1[4]=last_data;
            cRcv_Data1[3]=last_last_data;
            cRcv_Data1[2]=0x00;
            cRcv_Data1[1]=0x00;

⌨️ 快捷键说明

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