您的位置:首页 > 其它

UART

2014-01-12 13:20 197 查看
//-----------------------------------------------------------------------------

// UART0.c

//-----------------------------------------------------------------------------

// Includes

//-----------------------------------------------------------------------------

#include <C8051F330.h>                 // SFR declarations

#include "public.h"

//-----------------------------------------------------------------------------

// Global CONSTANTS

//-----------------------------------------------------------------------------

#define BAUDRATE    9600             // Baud rate of UART in bps

//-----------------------------------------------------------------------------

// Global Variables

//-----------------------------------------------------------------------------

#define UART_BUFFERSIZE 5  //一帧数据包括5个字节

uchar UART_Rx_Buf[5];

uchar UART_Buffer_Size = 0;

uchar UART_Input_First = 0;

uchar UART_Output_First = 0;

uchar TX_Ready =1,RX_Ready=0;

//-----------------------------------------------------------------------------

// UART0_Init

//-----------------------------------------------------------------------------

//

// Return Value : None

// Parameters   : None

//

// Configure the UART0 using Timer1, for <BAUDRATE> and 8-N-1.

//-----------------------------------------------------------------------------

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);   //106

      CKCON &= ~0x0B;                  // T1M = 1; SCA1:0 = xx,SYSCLK

      CKCON |=  0x08;

   } else if (SYSCLK/BAUDRATE/2/256 < 4) {

      TH1 = -(SYSCLK/BAUDRATE/2/4);   //78.125

      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01,SYSCLK/4

      CKCON |=  0x01;

   } else if (SYSCLK/BAUDRATE/2/256 < 12) {

      TH1 = -(SYSCLK/BAUDRATE/2/12);

      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00,SYSCLK/12

   } else {

      TH1 = -(SYSCLK/BAUDRATE/2/48);

      CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10,SYSCLK/48

      CKCON |=  0x02;

   }

   TL1 = TH1;                          // init Timer1

   TMOD &= ~0xF0;                      // TMOD: timer 1 in 8-bit autoreload

   TMOD |=  0x20;

   TR1 = 1;                            // START Timer1

   TX_Ready = 1;                       // Flag showing that UART can transmit

   IP |= 0x10;                         // Make UART high priority

   ES0 = 1;                            // Enable UART0 interrupts

}

/*

void Uart_Send2(uchar Uart_Data[])

{

  uchar i;  

  REN0=0;                  //发送数据时禁止串口接收数据

  for(i=0;i<5;i++){

    SBUF0 = *(Uart_Data+i);
while(TI0==0);

    TI0 = 0;

  }

  REN0=1;                  //串口接收允许

}  //*/

void Uart_Send(uchar Uart_Data[], uchar Length)

{

  uchar i;  

  REN0=0;                  //发送数据时禁止串口接收数据 

  for(i=0;i<Length;i++){

    SBUF0 = Uart_Data[i];
while(TI0==0);

    TI0 = 0;

  }  

  REN0=1;                  //串口接收允许

}

//-----------------------------------------------------------------------------

// Interrupt Service Routines

//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------

// UART0_Interrupt

//-----------------------------------------------------------------------------

//

// This routine is invoked whenever a character is entered or displayed on the

// Hyperterminal.

//

//-----------------------------------------------------------------------------

extern uchar xdata UART_Tx_Buf[5];

void UART0_Interrupt (void) interrupt 4

{

   if (RI0 == 1){

      if(UART_Buffer_Size == 0)        // If new word is entered

         UART_Input_First = 0;   

      RI0 = 0;                           // Clear interrupt flag

      if (UART_Buffer_Size < UART_BUFFERSIZE){

         UART_Rx_Buf[UART_Input_First++] = SBUF0; // Store in array and Update counter

         UART_Buffer_Size++;             // Update array's size
if(UART_Rx_Buf[0]!=0x7E){
    // Check if the head is 0x7E
    UART_Buffer_Size=0;
UART_Input_First=0;
RX_Ready=0;

}else if(UART_Buffer_Size==UART_BUFFERSIZE){
//receive a frame data  
UART_Buffer_Size=0;
UART_Input_First=0;
RX_Ready=1;
}

      }

   }

}

//-----------------------------------------------------------------------------

// End Of File

//-----------------------------------------------------------------------------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: