📄 suart2.c
字号:
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&软串口2驱动&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//*文件名称:suart2.c
//*文件作用:串口驱动
//*文件作者:翟 鹏
//*创建日期:2004年5月
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#include <include.h>
uchar idata suart2_th0=0;
uchar idata suart2_tl0=0;
uchar idata suart2_th0_1_3=0;//设置到BIT宽度的1/3处
uchar idata suart2_tl0_1_3=0;//设置到BIT宽度的1/3处
uchar idata SUART2_RI=0;//接收数据位计数器
uchar bdata SUART2_BUF=0;//数据寄存器
sbit SUART2_BUF_HIGH=SUART2_BUF^7;//数据寄存器最高位-用于接收移位
uchar idata SUART2_TI=0;//发送数据位计数器
uchar bdata SUART2_SBUF=0;//数据寄存器
sbit SUART2_SBUF_LOW=SUART2_SBUF^0;//数据寄存器最低位-用于发送移位
uchar idata suart2_fifo[SUART2_FIFO_SIZE];//接收FIFO
uchar idata suart2_fifo_in=0;//写指针
uchar idata suart2_fifo_out=0;//读指针
//***********************************************************************************************************************
//函数作用:软串口起始位中断服务程序
//参数说明:无
//注意事项:
//返回说明:无
//***********************************************************************************************************************
static void suart2_isr(void) interrupt IRQ_EXTINT1 //using USE_EXTINT
{
EX1=0;//关INT1中断
TH0=suart2_th0_1_3;//设置到BIT宽度的1/3处
TL0=suart2_tl0_1_3;//设置到BIT宽度的1/3处
SUART2_RI=1;//送接收标志
TR0=1;//开Timer0
}
//***********************************************************************************************************************
//函数作用:定时器0中断服务程序
//参数说明:无
//注意事项:注意中断号码和优先级设置 使用R2寄存器
//返回说明:无
//***********************************************************************************************************************
static void timer0_isr(void) interrupt IRQ_TIMER0 //using USE_EXTINT
{
//装载初值
TL0=suart2_tl0;
TH0=suart2_th0;
//*******************数据接收*****************************
if(SUART2_RI)
{
if(SUART2_RI==1)//起始位
{
//起始位容错
if(SUART2_RXD)
{
SUART2_RI=0;//清数据位计数器
EX1=1;//开INT1中断 准备接收下一个字节
}
else
{
SUART2_RI++;
}
}
else if(SUART2_RI==10)//停止位
{
//停止位容错
if(SUART2_RXD)
{
//送FIFO缓冲区
suart2_fifo[suart2_fifo_in++]=SUART2_BUF;
if(suart2_fifo_in>=SUART2_FIFO_SIZE)suart2_fifo_in=0;
}
SUART2_RI=0;//清数据位计数器
EX1=1;//开INT1中断 准备接收下一个字节
}
else//数据位
{
SUART2_BUF>>=1;
SUART2_BUF_HIGH=SUART2_RXD;
SUART2_RI++;
}
}
//**********************数据发送***************************
if(SUART2_TI)
{
if(SUART2_TI==1)//起始位
{
SUART2_TXD=0;
SUART2_TI++;
}
else if(SUART2_TI==10)//停止位
{
SUART2_TXD=1;
SUART2_TI=0;//清数据位计数器
}
else//数据位
{
SUART2_TXD=SUART2_SBUF_LOW;
SUART2_SBUF>>=1;
SUART2_TI++;
}
}
//如果没有接收 也没有发送 关闭Timer0
if(!SUART2_RI && !SUART2_TI)TR0=0;//关Timer0
}
//***********************************************************************************************************************
//函数作用:清除串口缓存的数据
//参数说明:无
//注意事项:
//返回说明:无
//***********************************************************************************************************************
void suart2_flush(void)
{
suart2_fifo_in=suart2_fifo_out=0;
}
//***********************************************************************************************************************
//*函数作用:初始化
//*参数说明:
//*注意事项:
//*返回说明:无
//***********************************************************************************************************************
void suart2_init(uint baud)
{
ET0=0;//关中断
PT0=1;//高优先级
TMOD|=0x01;//timer0方式1---16位计数器
TR0=0;//关闭timer0
suart2_th0=(65536-((ulong)F_OSC)/baud/CLOCK_COUNT)>>8;//计算初始值
suart2_tl0=(65536-((ulong)F_OSC)/baud/CLOCK_COUNT)&0x00FF;//计算初始值
suart2_tl0+=30;//修正
suart2_th0_1_3=(65536-((ulong)F_OSC)/baud/CLOCK_COUNT/3)>>8;//计算下降沿1/3
suart2_tl0_1_3=(65536-((ulong)F_OSC)/baud/CLOCK_COUNT/3)&0x00FF;//计算下降沿1/3
ET0=1;//开中断
EX1=0;//关INT1中断
IT1=0;//低电平触发模式
PX1=1;//高优先级
suart2_flush();//清缓冲区
EX1=1;//开INT1中断
}
//***********************************************************************************************************************
//函数作用:查询软串口 如果有数据读取一个字节
//参数说明:ch---读取字符存放地址
//注意事项:
//返回说明:如果有数据返回1
//***********************************************************************************************************************
uchar suart2_read_char(uchar *ch)
{
if(suart2_fifo_out==suart2_fifo_in)return 0;
*ch=suart2_fifo[suart2_fifo_out];//得到当前要读取的字符
suart2_fifo_out++;//指向下一个要读取的字符
if(suart2_fifo_out==SUART2_FIFO_SIZE)suart2_fifo_out=0;//如果到了fifo末尾 则重从头开始
return 1;
}
//***********************************************************************************************************************
//函数作用:向串口发送一个字符
//参数说明:ch---要发送的字符
//注意事项:
//返回说明:无
//***********************************************************************************************************************
void suart2_write_char(uchar ch)
{
SUART2_SBUF=ch;//送发送数据
SUART2_TI=1;//送发送标志
TR0=1;//开Timer0
while(SUART2_TI);//如果TI说明还没有发送完毕---死等
}
//***********************************************************************************************************************
//函数作用:向串口发送字符串
//参数说明:str---要发送的字符串
//注意事项:
//返回说明:无
//***********************************************************************************************************************
void suart2_write_str(uchar *str)
{
while(*str)suart2_write_char(*str++);
}
//***********************************************************************************************************************
//函数作用:向串口发送缓冲区的数据
//参数说明:
//注意事项:
//返回说明:无
//***********************************************************************************************************************
//void suart2_write_buf(uchar *buffer, uint length)
//{
// while(length--)
// {
// suart2_write_char(*buffer++);
// }
//}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -