1. 程式人生 > >UART(Universal Asynchronous Receiver Transmitter:通用非同步收發器)

UART(Universal Asynchronous Receiver Transmitter:通用非同步收發器)

UART(Universal Asynchronous Receiver Transmitter:通用非同步收發器)

UART協議雖然速率較低,但協議簡單,實現起來很便捷。

 

    UART有4個pin(VCC, GND, RX, TX), 用的TTL電平,  低電平為0(0V),高電平為1(3.3V或以上)。

                                                                        

     COM口是我們桌上型電腦上面常用的口(下圖),9個pin, 用的RS232電平,  它是負邏輯電平,它定義+5~+12V為低電平,而-12~-5V為高電平                                          

如果與電腦連線,因為電腦是串列埠電平不同的微控制器電平,   須要用到MAX232  進行電平轉換 

IO口對外,一般有     推拉方式    開漏式

串列埠,所謂串列埠就是一個移位暫存器。           資料-------》  緩衝器 ---》移位暫存器      移位暫存器-----》緩衝器

 

 

需要了解UART協議的幾個引數,解釋如下:

波特率:即每秒可以傳輸的碼元個數

起始位:先發出一個邏輯”0”的訊號,表示傳輸資料的開始。 

資料位:可以選擇的值有5,6,7,8這四個值,可以傳輸這麼多個值為0或者1的bit位。這個引數最好為8,因為如果此值為其他的值時當你傳輸的是ASCII值時一般解析肯定會出問題。理由很簡單,一個ASCII字元值為8位,如果一幀的資料位為7,那麼還有一位就是不確定的值,這樣就會出錯。 

校驗位:資料位加上這一位後,使得“1”的位數應為偶數(偶校驗)或奇數(奇校驗),以此來校驗資料傳送的正確性。就比如傳輸“A”(01000001)為例。 
1、當為奇數校驗:”A”字元的8個bit位中有兩個1,那麼奇偶校驗位為1才能滿足1的個數為奇數(奇校驗)。
2、當為偶數校驗:”A”字元的8個bit位中有兩個1,那麼奇偶校驗位為0才能滿足1的個數為偶數(偶校驗)。 
此位還可以去除,即不需要奇偶校驗位。 

停止位:它是一個字元資料的結束標誌。可以是1位、1.5位、2位的高電平。由於資料是在傳輸線上定時的,並且每一個裝置有其自己的時鐘,很可能在通訊中兩臺裝置間出現了小小的不同步。因此停止位不僅僅是表示傳輸的結束,並且提供計算機校正時鐘同步的機會。適用於停止位的位數越多,不同時鐘同步的容忍程度越大,但是資料傳輸率也就越慢。

空閒位:沒有資料傳輸時線路上的電平狀態。為邏輯1。 

傳輸方向:即資料是從高位(MSB)開始傳輸還是從低位(LSB)開始傳輸。

這裡配置以下:波特率115200,資料位8位,停止位1,無校驗位

因為波特率為115200,因此碼元寬度為1s/115200=8.68us

 

凌通MUC
UART  工作在主機模式下   

void Usart_Init(void)
{
	SCON	= 0x50;			//Set UART as mode1 and enable reception.
	TMOD   |= 0x20;			//Initialize Timer1 as mode2.
	PCON	= T1ovDiv2;
	TL1		= 0x75;
	TH1		= 0x75;			//Set Baud rate as 115200 bps	   0x8A
	ES		= 0;			//Disable Uart Interrupt(Optional)
	TR1		= 1;			//Start Timer1 Counter
}

void usart_transmit(unsigned char dat)
{
	SBUF	= dat;			//Send 0xaa to TX.
	while(~TI);				//Wait uart finishs transfer data
	TI=0;
}


void printf_uart(unsigned char *cstring)
{
	 while((*cstring)!='\0')
     {
        usart_transmit(*cstring);
	    cstring++;
     }
}


