51单片机串口接收和发送数据
扫描二维码
随时随地手机看文章
第一种方法:在中断中处理
typedef unsigned char UINT8;
volatile UINT8 u8Uart_Data;
void InitialUART0_Timer1()
{
SCON = 0x50; //2015-05-04
TMOD = 0x20;
TH1 = 0XFD; // 9600BPS 2015-05-04
TL1 = 0XFD;
TR1 = 1; // start timer0
ES = 1; // Enable serial interrupt
EA = 1; // Enable global interrupt
}
//-----------------------------------------------------------------------------------------------------------
void main (void)
{
//--------------------------------------------------------------------------------
InitialUART0_Timer1(); // 9600 Baud Rate @ 11.0592MHz
while(1)
{
// Receive_Data_From_PC();
//Send_Data_To_PC(Receive_Data_From_PC());
while(recv_data)
{
recv_data = 0;
TI = 0;
SBUF = u8Uart_Data;
}
}
}
//-----------------------------------------------------------------------------------------------------------
void UART_ISR(void) interrupt 4
{
if (RI)
{ // If reception occur
RI = 0; // Clear reception flag for next reception
u8Uart_Data = 0;
u8Uart_Data = SBUF; // Read receive data
recv_data = 1;
//SBUF = u8Uart_Data; // Send back same data on UART
}
if (TI) // If emission occur
{ // Clear emission flag for next emission
TI = 0;
}
}
//-----------------------------------------------------------------------------------------------------------
第二种方法:不在中断中处理
//-----------------------------------------------------------------------------------------------------------
// Use timer1 as baud rate generator
void InitialUART0_Timer1()
{
SCON = 0x50; //2015-05-04
TMOD = 0x20;
#if 0
#ifdef FOSC_110592
TH1 = 256 - (28800/u32Baudrate); /* 11.059M/384=28800 */
#endif
#ifdef FOSC_184320
TH1 = 256 - (48000/u32Baudrate); /* 18.4320M/384=48000 */
#endif
#ifdef FOSC_221184
TH1 = 256 - (57600/u32Baudrate); /* 22.1184M/384=57600 */
#endif
#ifdef FOSC_331776
TH1 = 256 - (86400/u32Baudrate); /* 33.1776M/384=86400 */
#endif
#ifdef FOSC_368640
TH1 = 256 - (96000/u32Baudrate); /* 36.8640M/384=96000 */
#endif
#endif /* #if 0 */
TH1 = 0XFD; // 9600BPS 2015-05-04
TL1 = 0XFD;
TR1 = 1; // start timer0
ES = 1; // Enable serial interrupt
EA = 1; // Enable global interrupt
}
//-----------------------------------------------------------------------------------------------------------
UINT8 Receive_Data_From_PC(void)
{
UINT8 c;
while (!RI);
c = SBUF;
RI = 0;
return (c);
}
//-----------------------------------------------------------------------------------------------------------
void Send_Data_To_PC (UINT8 c)
{
while (!TI);
TI = 0;
SBUF = c;
}
//-----------------------------------------------------------------------------------------------------------
//-----------------------------------------------------------------------------------------------------------
void main (void)
{
//--------------------------------------------------------------------------------
InitialUART0_Timer1(); // 9600 Baud Rate @ 11.0592MHz
//---------------------------------------------------------------------------------
while(1)
{
Receive_Data_From_PC();
Send_Data_To_PC(Receive_Data_From_PC());
}
}