UART

//-----------------------------------------------------------------------------
// 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
//-----------------------------------------------------------------------------
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值