📄 uart51.c
字号:
/********************************************************************************
* 文件:uart51.c
* 功能:UART0和UART1基本操作程序库
* 作者:宋智宁
* 日期:2005.3.8
* 备注:支持AT89S52(入口参数uart_no无效),中断服务程序由用户来修改
*********************************************************************************/
#include "config.h"
/******************************************************************************
* 名称:Uart_Init()
* 功能:UART初始化子程序
* 入口参数:bit uart_no --选择串口(无效)
* unsigned char mode--串口模式
* unsigned int bd_rate--常用波特率
* 出口参数:无
* 使用全局变量:无
* 说明:(1) CPU:AT89S52
* (2) 晶振频率:11.0592 MHz
* (3) 机器周期:1.08 us
* (4) UART: 用TIMER1
* (5) 注意串口工作方式和中断的开启
* (6) 最大波特率57600bps
******************************************************************************/
void Uart_Init(bit uart_no, unsigned char mode, unsigned int bd_rate)
{
unsigned int timerval;
EA = 0; //初始化时关总中断
//----Timer1-Init-----------------------------
TMOD = (TMOD&0x0f)+0x20; //TIMER1,MODE2
if(bd_rate>28800)
{
bd_rate = bd_rate/2;
PCON |= 0x80; //SMOD = 1;
}else
PCON &= 0x7F; //SMOD = 0;
timerval = 0x00 - 28800/bd_rate; //BD_RATE = (fosc/(12*(256-N)))/32;
TR1 = 0;
TH1 = (unsigned char)timerval;
TL1 = (unsigned char)timerval;
TR1 = 1;
//----Uart0-Init-----------------------------
if(mode<=3)
{
SCON = (mode<<6) | 0x10; //SERIAL0 MODE=mode ; REN=1; SM2=0
}
#if SERIAL_INT_EN==1
ES = 1;
#else
ES = 0;
#endif
EA = 1; //开总中断 (注意串行中断的ISR)
}
/******************************************************************************
* 名称:Uart_Send_Byte()
* 功能:Uart发送 N Byte子程序
* 入口参数:bit uart_no --选择串口(无效)
* unsigned char buf[] --发送数据指针
* unsigned char num --发送字节数
* 出口参数:无
* 使用全局变量:无
******************************************************************************/
void Uart_Send_Byte(bit uart_no, unsigned char buf[], unsigned char num)
{
unsigned char i;
#if SERIAL_INT_EN==1
ES = 0; //关中断
#endif
for(i=0; i<num; i++)
{
SBUF = buf[i]; //Uart
while(!TI); //wait for send
TI = 0;
}
#if SERIAL_INT_EN==1
ES = 1; //开中断
#endif
}
/******************************************************************************
* 名称:Uart_Send_Str()
* 功能:Uart顺序发送字符串子程序
* 入口参数:bit uart_no --选择串口(无效)
* unsigned char *str_dat ----字符串指针
* 出口参数:无
* 使用全局变量:无
******************************************************************************/
void Uart_Send_Str(bit uart_no, unsigned char *str_p)
{
unsigned char i;
#if SERIAL_INT_EN==1
ES = 0; //关中断
#endif
while((*str_p)!=0)
{
SBUF = (*str_p++); //uart
while(!TI); //wait for send
TI = 0;
}
#if SERIAL_INT_EN==1
ES = 1; //开中断
#endif
}
/******************************************************************************
* 名称:Uart_Rev_Byte()
* 功能:Uart等待接收 N Byte子程序
* 入口参数:bit uart_no --选择串口(无效)
* unsigned char buf[] --接收缓冲区
* unsigned char num --接收字节数
* 出口参数:无
* 使用全局变量:无
******************************************************************************/
void Uart_Rev_Byte(bit uart_no, unsigned char buf[], unsigned char num)
{
unsigned char i;
#if SERIAL_INT_EN==1
ES = 0; //关中断
#endif
for(i=0; i<num; i++)
{
while(!RI); //uart0
buf[i] = SBUF; //receive data
RI = 0;
}
#if SERIAL_INT_EN==1
ES = 1; //开中断
#endif
}
#if SERIAL_INT_EN==1
/******************************************************************************
* 名称:ISR_Uart_Rev()
* 功能:Uart接收数据中断服务程序
* 入口参数:无
* 出口参数:无
* 使用全局变量:unsigned char buf[]--接收缓冲区
* 说明:本函数由用户根据需要修改
******************************************************************************/
void ISR_Uart_Rev(void) interrupt 4
{
if(TI) //发送中断
{
TI = 0;
return;
}
if(RI) //接收中断
{
RI = 0;
GM8125_Byte_Rev(SBUF); //GM8125数据接收处理子程序(供中断服务程序调用)
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -