📄 uart.c
字号:
/************************************************************************************
* Copyright (c) 2004,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* 文件名称: Uart.C
* 文件标识: none
* 适用器件: C8051F120
*
* 摘 要: 本文件是串口0、1子程序; Uart驱动程序,包括初始化、使用外部22.1184MHz晶振。
* 波特率设置,单字节发送接收、字符串发送接受等。
*
* 当前版本:1.2
* 作 者:李林利
* 完成日期:2005年6月19日
*
* 历史版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "c8051f120.h"
#include "uart.h"
/************************************************************************************/
/*************************************************************************************
* 函数名称:Uart0_Init;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:unsigned char类型,发送数据波特率;
*
* 返回数据:none;
*
* 注意: 具体模式设置查看UART.H文件;
*************************************************************************************/
void Uart0_Init(unsigned long BaudRate)
{
char data SFRPAGE_SAVE = SFRPAGE;// Save Current SFR page
SFRPAGE = UART0_PAGE; // set SFR page
SCON0 = 0x52; // SCON0工作于模式1, 8字节UART TI0预置1
SSTA0 = 0x1F; // 设置Uart0 TX,RX 波特率时钟源为TMR4
SFRPAGE = TMR4_PAGE; // set SFR page
TMR4CN &= ~0x04; // 关闭定时器Timer4
EIE2 &= ~0x04; // 关闭Timer4中断
EIP2 &= ~0x04; // 关闭Timer4中断优先级
EIE2 &= ~0x40; // 关闭Uart0中断
EIP2 &= ~0x40; // 关闭Uart0中断优先级
RCAP4H = (65536-(SYSCLK/(BaudRate*16)))/256;
RCAP4L = (65536-(SYSCLK/(BaudRate*16)))%256;
// 设置定时器Timer4重载值, Uart1_CLK=SYSCLK/2
TMR4CF = 0x08; // clk = SYS_CLK;
TMR4CN |= 0x04; // Uart0时钟源开始工作
SFRPAGE = SFRPAGE_SAVE;// Restore SFR page
}
/***********************************************************************************
* 函数名称:Uart0_Enable;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:bool类型,打开输入1;关闭输入0;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart0_Enable(unsigned char Flag)
{
char data SFRPAGE_SAVE = SFRPAGE;// Save Current SFR page
SFRPAGE = SFR_PAGE_0; // set SFR page 0
if (Flag)
TR1 = 1; // 打开串口Uart0
else
TR1 = 0;; // 关闭串口Uart0
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:Uart0_SendString;
*
* 函数功能描述:Uart0发送字符串;
*
* 输入参数: unsigned char类型指针,发送数据;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart0_SendString(unsigned char *pt)
{
while(*pt)
{
Uart0_SendByte(*pt++);
}
}
/***********************************************************************************
* 函数名称:Uart0_SendByte;
*
* 函数功能描述:Uart0发送字符;
*
* 输入参数:unsigned char类型,发送数据;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart0_SendByte(unsigned char value)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_0; // set SFR page 0
while(!TI0); // 等待发送1个字节数据完成
SBUF0=value; // 发送数据到uart0
TI0=0; // 清除中断标志
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:Uart0_ReceiveData;
*
* 函数功能描述:Uart0接收数据;
*
* 输入参数:none;
*
* 返回数据:unsigned char类型,接收数据;
*
* 注意: none;
************************************************************************************
unsigned char Uart0_ReceiveData(void)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_0; // set SFR page 0
if(RI0)
{
SCON0&=~0x01; // 清除RI1标志位
return SBUF0;
}
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
return 0xff;
}
/***********************************************************************************
* 函数名称:Uart1_Init;
*
* 函数功能描述:Uart1初始化;
*
* 输入参数:unsigned char类型,发送数据波特率;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart1_Init(unsigned long BaudRate)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = TIMER01_PAGE; // set SFR page 0
TR1 = 0; // 关闭定时器Timer1,串口0停止工作
ET1 = 0; // 关闭定时器Timer1中断
PT1 = 0; // 关闭定时器Timer1中断优先权
TMOD = (TMOD&0x0F)
|0x20; // TMOD: 定时器1模式设置
SFRPAGE = UART1_PAGE; // set SFR page
SCON1 = 0x52; // SCON0: 8位Uart 可变波特率 允许接收
SFRPAGE = TIMER01_PAGE; // set SFR page 0
if (BaudRate>=172800)
{
CKCON |= 0x10; // 定时器Timer1使用系统时钟作为时间基准
TH1 = -(SYSCLK/(BaudRate*2)); // 设置定时器Timer1重载值
}
else if ((BaudRate<172800)&&(BaudRate>=14400))
{
CKCON = 0x00; // 定时器Timer1使用系统时钟作为时间/12基准
TH1 = -(SYSCLK/(BaudRate*2*12)); // 设置定时器Timer1重载值
}
else
{
CKCON = 0x02; // 定时器Timer1使用系统时钟作为时间/48基准
TH1 = -(SYSCLK/(BaudRate*2*48)); // 设置定时器Timer1重载值
}
SFRPAGE = UART1_PAGE; // set SFR page
EIE2 &= ~0x40; // 关闭串口Uart0中断
EIP2 &= ~0x40; // 关闭串口中断优先权
TR1 = 1; // 打开定时器Timer1,串口0开始工作
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:Uart1_Enable;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:bool类型,打开输入1;关闭输入0;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart1_Enable(unsigned char Flag)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = TMR4_PAGE; // set SFR page
if (Flag)
TMR4CN |=0x04; // 打开Uart1
else
TMR4CN &=~0x04; // 关闭Uart1
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称: Uart1_SendString;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:unsigned char类型指针,发送数据;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart1_SendString(unsigned char *pt)
{
while(*pt)
{
Uart1_SendByte(*pt++);
}
}
/***********************************************************************************
* 函数名称:Uart1_SendByte;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:unsigned char类型指针,发送数据;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart1_SendByte(unsigned char value)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = UART1_PAGE; // set SFR page
while(!(TI1)); // 等待发送1个字节数据完成
SBUF1=value; // 发送数据到uart1
SCON1&=~0x02; // 清除中断标志
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:Uart1_ReceiveData;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:none;
*
* 返回数据:unsigned char类型,接收数据;
*
* 注意: none;
************************************************************************************
unsigned char Uart1_ReceiveData(void)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = UART1_PAGE; // set SFR page
while(RI1)
{
SCON1&=~0x01; // 清除RI1标志位
return SBUF1;
}
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
return 0xff;
}
/***********************************************************************************
*文件结束
***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -