📄 uart.c
字号:
/************************************************************************************
* Copyright (c) 2004,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* 文件名称: uart.c
* 文件标识: none
* 适用器件: c8051f020
*
* 摘 要: 本文件是uart0,uart1硬件驱动程序;
*
* 当前版本:1.0
* 作 者:李林利
* 完成日期:2004年11月14日
*
* 历史版本:0.9
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "..\config\common.h"
#include "uart.h"
/************************************************************************************/
/************************************************************************************
// 常量及全局变量定义
*************************************************************************************/
/************************************************************************************
* Uart0 功能子程序
*************************************************************************************/
/***********************************************************************************
* 函数名称:uart0_init;
*
* 函数功能描述:uart0 初始化函数,使用定时器1作为时钟,关闭了发送和接收中断;
*
* 输入参数:BaudRate: byte, 波特率变量,可选择以下波特率:
* BaudRate_1200,BaudRate_2400,BaudRate_4800,BaudRate_4800,BaudRate_9600;
* BaudRate_19200,BaudRate_38400,BaudRate_57600,BaudRate_115200;
*
* 返回数据:none;
*
* 注意: 定时器1资源被占用,SYSCLK = 22.1184Mhz;
************************************************************************************/
void uart0_init(INT32U BaudRate) // Init Uart0
{
TR1=0; // Close Timer1
ET1=0; // Disable Timer1 interrupt
PT1=0; // Disable Timer1 interrupt Priority
TMOD&= 0x0f; // TMOD: timer 1, mode 2, 8-bit reload
TMOD|= 0x20; // TMOD: timer 1, mode 2, 8-bit reload
SCON = 0x50; // SCON0: mode 1, 8-bit UART, enable RX
PCON |= 0x80; // SMOD00 = 1
if (BaudRate>=9600)
{
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
TH1 = -(SYSCLK/(BaudRate*16)); // set Timer1 reload value for baudrate
}
else
{
CKCON &= ~0x10; // Timer1 uses SYSCLK as time base
TH1 = -(SYSCLK/(BaudRate*16*12)); // set Timer1 reload value for baudrate
}
ES=0; // Disable Uart0 Interrupt
PS0=0; // Disable Uart0 Interrupt Priority
TI = 1; // Indicate TX0 ready
RI = 0; // Indicate RX0 ready
TR1=1;
}
/***********************************************************************************
* 函数名称:Uart0_ChangeBaudRate;
*
* 函数功能描述:重新设置uart0波特率;
*
* 输入参数:BaudRate: byte, 波特率变量,可选择以下波特率:
* BaudRate_1200,BaudRate_2400,BaudRate_4800,BaudRate_4800,BaudRate_9600;
* BaudRate_19200,BaudRate_38400,BaudRate_57600,BaudRate_115200;
*
* 返回数据:none;
*
* 注意: 定时器1资源被占用,SYSCLK = 22.1184Mhz;
************************************************************************************/
void Uart0_ChangeBaudRate(INT32U BaudRate)
{
TR1=0; // Close Timer1
if (BaudRate>=9600)
{
CKCON |= 0x10; // Timer1 uses SYSCLK as time base
TH1 = -(SYSCLK/(BaudRate*16)); // set Timer1 reload value for baudrate
}
else
{
CKCON &= ~0x10; // Timer1 uses SYSCLK as time base
TH1 = -(SYSCLK/(BaudRate*16*12)); // set Timer1 reload value for baudrate
}
TR1=1;
}
/***********************************************************************************
* 函数名称:Uart0_Enable;
*
* 函数功能描述:uart0使能函数,打开或关闭uart0;
*
* 输入参数:Flag: bool, uart0使能变量;
* Flag: true,打开uart0; Flag: false,关闭uart0;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart0_Enable(bool Flag)
{
if (Flag)
TR1=1; // Open Uart0
else
TR1=0; // Close Uart0
}
/***********************************************************************************
* 函数名称:Uart0_ISR_Enable;
*
* 函数功能描述:uart0中断使能函数;
*
* 输入参数:Flag: bool, uart0中断使能变量;
* Flag: true,允许uart0中断; Flag: false,关闭uart0中断;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart0_ISR_Enable(bool Flag)
{
if (Flag)
ES=1; // Enable Uart0 Interrupt
else
ES=0; // Disable Uart0 Interrupt
}
/***********************************************************************************
* 函数名称:Uart0_ISR;
*
* 函数功能描述:uart0中断函数;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: 在中断程序内处理尽可能少的事情;
************************************************************************************/
void Uart0_ISR(void) interrupt 4
{
}
/***********************************************************************************
* 函数名称:Uart0_SendByte;
*
* 函数功能描述:通过uart0发送一个字节数据;
*
* 输入参数:value:unsigned char, 要发送的数据变量;
*
* 返回数据:none;
*
* 注意: 发送完数据要清除中断标志;
************************************************************************************/
void Uart0_SendByte(unsigned char value)
{
while(!TI); // Wait send 1 byte data finish
SBUF=value; // Send the data to uart0
TI=0; // Clear interrupt flag
}
/***********************************************************************************
* 函数名称:Uart0_SendString;
*
* 函数功能描述:通过uart0发送一个字符串数据;
*
* 输入参数:pt: unsigned char xdata *, 要发送的字符串数据变量的指针;
*
* 返回数据:none;
*
* 注意: 字符串数据要以零为结束符;
************************************************************************************/
void Uart0_SendString(unsigned char code *pt)
{
while(*pt)
Uart0_SendByte(*pt++);
}
/***********************************************************************************
* 函数名称:Uart0_ReceiveData;
*
* 函数功能描述:通过uart0接收一个字节数据;
*
* 输入参数:none;
*
* 返回数据:SBUF0: unsigned char, 一个字节;
*
* 注意: 接收完数据要清除中断标志;
************************************************************************************/
unsigned char Uart0_ReceiveData(void)
{
while(!RI); // Wait receive data finished
RI=0; // Clear RI0 Flag
return SBUF;
}
/************************************************************************************
* Uart1 功能子程序
*************************************************************************************/
/***********************************************************************************
* 函数名称:uart1_init;
*
* 函数功能描述:uart1 初始化函数,使用定时器4作为时钟,关闭了发送和接收中断;
*
* 输入参数:BaudRate: byte, 波特率变量,可选择以下波特率:
* BaudRate_1200,BaudRate_2400,BaudRate_4800,BaudRate_4800,BaudRate_9600;
* BaudRate_19200,BaudRate_38400,BaudRate_57600,BaudRate_115200;
*
* 返回数据:none;
*
* 注意: 定时器4资源被占用,SYSCLK = 22.1184Mhz;
************************************************************************************/
void Uart1_Init(INT32U BaudRate) // Init Uart0
{
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/(BaudRate*32)))/256;
RCAP4L =(65536-(SYSCLK/(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_ChangeBaudRate;
*
* 函数功能描述:重新设置uart1波特率;
*
* 输入参数:BaudRate: byte, 波特率变量,可选择以下波特率:
* BaudRate_1200,BaudRate_2400,BaudRate_4800,BaudRate_4800,BaudRate_9600;
* BaudRate_19200,BaudRate_38400,BaudRate_57600,BaudRate_115200;
*
* 返回数据:none;
*
* 注意: 定时器4资源被占用,SYSCLK = 22.1184Mhz;
************************************************************************************/
void Uart1_ChangeBaudRate(INT32U BaudRate)
{
T4CON&=~0x04; // Close Timer4
RCAP4H =(65536-(SYSCLK/(BaudRate*32)))/256;
RCAP4L =(65536-(SYSCLK/(BaudRate*32)))%256; // set Timer4 reload value for baudrate, Uart1_CLK=SYSCLK/2
T4CON|=0x04; // Enable Uart1
}
/***********************************************************************************
* 函数名称:Uart1_Enable;
*
* 函数功能描述:uart1使能函数,打开或关闭uart0;
*
* 输入参数:Flag: bool, uart1使能变量;
* Flag: true,打开uart1; Flag: false,关闭uart1;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart1_Enable(bool Flag)
{
if (Flag)
T4CON|=0x04; // Enable Uart1
else
T4CON&=~0x04; // Disable Uart1
}
/***********************************************************************************
* 函数名称:Uart1_ISR_Enable;
*
* 函数功能描述:uart1中断使能函数;
*
* 输入参数:Flag: bool, uart1中断使能变量;
* Flag: true,允许uart1中断; Flag: false,关闭uart1中断;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart1_ISR_Enable(bool Flag)
{
if (Flag)
EIE2|=0x40; // Enable Uart1 Interrupt
else
EIE2&=~0x40; // Disable Uart1 Interrupt
}
/***********************************************************************************
* 函数名称:Uart1_ISR;
*
* 函数功能描述:uart1中断函数;
*
* 输入参数:none;
*
* 返回数据:none;
*
* 注意: 在中断程序内处理尽可能少的事情;
************************************************************************************/
void Uart1_ISR(void) interrupt 20
{
}
/***********************************************************************************
* 函数名称:Uart1_SendByte;
*
* 函数功能描述:通过uart1发送一个字节数据;
*
* 输入参数:value:unsigned char, 要发送的数据变量;
*
* 返回数据:none;
*
* 注意: 发送完数据要清除中断标志;
************************************************************************************/
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_SendString;
*
* 函数功能描述:通过uart1发送一个字符串数据;
*
* 输入参数:pt: unsigned char xdata *, 要发送的字符串数据变量的指针;
*
* 返回数据:none;
*
* 注意: 字符串数据要以零为结束符;
************************************************************************************/
void Uart1_SendString(unsigned char *pt)
{
while(*pt)
Uart1_SendByte(*pt++);
}
/***********************************************************************************
* 函数名称:Uart1_ReceiveData;
*
* 函数功能描述:通过uart1接收一个字节数据;
*
* 输入参数:none;
*
* 返回数据:SBUF1: unsigned char, 一个字节;
*
* 注意: 接收完数据要清除中断标志;
************************************************************************************/
unsigned char Uart1_ReceiveData(void)
{
while(!(RI1)); // Wait receive data finished
SCON1&=~0x01; // Clear RI1 Flag
return SBUF1;
}
/***********************************************************************************/
// 文件结束
/***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -