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

📄 uart.c

📁 51上的RTOS
💻 C
字号:
/*
    
*/

#include    "RTOS.h"

#define     OWN_ADDRESS        1
bit         bRecCommand,bRecData;
struct
{
   union
   {
     uint    uiaBuffer[260];
     uchar   ucaBuffer[520];
   } Tx;
   union
   {
     uint    uiaBuffer[260];
     uchar   ucaBuffer[520];
   } Rx;
   union
   {
     uint    uiRec;
	 uchar   ucaRec[2];
   } Length;
   uint    uiTxNumber,uiTxLength;
   uint    uiRxNumber;
}  xdata   Comm;

/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
                        
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */

void        UART(void)    interrupt  4  
{
   static   uchar    c;
   NOP();   NOP();  
   if(RI)//&RB8)
   {   
      NOP();   NOP();
	  c=SBUF; 
	  if(bRecData)   // 接收数据,因为接收数据和程序执行最多次,所以放在最先
	  {
	     NOP();   NOP();  
		 Comm.Rx.ucaBuffer[Comm.uiRxNumber]=c;
		 Comm.uiRxNumber++;		   
		 if(Comm.uiRxNumber>=Comm.Length.uiRec)
		 {
		     OSCreateTask(2);         // 接收完数据,建立任务			 
		 }
	  }
	  else if(bRecCommand)            // 接收命令或长度
	  {
	     if(Comm.Length.ucaRec[0]==0xff)
		 {
            Comm.Length.ucaRec[1]=c;  // 接收长度低字节
			Comm.Length.ucaRec[0]=0;
		 }
		 else
		 {
		    Comm.Length.ucaRec[0]=c;  // 接收长度高字节
			bRecCommand=0;
			bRecData=1;
		 }
	  }
	  else if((c==OWN_ADDRESS)&&(RB8==1))  // 接收地址
	  {		     
		 SM2=bRecData=0;        
		 bRecCommand=1;
		 Comm.Length.ucaRec[0]=0xff;
		 Comm.uiRxNumber=0;		
	  }		  
   }
   else if(TI)    //////////////////////////////////////////   Transmited one byte
   {
      NOP();   NOP();   	  
	  {
	     NOP();   NOP();
         if(Comm.uiTxLength)          // 发送数据
		 {
            NOP();   NOP();
			Comm.uiTxLength--;        // 初始化时为发送数据长度
            Comm.uiTxNumber++;	      // 初始化时为0  		    
			SBUF=Comm.Tx.ucaBuffer[Comm.uiTxNumber]; // next byte
			NOP();   NOP();       			
		 }		 
	  }            
   }        
   RI=TI=0;
} // End function




/* $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ */
void        InitUART()
{
   NOP();   NOP();   
   SCON=0xf0;       // module 3,1bit start bit,8bit data bit,1bit check bit,1bit stop bit
   TR2=C_T2=0;   
   RCLK=1;          // causes Timer 2 overflows to be used for the receive clock.
   TCLK=1;          // causes Timer 2 overflows to be used for the transmit clock.
   RCAP2L=0xfa;     // 19200bps(11.0592MHz) // 0xee 19200bps; 0xfd 115200bps;0xfa 57600bps
   RCAP2H=0xff;    
   ////////////////////////////////////////////////////   
   SM2=1;
   ES=TR2=PS=1;    // Enable UART receive 
   NOP();   NOP();
}

⌨️ 快捷键说明

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