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