📄 uart.c
字号:
/********************************Copyright (c)*********************************
** 西安铭朗电子科技有限公司
** 技 术 部
**
** http://www.mlarm.com
**
***********************************文件信息************************************
** File:Uart.c
** 描述: 串口0、1测试程序
** 功能:Uart驱动程序,包括初始化、波特率设置,单字节发送接收、字符串发送接受等。
程序运行时向PC机发送"WWW.MLARM.COM";接收到PC机的数据后,再将该数据发送
回PC机。
** 说明:将跳线器JP7、JP11短接。
** 使用外部22.1184MHz晶振。
******************************************************************************/
//-----------------------------------------------------------------------------
// 包含文件
//-----------------------------------------------------------------------------
#include <c8051F020.h>
#include <uart.h>
//-----------------------------------------------------------------------------
// 全局变量
//-----------------------------------------------------------------------------
unsigned char data Timer_1s_Count;
unsigned char data Uart0_BaudRate,Uart1_BaudRate;
//-----------------------------------------------------------------------------
// Uart0子程序
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Uart0_Init
//-----------------------------------------------------------------------------
void Uart0_Init(unsigned char BaudRate) //Uart0初始化
{
Uart0_BaudRate=0;
TR1=0; // 关闭定时器Timer1
ET1=0; // 关闭定时器Timer1中断
PT1=0; // 关闭定时器Timer1中断优先权
TMOD&= 0x0f; // TMOD: 定时器1, 模式2, 8位重载
TMOD|= 0x20; // TMOD: 定时器1, 模式2, 8位重载
SCON0 = 0x50; // SCON0: 模式1, 8位UART, 使能RX
PCON |= 0x80; // SMOD00 = 1
if (BaudRate>=BaudRate_4800)
{
CKCON |= 0x10; // 定时器Timer1使用系统时钟作为时间基准
TH1 = -(SYSCLK/1200/(BaudRate*16)); // 设置定时器Timer1重载值
}
else
{
CKCON &= ~0x10; // 定时器Timer1使用系统时钟作为时间基准
TH1 = -(SYSCLK/1200/(BaudRate*16*12)); // 设置定时器Timer1重载值
}
ES0=0; // 关闭串口Uart0中断
PS0=0; // 关闭串口Uart0中断优先权
TI0 = 1; // Indicate TX0 ready
RI0 = 0; // Indicate RX0 ready
TR1=1; // 打开串口Uart0
}
//-----------------------------------------------------------------------------
// Uart0_Enable
//-----------------------------------------------------------------------------
void Uart0_Enable(bool Flag)
{
if (Flag)
TR1=1; // 打开串口Uart0
else
TR1=0; // 关闭串口Uart0
}
//-----------------------------------------------------------------------------
// Uart0_SendString
//-----------------------------------------------------------------------------
void Uart0_SendString(unsigned char *pt)
{
WDT_CLR;
while(*pt)
{
WDT_CLR;
Uart0_SendByte(*pt++);
}
}
//-----------------------------------------------------------------------------
// Uart0_SendByte
//-----------------------------------------------------------------------------
void Uart0_SendByte(unsigned char value)
{
while(!TI0); // Wait send 1 byte data finish
SBUF0=value; // Send the data to uart0
TI0=0; // Clear interrupt flag
}
//-----------------------------------------------------------------------------
// Uart0_ReceiveData
//-----------------------------------------------------------------------------
unsigned char Uart0_ReceiveData(void)
{
Timer_1s_Count=0;
while(!RI0)
{
WDT_CLR;
if (Timer_1s_Count>=5)
return 0xff;
} // Wait receive data finished
RI0=0; // Clear RI0 Flag
return SBUF0;
}
//-----------------------------------------------------------------------------
// Uart1子程序
//-----------------------------------------------------------------------------
//-----------------------------------------------------------------------------
// Uart1_Init
//-----------------------------------------------------------------------------
void Uart1_Init(unsigned char BaudRate) //Init Uart0
{
Uart1_BaudRate=0;
T4CON&=~0x04; // Close Timer4
EIE2&=~0x04; // Disable Timer4 interrupt
EIP2&=~0x04; // Disable Timer4 interrupt Priority
T4CON=0x30; // Mode 2: TX,RX Raut Rate Mode
PCON|=0x10; // Power Control Registe, SMOD=1,BaudRate
SCON1=0x52; // SCON0: mode 1, 8-bit UART, enable RX, TI1=1,RI1=0
CKCON |= 0x40; // Uart1 uses SYSCLK/2 as time base
RCAP4H =(65536-(SYSCLK/1200/(BaudRate*32)))/256;
RCAP4L =(65536-(SYSCLK/1200/(BaudRate*32)))%256;
// set Timer4 reload value for baudrate, Uart1_CLK=SYSCLK/2
EIE2&=~0x40; // Disable Uart1 Interrupt
EIP2&=~0x40; // Disable Uart1 Interrupt Priority
T4CON|=0x04; // Enable Uart1
}
//-----------------------------------------------------------------------------
// Uart1_Enable
//-----------------------------------------------------------------------------
void Uart1_Enable(bool Flag)
{
if (Flag)
T4CON|=0x04; // Enable Uart1
else
T4CON&=~0x04; // Disable Uart1
}
//-----------------------------------------------------------------------------
// Uart1_SendString
//-----------------------------------------------------------------------------
void Uart1_SendString(unsigned char *pt)
{
WDT_CLR;
while(*pt)
{
WDT_CLR;
Uart1_SendByte(*pt++);
}
}
//-----------------------------------------------------------------------------
// Uart1_SendByte
//-----------------------------------------------------------------------------
void Uart1_SendByte(unsigned char value)
{
while(!(TI1)); // Wait send data finished
SBUF1=value; // Send the data to uart1
SCON1&=~0x02; // Clear interrupt flag
}
//-----------------------------------------------------------------------------
// Uart1_ReceiveData
//-----------------------------------------------------------------------------
unsigned char Uart1_ReceiveData(void)
{
Timer_1s_Count=0;
while(!(RI1))
{
WDT_CLR;
if (Timer_1s_Count>=5)
return 0xff;
} // Wait receive data finished
SCON1&=~0x01; // Clear RI1 Flag
return SBUF1;
}
//---------------------------------End-----------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -