📄 uart.c
字号:
/************************************************************************************
* Copyright (c) 2004,西安铭朗电子科技有限责任公司
* All rights reserved.
*
* 文件名称: Uart.c
* 文件标识: none
* 适用器件: C8051F040
*
* 摘 要: 本文件是串口0、1子程序;使用外部22.1184MHz晶振. Uart驱动程序,包括初始化、
* 波特率设置,单字节发送接收、字符串发送接受等。将跳线器JP7、短接。
* 使用外部22.1184MHz晶振。
*
* 当前版本:1.2
* 作 者:张宁强
* 完成日期:2006年1月10日
*
* 历史版本:1.0
* 原作者 : 李林利 卢阳
* 完成日期:2005年6月1日
*************************************************************************************/
/************************************************************************************/
// 引用外部头文件
#include "c8051F040.h"
#include "intrins.h"
#include "const.h"
#include "uart.h"
/************************************************************************************/
/************************************************************************************
// 常量及全局变量定义
*************************************************************************************/
unsigned char data utxok=1;
/************************************************************************************
* Uart子程序
*************************************************************************************/
/***********************************************************************************
* 函数名称:Uart1_Init;
*
* 函数功能描述:Uart1初始化;
*
* 输入参数:unsigned char类型,发送数据波特率;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
void Uart1_Init(unsigned long BaudRate) //Uart1初始化
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_0; // set SFR page 0
TR1=0; // 关闭定时器Timer1
ET1=0; // 关闭定时器Timer1中断
PT1=0; // 关闭定时器Timer1中断优先权
TMOD&= 0x0f; // TMOD: 定时器1, 模式2, 8位重载
TMOD|= 0x20; // TMOD: 定时器1, 模式2, 8位重载
if (BaudRate>=57600)
{
CKCON |= 0x10; // 定时器Timer1使用系统时钟作为时间基准
TH1 = 256-(SYSCLK/(BaudRate*2)); // 设置定时器Timer1重载值
}
else if ((BaudRate<57600)&&(BaudRate>=9600))
{
CKCON = 0x00; // 定时器Timer1使用系统时钟作为时间/12基准
TH1 = 256-(SYSCLK/(BaudRate*2*12)); // 设置定时器Timer1重载值
}
else
{
CKCON = 0x02; // 定时器Timer1使用系统时钟作为时间/48基准
TH1 = 256-(SYSCLK/(BaudRate*2*48)); // 设置定时器Timer1重载值
}
//ES0=0; // 打开串口Uart1中断
EIE2 |= 0x40;
//PS=0; // 串口Uart1中断优先权设为"低"
EIP2 &= 0xBF;
utxok=1; //can send bytes
TR1=1; // 打开串口Uart1
SFRPAGE = SFR_PAGE_1;// set SFR page 1
SCON1=0x56; // SCON1:模式1, 8字节UART, 打开RX, TI1=1,RI1=0
SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
}
/***********************************************************************************
* 函数名称:Uart1_Enable;
*
* 函数功能描述:Uart0初始化;
*
* 输入参数:bool类型,打开输入1;关闭输入0;
*
* 返回数据:none;
*
* 注意: none;
************************************************************************************/
/*
void Uart1_Enable(bool Flag)
{
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_2;
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 = SFR_PAGE_1;
/*
while(utxok!=1); // 等待发送1个字节数据完成
SBUF1=value; // 发送数据到uart1
utxok=0;
//SCON1&=~0x02; // 清除中断标志
*/
while(!(SCON1&0x02));
SBUF1 = value;
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 = SFR_PAGE_1;
while(!(SCON1&0x01));
SCON1 &= ~0x01;
return SBUF1;
}
void Uart1_ReceiveLong(char command[])
{
unsigned int i;
char data SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
SFRPAGE = SFR_PAGE_1;
for (i=0;i<3;i++)
{
command[i] = Uart1_ReceiveData();//当收到3个字节命令的时候,command收满了跳到主函数main()
}
}
/***********************************************************************************/
// 文件结束
/***********************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -