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

📄 serial.c

📁 c8051f020实现4个 产UART 口
💻 C
字号:
#include "all.h"

//串口0 中断服务程序,仅需做简单调用即可完成串口输入输出的处理
//出入均设有缓冲区,大小可任意设置。
//*************************************************************************



#define	BAUDRATE0		4800		// 用户定义的UART0 波特率

uchar    *Poiter_GPRS_TX;
uchar xdata    GPRS_RX_Buff[GPRS_RX_Buff_MAX];
uchar xdata    GPRS_TX_Buff[GPRS_RX_Buff_MAX];
uint   xdata     GPRS_TX_cnt=0;
//uchar    *Poiter_GPRS_TX=GPRS_RX_Buff;
 uint xdata GPRS_TX_Len;


bit GPRS_TX_is_over_B=1;    //所完标志位
                                  // GPRS_TX_is_over_B=0表示串口忙被 占用,
                                  //谁得到 GPRS_TX_is_over_B=1谁就得到串口生理权

xdata uchar  GPRS_Xin_485_b_FLAG=0;    //GPRS 标志寄存器




xdata uchar  GPRS_Es_jie_cnt;   //时限计时值

 
xdata uchar GPRS_Es_jie_cnt;   //时限计时值
xdata uint  Gprs_i_485;
xdata uchar Tem_sbuf;


uchar   DABAO_EEEE_GPRA_buffer(uchar qian1,uchar qian2,uchar Fun,uchar *Poit,uint Lenthg,uchar *Re_Poit) reentrant ;
//void  Get_Fa_Gprs_buffer_Right( );






  

void Open_URRA_0(void) 
{
	PCON |= 0x80;		// SMOD=1 (HW_UART uses Timer 1 overflow with no divide down).
	TMOD = 0x20;		// Configure Timer 1 for use by UART0
	CKCON |= 0x10;		// Timer 1 derived from SYSCLK

	RCAP2H=(65536-(SYSCLK/BAUDRATE0/32))/256;
	RCAP2L=(65536-(SYSCLK/BAUDRATE0/32))%256;
	TH2=RCAP2H;TL2=RCAP2L;
	CT2=0;				//T2:timer mode	
	TR2=1;
	TCLK0=1;
	RCLK0=1;		//说明:52,对于SIO0,可选择T1(TCLK=0,RCLK=0)或T2(TCLK=1,RCLK=1)作为波特率发生器
					    //            SIO1只能用T1作为波特率发生器
					    //baud=OSC/(32*(65536-[RCAP2H,RCAP2L])
	
	RI0=0;					// Clear HW_UART receive and transmit
	TI0=0;					// complete indicators.
	SCON0 = 0x50;			// Configure UART0 for mode 1, receiver enabled.
	ES0=1; 					// allow the serial interrupt
	
}









/**********************************************************************
**函数原型:   void DiJi_ZhengJuan()
**入口参数:
**出口参数:   无
**返 回 值:   无
**说    明:   uart0 中断 用于GPRS
************************************************************************/
void URRA_0_ISR(void) interrupt 4  using 3  {
	   	    
	
  if (_testbit_(RI0))	
	{	 
		 RI0=0;
		//if(GPRS_Xin_485_b_FLAG==0)  {	//数据未处理就是来新数据也不能接收  
			 if(Gprs_i_485>=GPRS_RX_Buff_MAX)   //防止超出数组范围
			 	 Gprs_i_485=0;
			GPRS_Es_jie_cnt=20; //时限计时值 100ms
			GPRS_RX_Buff[Gprs_i_485++]=SBUF0;
		//}	
    }
    if (_testbit_(TI0))
	{
		TI0=0;      //发送中断  发送入口,TX_Len:所发送的字节数
                     // TX_Buff[]: 发送缓冲区
           if(GPRS_TX_Len>=GPRS_RX_Buff_MAX)  
			 GPRS_TX_Len=GPRS_RX_Buff_MAX;
            if(GPRS_TX_Len!=0)  {
                   // GPRS_TX_is_over_B=0;
                    Tem_sbuf=GPRS_TX_Buff[1+GPRS_TX_cnt++];
                    SBUF0=Tem_sbuf;
            }
            else  {
                   GPRS_TX_cnt=0;
                  // GPRS_TX_is_over_B=1;    //所完标志位
            }
            GPRS_TX_Len--;
    }
 }

 //==========================================================
 //================以上是串口中断,用于接收GPRS


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

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



 /**********************************************************************
**函数原型:   void  Fa_Gprs_buffer(uint Lenthg)
**入口参数:   无
**出口参数:   无
**返 回 值:   无
**说    明:  将GPRS_TX_Buff[]发送子程序。
            // 发送入口,TX_Len:所发送的字节数
            //           GPRS_TX_Buff[]: 发送缓冲区
            //           TxIe=1;
            //           GPRS_TX_cnt=0;       100MS 串间隔
************************************************************************/

