⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 suart2.c

📁 基于STC51通过GPS自主定位导航FAT文件系统程序
💻 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 + -