📄 uart.c
字号:
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&串口驱动&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//*文件名称:uart.c
//*文件作用:串口驱动
//*文件作者:翟 鹏
//*创建日期:2004年5月
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#include <include.h>
uchar idata uart_fifo[UART_BUFF_SIZE];//接收FIFO
uchar idata uart_fifo_in=0;//写指针
uchar idata uart_fifo_out=0;//读指针
//***********************************************************************************************************************
//函数作用:SP2349中断服务程序
//参数说明:无
//注意事项:注意中断号码和优先级设置
//返回说明:无
//***********************************************************************************************************************
static void uart_isr(void) interrupt IRQ_UART //using USE_UART
{
if(RI)
{
uart_fifo[uart_fifo_in++]=SBUF;//接收串口一个字符
if(uart_fifo_in>=UART_BUFF_SIZE)uart_fifo_in=0;//如果接收缓冲区满
RI=0;//清除中断标志
}
}
//***********************************************************************************************************************
//*函数作用:uart初始化---串口波特率设置 停止位设置
//*参数说明:
//*注意事项:
//*返回说明:无
//***********************************************************************************************************************
void uart_init(ulong baud)
{
ES=0;//关中断
PS=0;//串口中断--低优先级
SCON=0x58;//串口1方式1 8位数据位 1位停止位
ET1=0;//关闭timer1中断
PT1=0;//timer1中断--低优先级
TR1=0;//关闭timer1
TMOD|=0x20;//timer1方式2---波特率发生器
//波特率倍增
#ifdef DOUBLE_BAUDRATE
PCON=0x80;//设置波特率倍增寄存器
baud>>=1;//波特率倍增
#endif
TH1=256-((ulong)F_OSC)/32/CLOCK_COUNT/baud;//timer1设置计数初值---TH1=256-F_OSC/32/CLOCK_COUNT/baud
TL1=256-((ulong)F_OSC)/32/CLOCK_COUNT/baud;//timer1装载初始化值---TL1=256-F_OSC/32/CLOCK_COUNT/baud
TR1=1;//开启timer1
uart_flush();
ES=1;//开中断
}
//***********************************************************************************************************************
//函数作用:清除串口缓存的数据
//参数说明:无
//注意事项:
//返回说明:无
//***********************************************************************************************************************
void uart_flush(void)
{
uart_fifo_in=uart_fifo_out=0;
}
//***********************************************************************************************************************
//函数作用:查询串口 如果有数据读取一个字节
//参数说明:ch---读取字符存放地址
//注意事项:
//返回说明:如果有数据返回1
//***********************************************************************************************************************
uchar uart_read_char(uchar *ch)
{
if(uart_fifo_out==uart_fifo_in)return 0;
*ch=uart_fifo[uart_fifo_out];//得到当前要读取的字符
uart_fifo_out++;//指向下一个要读取的字符
if(uart_fifo_out==UART_BUFF_SIZE)uart_fifo_out=0;//如果到了fifo末尾 则重从头开始
return 1;
}
//***********************************************************************************************************************
//函数作用:向串口发送一个字符
//参数说明:ch---要发送的字符
//注意事项:
//返回说明:无
//***********************************************************************************************************************
void uart_write_char(uchar ch)
{
SBUF=ch;
while(TI==0);//如果TI=0说明还没有发送完毕---死等
TI=0;//发送完毕以后--TI清0
}
//***********************************************************************************************************************
//函数作用:向串口发送字符串
//参数说明:str---要发送的字符串
//注意事项:
//返回说明:无
//***********************************************************************************************************************
void uart_write_str(uchar *str)
{
while(*str)uart_write_char(*str++);
}
//***********************************************************************************************************************
//函数作用:向串口发送缓冲区的数据
//参数说明:
//注意事项:
//返回说明:无
//***********************************************************************************************************************
//void uart_write_buf(uchar *buffer, uint length)
//{
// while(length--)
// {
// uart_write_char(*buffer++);
// }
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -