现在的位置: 首页 > 综合 > 正文

UART

2018年02月01日 ⁄ 综合 ⁄ 共 3872字 ⁄ 字号 评论关闭

//-----------------------------------------------------------------------------
// 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
//-----------------------------------------------------------------------------

【上篇】
【下篇】

抱歉!评论已关闭.