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

📄 serial1.c

📁 c8051f020实现4个 产UART 口
💻 C
📖 第 1 页 / 共 2 页
字号:
					UartPointer++;			//下一次发送中断准备向子串口2发送数据
					if(KEY_TX_Len){			//串口2发送缓存区是否有数据需要发送?
							AdrOut0_0;			//有数据需要发送,则选通子串口0的地址
							AdrOut1_1;
							_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
							_nop_(); _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
							KEY_TX_Len--;
							KEY_TX_is_over_B=0; 
							if(KEY_TX_Len==0)  {
								   KEY_TX_is_over_B=1; 
								    KEY_TX_is_over_Start_cnt_B=1;    // 帧间隔计时位
								   KEY_TX_is_over_Start_cnt=0;     // 帧间隔计时计数器
								
							}
							SBUF1=KEY_TX_Buff[KEY_TX_cnt++];//将串口2发送缓存中的一个字节
							break;						//由子串口2发送到下位机
					}
					else  
						goto T_NopInstruction;	//若子串口2没有数据发送则准备发送空指令
		  

	               }								//而只能够发送一条空指令用于时序配合

			default:{
				      UartPointer=0;			//下一次发送中断准备向串口0发送数据
 T_NopInstruction:
					AdrOut0_1;				//选通目串口准备发送空指令或者其他指令
					AdrOut1_1;
					if(bInstructFlag){		//判断是否需要发送其他指令?
						bInstructFlag=0;	//清除指令发送标志
						SBUF1=InstructBuf;	//将需要发送的指令发送到串口扩展IC
						break;
					}
					//else if(Uart0TNum|Uart1TNum|Uart2TNum){//判断所有子串口的数据是否
					else if(F76_TX_Len|KEY_TX_Len|DiZh_TX_Len){//判断所有子串口的数据是否
						SBUF1=0;				//都已经全部发送完毕?若没有完毕则发送空指令
						break;
					}
					else {bUartBusy=0;break;}//若所有子串口数据都已经发送完毕,则立即
			}	//清除"串口忙"标志(主程序将根据该标志来决定是否执行"TI=1"这条指令)
		}
	}
       
	
	SCON1&=0xfc;   //CKR  TI, RI

	
 }



/*****************************************************************
Function: OpenComm
Description: Sets the serial port up for debug use and resets
the ring buffer pointers to 0.
Parameters: None.
Returns: Nothing.
*****************************************************************/
//                0xfd=19200,0xfa=9600,0xf4=4800,0xe8=2400,0xd0=1200

void Open_URRA_1(void) 
{
//	SCON1=0xf0; 		/*设置串行口1工作于方式3,主从式*/
			        /*SM0_1  SM1_1 SM2_1 REN_1  TB8_1 RB8_1 TI_1 RI_1*/
			        /* 1       1     1     1      0     0     0    0 */
			        /*when SM2_1=1 receice addr    */       
	TMOD |= 0x20;   /* timer 1 mode 2: 8-Bit reload          */
	PCON|=0x10;//-->SMOD_1=1;       /*bps double*/                                  
	CKCON |= 0x10;		// Timer 1 derived from SYSCLK
   	TH1 = -(SYSCLK/BAUDRATE1/16);  //11.0592  ->4800-115200
	TR1 = 1;    			// Start Timer 1
	SCON1 = 0x50;			// Configure UART1 for mode 1, receiver enabled.
	SCON1|=0x10;//-->   REN1=1; 
	EIE2|=0x40; //-->	ES1=1; 			// allow the serial interrupt
	
}


/**********************************************************************
**函数原型:   void     FA_DiZhen_Buff()  
**入口参数:   
**出口参数:   无
**返 回 值:   无
**说    明: 对地震仪发数据子程序
*************************************************************************/
void     FA_DiZhen_Buff()  {

		 DiZh_TX_Len= DiZh_Tx_Buff[3]+6;		
		 DiZh_TX_cnt=0;	  	       
		 if(bUartBusy==0){	//判断发送中断是否处于激活状态,若没有激活则:
			 	SCON1|=2;  //TI=1;			//激活MCU的串口发送程序			
			 	bUartBusy=1;	//置发送程序已经激活的标志
		 }

}




//等待得到控制权
//等待得到控制权
//只有得到权限才能更新缓冲区数据
/*
void  Get_Fa_DiZh_buffer_Right( )
      {      xdata uchar ttt=0;

	        while(DiZh_TX_is_over_B==0)   {     //TX所完标志位,没发完再发时要等待	               
			 os_wait2(K_TMO, 50);   //100ms
			 if(ttt++>100)               //延时5秒  到也认为发送有空
			  	 break;
	        }		
		 DiZh_TX_is_over_B=0;   //抢到标志,处暑、延时100MS再发, 串间隔
		 os_wait2(K_TMO, 50);    //100ms
	      		  
      }

      */

//==============================w2812837@163.com=================================================




//等待得到控制权
//等待得到控制权
//只有得到权限才能更新缓冲区数据