8051f93XX



--------------------------------------------------------------------
void UART0_Init (void)
{
   SCON0 = 0x10;                       // SCON0: 8-bit variable bit rate
                                       //        level of STOP bit is ignored
                                       //        RX enabled
                                       //        ninth bits are zeros
                                       //        clear RI0 and TI0 bits
-------------------------
   #if (SYSCLK/BAUDRATE/2/256 < 1) 
      TH1 = -(SYSCLK/BAUDRATE/2);
      CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xx
      CKCON |=  0x08;
   #elif (SYSCLK/BAUDRATE/2/256 < 4) 
      TH1 = -(SYSCLK/BAUDRATE/2/4);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01
      CKCON |=  0x01;
   #elif (SYSCLK/BAUDRATE/2/256 < 12) 
      TH1 = -(SYSCLK/BAUDRATE/2/12);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00
   #else 
      TH1 = -(SYSCLK/BAUDRATE/2/48);
      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10
      CKCON |=  0x02;
   #endif
-------------------------
   TL1 = TH1;                          // Init Timer1
   TMOD &= ~0xf0;                      // TMOD: timer 1 in 8-bit autoreload
   TMOD |=  0x20;
   TR1 = 1;                            // START Timer1
   TI0 = 1;                            // Indicate TX0 ready
}



//中斷模式,一般中斷模式都是作從機
//-----------------------------------------------------------------------------
// UART0_Interrupt
//-----------------------------------------------------------------------------
//
// This routine is invoked whenever a character is entered or displayed on the
// Hyperterminal.
//
//-----------------------------------------------------------------------------

INTERRUPT(UART0_ISR, INTERRUPT_UART0)
{

   if (RI0 == 1)
   {
      if( UART_Buffer_Size == 0)  {      // If new word is entered
         UART_Input_First = 0;    }

      RI0 = 0;                           // Clear interrupt flag

      Byte = SBUF0;                      // Read a character from UART

      if (UART_Buffer_Size < UART_BUFFERSIZE)
      {
         UART_Buffer[UART_Input_First] = Byte; // Store in array

         UART_Buffer_Size++;             // Update array's size

         UART_Input_First++;             // Update counter
      }
   }

   if (TI0 == 1)                   // Check if transmit flag is set
   {
      TI0 = 0;                           // Clear interrupt flag

      if (UART_Buffer_Size != 1)         // If buffer not empty
      {
         // If a new word is being output
         if ( UART_Buffer_Size == UART_Input_First ) {
              UART_Output_First = 0;  }

         // Store a character in the variable byte
         Byte = UART_Buffer[UART_Output_First];

         if ((Byte >= 0x61) && (Byte <= 0x7A)) { // If upper case letter
            Byte -= 32; }

         SBUF0 = Byte;                   // Transmit to Hyperterminal

         UART_Output_First++;            // Update counter

         UART_Buffer_Size--;             // Decrease array size

      }
      else
      {
         UART_Buffer_Size = 0;            // Set the array size to 0
         TX_Ready = 1;                    // Indicate transmission complete
      }
   }
}

//-----------------------------------------------------------------------------
// putchar
//-----------------------------------------------------------------------------
//
// Return Value : None
// Parameters   : character to send to UART
//
// This function outputs a character to the UART.
//-----------------------------------------------------------------------------
void putchar (char c)
{
   if (c == '\n')
   {
      while (!TI0);
      TI0 = 0;
      SBUF0 = 0x0d;
   }
   while (!TI0);
   TI0 = 0;
   SBUF0 = c;
}

//-----------------------------------------------------------------------------
// getchar
//-----------------------------------------------------------------------------
//
// Return Value : character received from UART
// Parameters   : None
//
// This function returns a character from the UART.
//-----------------------------------------------------------------------------
char getchar (void)
{
   char c;

   while (!RI0);
   c = SBUF0;
   RI0 = 0;

   return c;
}