📄 suart1.c
字号:
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&软串口1驱动&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//*文件名称:suart1.c
//*文件作用:串口驱动
//*文件作者:翟 鹏
//*创建日期:2004年5月
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
#include <include.h>
uchar idata suart1_th2=0;
uchar idata suart1_tl2=0;
uchar idata suart1_th2_1_3=0;//设置到BIT宽度的1/3处
uchar idata suart1_tl2_1_3=0;//设置到BIT宽度的1/3处
uchar idata SUART1_RI=0;//接收数据位计数器
uchar bdata SUART1_BUF=0;//数据寄存器
sbit SUART1_BUF_HIGH=SUART1_BUF^7;//数据寄存器最高位-用于接收移位
uchar idata SUART1_TI=0;//发送数据位计数器
uchar bdata SUART1_SBUF=0;//数据寄存器
sbit SUART1_SBUF_LOW=SUART1_SBUF^0;//数据寄存器最低位-用于发送移位
uchar idata suart1_fifo[SUART1_FIFO_SIZE];//接收FIFO
uchar idata suart1_fifo_in=0;//写指针
uchar idata suart1_fifo_out=0;//读指针
//***********************************************************************************************************************
//函数作用:软串口起始位中断服务程序
//参数说明:无
//注意事项:
//返回说明:无
//***********************************************************************************************************************
static void suart1_isr(void) interrupt IRQ_EXTINT0 //using USE_EXTINT
{
EX0=0;//关INT0中断
TH2=suart1_th2_1_3;//设置到BIT宽度的1/3处
TL2=suart1_tl2_1_3;//设置到BIT宽度的1/3处
SUART1_RI=1;//送接收标志
TR2=1;//开Timer2
}
//***********************************************************************************************************************
//函数作用:定时器2中断服务程序
//参数说明:无
//注意事项:注意中断号码和优先级设置 使用R2寄存器
//返回说明:无
//***********************************************************************************************************************
static void timer2_isr(void) interrupt IRQ_TIMER2 //using USE_EXTINT
{
TF2=0;//清中断
//*******************数据接收*****************************
if(SUART1_RI)
{
if(SUART1_RI==1)//起始位
{
//起始位容错
if(SUART1_RXD)
{
SUART1_RI=0;//清数据位计数器
EX0=1;//开INT0中断 准备接收下一个字节
}
else
{
SUART1_RI++;
}
}
else if(SUART1_RI==10)//停止位
{
//停止位容错
if(SUART1_RXD)
{
//送FIFO缓冲区
suart1_fifo[suart1_fifo_in++]=SUART1_BUF;
if(suart1_fifo_in>=SUART1_FIFO_SIZE)suart1_fifo_in=0;
}
SUART1_RI=0;//清数据位计数器
EX0=1;//开INT0中断 准备接收下一个字节
}
else//数据位
{
SUART1_BUF>>=1;
SUART1_BUF_HIGH=SUART1_RXD;
SUART1_RI++;
}
}
//**********************数据发送***************************
if(SUART1_TI)
{
if(SUART1_TI==1)//起始位
{
SUART1_TXD=0;
SUART1_TI++;
}
else if(SUART1_TI==10)//停止位
{
SUART1_TXD=1;
SUART1_TI=0;//清数据位计数器
}
else//数据位
{
SUART1_TXD=SUART1_SBUF_LOW;
SUART1_SBUF>>=1;
SUART1_TI++;
}
}
//如果没有接收 也没有发送 关闭Timer2
if(!SUART1_RI && !SUART1_TI)TR2=0;//关Timer2
}
//***********************************************************************************************************************
//函数作用:清除串口缓存的数据
//参数说明:无
//注意事项:
//返回说明:无
//***********************************************************************************************************************
void suart1_flush(void)
{
suart1_fifo_in=suart1_fifo_out=0;
}
//***********************************************************************************************************************
//*函数作用:初始化
//*参数说明:
//*注意事项:
//*返回说明:无
//***********************************************************************************************************************
void suart1_init(uint baud)
{
ET2=0;//关中断
PT2=1;//高优先级
TR2=0;//关闭timer2
TH2=(65536-((ulong)F_OSC)/baud/CLOCK_COUNT)>>8;//计算初始值
TL2=(65536-((ulong)F_OSC)/baud/CLOCK_COUNT)&0x00FF;//计算初始值
RCAP2H=(65536-((ulong)F_OSC)/baud/CLOCK_COUNT)>>8;//计算初始值
RCAP2L=(65536-((ulong)F_OSC)/baud/CLOCK_COUNT)&0x00FF;//计算初始值
suart1_th2_1_3=(65536-((ulong)F_OSC)/baud/CLOCK_COUNT/3)>>8;//计算下降沿1/3
suart1_tl2_1_3=(65536-((ulong)F_OSC)/baud/CLOCK_COUNT/3)&0x00FF;//计算下降沿1/3
ET2=1;//开中断
EX0=0;//关INT0中断
IT0=0;//低电平触发模式
PX0=1;//高优先级
suart1_flush();//清缓冲区
EX0=1;//开INT0中断
}
//***********************************************************************************************************************
//函数作用:查询软串口 如果有数据读取一个字节
//参数说明:ch---读取字符存放地址
//注意事项:
//返回说明:如果有数据返回1
//***********************************************************************************************************************
uchar suart1_read_char(uchar *ch)
{
if(suart1_fifo_out==suart1_fifo_in)return 0;
*ch=suart1_fifo[suart1_fifo_out];//得到当前要读取的字符
suart1_fifo_out++;//指向下一个要读取的字符
if(suart1_fifo_out==SUART1_FIFO_SIZE)suart1_fifo_out=0;//如果到了fifo末尾 则重从头开始
return 1;
}
//***********************************************************************************************************************
//函数作用:向串口发送一个字符
//参数说明:ch---要发送的字符
//注意事项:
//返回说明:无
//***********************************************************************************************************************
void suart1_write_char(uchar ch)
{
SUART1_SBUF=ch;//送发送数据
SUART1_TI=1;//送发送标志
TR2=1;//开Timer2
while(SUART1_TI);//如果TI说明还没有发送完毕---死等
}
//***********************************************************************************************************************
//函数作用:向串口发送字符串
//参数说明:str---要发送的字符串
//注意事项:
//返回说明:无
//***********************************************************************************************************************
void suart1_write_str(uchar *str)
{
while(*str)suart1_write_char(*str++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -