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