/*
void  Get_Fa_Key_buffer_Right( )
      {      xdata uchar ttt=0;

	        while(KEY_TX_is_over_B==0)   {     //TX所完标志位,没发完再发时要等待	               
			 os_wait2(K_TMO, 50);   //100ms
			 if(ttt++>90)               //延时5秒  到也认为发送有空
			  	 break;
	        }		
		 KEY_TX_is_over_B=0;   //抢到标志,处暑、延时100MS再发, 串间隔
		 os_wait2(K_TMO, 50);    //100ms
	      		  
      }
*/
 /**********************************************************************
**函数原型:   void  Fa_Key_buffer(uint Lenthg)
**入口参数:   无
**出口参数:   无
**返 回 值:   无
**说    明:  将KEY_TX_Buff[]发送子程序。
            // 发送入口,TX_Len:所发送的字节数
            //           KEY_TX_Buff[]: 发送缓冲区
            //           TxIe=1;
            //           KEY_TX_cnt=0;       100MS 串间隔
************************************************************************/
void  Fa_Key_buffer(uint Lenthg)
      { 

	        // En_FA_485;   //  if use 485 ic
              

		 KEY_TX_cnt=0;	  
		 KEY_TX_Len=Lenthg;       //TX_LEN发送前置好数值
	       
		 if(bUartBusy==0){	//判断发送中断是否处于激活状态,若没有激活则:
		 	SCON1|=2;  //TI=1;			//激活MCU的串口发送程序			
		 	bUartBusy=1;	//置发送程序已经激活的标志
		 }

	   
      }
//==============================w2812837@163.com=================================================




 /**********************************************************************
**函数原型:   void  Fa_F76_buffer(uint Lenthg)
**入口参数:   无
**出口参数:   无
**返 回 值:   无
**说    明:  将F76_TX_Buff[]发送子程序。
            // 发送入口,TX_Len:所发送的字节数
            //           F76_TX_Buff[]: 发送缓冲区
            //           TxIe=1;
            //           F76_TX_cnt=0;       100MS 串间隔
************************************************************************/
void  Fa_F76_buffer_0xee0xee(uchar Fun,uchar *Poit,uint Lenthg) reentrant 
      { 
            uchar i,j;
	        
              //Get_Fa_F76_buffer_Right( );
		//Clr_F76_RX_Buff();
		F76_RX_cnt=0;
		Xin_F76_RX_B=0;
		//En_FA_485shou;     //  if use 485 ic


	         F76_TX_Buff[0]=0xEE;;
		  F76_TX_Buff[1]=0xEE;
	          F76_TX_Buff[2]=Fun ;
	          F76_TX_Buff[3]=Lenthg;
	         for(i=0;i<Lenthg;i++) {
	               F76_TX_Buff[4+i]=*Poit++;
	         }
	          F76_TX_Buff[4+i]=0;
	         j=0;
	         for(j=0;j<(Lenthg+2);j++)
	               F76_TX_Buff[4+i]+= F76_TX_Buff[j+2];
	          F76_TX_Buff[4+i+1]=0xab;

		 
		

		 F76_TX_cnt=0;	  
		 F76_TX_Len=Lenthg+6;       //TX_LEN发送前置好数值
	       
		 if(bUartBusy==0){	//判断发送中断是否处于激活状态,若没有激活则:
		 	SCON1|=2;  //TI=1;			//激活MCU的串口发送程序			
		 	bUartBusy=1;	//置发送程序已经激活的标志
		 }

	   
      }
//==============================w2812837@163.com=================================================




 /**********************************************************************
**函数原型:   void  Fa_F76_buffer(uint Lenthg)
**入口参数:   无
**出口参数:   无
**返 回 值:   无
**说    明:  将F76_TX_Buff[]发送子程序。
            // 发送入口,TX_Len:所发送的字节数
            //           F76_TX_Buff[]: 发送缓冲区
            //           TxIe=1;
            //           F76_TX_cnt=0;       100MS 串间隔
************************************************************************/
void  Fa_F76_buffer(uchar Fun,uchar *Poit,uint Lenthg) reentrant 
      { 
            uchar i,j;
	        
            //Get_Fa_F76_buffer_Right( );
		//Clr_F76_RX_Buff();
		F76_RX_cnt=0;
		Xin_F76_RX_B=0;
		//En_FA_485shou;     //  if use 485 ic

                i=0;
	         F76_TX_Buff[0]=0xEE;;
		  F76_TX_Buff[1]=0xEE;
	          F76_TX_Buff[2]=Fun ;
	          F76_TX_Buff[3]=Lenthg;
	         for(i=0;i<Lenthg;i++) {
	               F76_TX_Buff[4+i]=*Poit++;
	         }
	          F76_TX_Buff[4+i]=0;
	         j=0;
	         for(j=0;j<(Lenthg+2);j++)
	               F76_TX_Buff[4+i]+= F76_TX_Buff[j+2];
	          F76_TX_Buff[4+i+1]=0xab;

		 
		

		 F76_TX_cnt=0;	  
		 F76_TX_Len=Lenthg+6;       //TX_LEN发送前置好数值
	       
		 if(bUartBusy==0){	//判断发送中断是否处于激活状态,若没有激活则:
		 	SCON1|=2;  //TI=1;			//激活MCU的串口发送程序			
		 	bUartBusy=1;	//置发送程序已经激活的标志
		 }

	   
      }
//==============================w2812837@163.com=================================================


//清接收区为0 
void Clr_DiZh_Rx_Buff()  {
      uint i;

	  for (i=0;i<DiZh_BUFF_MAX;i++)
	  	    DiZh_Rx_Buff[i]=0;

}


//清接收区为0 
void Clr_KEY_RX_Buff()  {
      uint i;

	  for (i=0;i<KEY_BUFF_MAX;i++)
	  	    KEY_RX_Buff[i]=0;

}


//清接收区为0 
void Clr_F76_RX_Buff()  {
      uint i;

	  for (i=0;i<F76_BUFF_MAX;i++)
	  	    F76_RX_Buff[i]=0;

}

⌨️ 快捷键说明

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