/*
void  Fa_Gprs_buffer(uint Lenthg)
      {  

	        // En_FA_485;
	         GPRS_TX_Len=Lenthg-1;       //TX_LEN发送前置好数值
	         GPRS_TX_cnt=0;	   
	         SBUF0=GPRS_TX_Buff[0];		  
      }
//==============================w2812837@163.com=================================================

*/





 /**********************************************************************
**函数原型:   void  Fa_Gprs_buffer(uint Lenthg)
**入口参数:   无
**出口参数:   无
**返 回 值:   无
**说    明:          先取得控制权,然后
          、、将指针指向的数组发给GPRS_TX_Buff[] 发送子程序。
            // 发送入口,TX_Len:所发送的字节数
            //           GPRS_TX_Buff[]: 发送缓冲区
            //           TxIe=1;
            //           GPRS_TX_cnt=0;       100MS 串间隔
************************************************************************/
/*
void  Fa_Gprs_Other2buffer(char *Poiter,uint Lenthg)
      {  
                uchar i;
				
		  Get_Fa_Gprs_buffer_Right( );
		  Clr_GPRS_RX_Buff();
		   GPRS_Xin_485_b_FLAG=GPRS_Xin_485_b_FLAG&(~XIN_GSM_R_B); 	 //clr  bit
		   
		  for(i=0;i<Lenthg;i++)
			GPRS_TX_Buff[i]=*Poiter++;
		  
	        // En_FA_485;
	         GPRS_TX_Len=Lenthg-1;       //TX_LEN发送前置好数值
	         GPRS_TX_cnt=0;	   
	         SBUF0=GPRS_TX_Buff[0];		  
      }
//==============================w2812837@163.com=================================================

*/







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

	  for (i=0;i<GPRS_RX_Buff_MAX;i++)
	  	   GPRS_RX_Buff[i]=0;  

}


/**********************************************************************
**函数原型:  void  DABAO_EEEE_GPRA_buffer(uchar qian1,uchar qian2,uchar Fun,uchar *Poit,uint Lenthg)
**入口参数:        ttt X 2ms =  时限            char  *pppp 为要找的字符串
**出口参数:   无
**返 回 值:     整个包的长度
**说    明:  发GPRS数据
************************************************************************/
uchar   DABAO_EEEE_GPRA_buffer(uchar qian1,uchar qian2,uchar Fun,uchar *Poit,uint Lenthg,uchar *Re_Poit) reentrant 
      { 
                uchar i,j;
	        
          
		  Gprs_i_485=0;    //接收数组下标复位;

	         Re_Poit[0]=qian1;
			 Re_Poit[1]=qian2;
	          Re_Poit[2]=Fun ;
	          Re_Poit[3]=Lenthg;
	         for(i=0;i<Lenthg;i++) {
	                Re_Poit[4+i]=*Poit++;
	         }
	          Re_Poit[4+i]=0;
	         j=0;
	         for(j=0;j<(Lenthg+2);j++)
	               Re_Poit[4+i]+= Re_Poit[j+2];
	          Re_Poit[4+i+1]=0xab;
		   Re_Poit[4+i+2]=0x1A;    // ctr+z
		     Re_Poit[4+i+3]=0;    // '0'


	  
		  //GPRS_TX_Len=Lenthg+6+1;       //TX_LEN发送前置好数值
	         return(Lenthg+6+1);
	      	 //Fa_F76_buffer(uchar Fun, uchar * Poit, uint Lenthg)
	   
      }

⌨️ 快捷键说明

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