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

📄 usart1.c

📁 8051单片机串口驱动程序
💻 C
字号:
interrupt void Rx0Int(void)		//接收中断
{
	unsigned int t, i, ibuf, num;
	unsigned char ByteCom;
	EA = 0;
	R0EN =1;
	t=0;

	ReTrySoeTimes=0;
	CrcCheck=0;	
	//数据接收过程
	for(;;)
	{
		i=50;
		ibuf=10;
		while(!RI0)
		{
			FeedDog();
			ibuf--;
			if(ibuf==0)
			{
				i--;
				ibuf=10;
				if(i==0)
				{
					EA =1;
					if( t!=15)
					{
						if(ReTrySoeTimes>10)
						{
							return;
						}
					}
				}
			}
		}
		RI0=0;
		Rxd0.Data[t]=S0BUF;
		FeedDog();
		t++;
		//数据接收完毕后处理
		if( t==15)
		{	
			int i;
			//计算CRC校验
			for(i=0;i<14;i++)
			{
				CrcCheck=CheckCRC(CrcCheck,Rxd0.Data[i]);
			}
			if(CrcCheck==Rxd0.Data[14])	//接收正确
			{
				RxdMessage = 1;
				return;//	
			}
			else						//接收错误
			{
				if(ReTrySoeTimes>3)
				{
					RxdMessage = 0;
					return;
				}
				ReTrySoeTimes++;
				RxdMessage = 0;
				return;
			}
		}	
	}	
	return;
}


//接收完毕数据返回过程
void Ri0Process (int slave,int addr,int num,unsigned char buf[])
{
	int retval;
	unsigned char Rxdbuf[100];
	unsigned char Txdbuf[10];
	
	unsigned int i,j,len,RecLength;
	union
	{	unsigned int Word;
		unsigned char Byte[2];
	} CRC;
	Txdbuf[0]=(unsigned char)slave;
	Txdbuf[1]=01;
	Txdbuf[2]=(unsigned char)(((unsigned int)addr) >> 8);	//Addr(High)
	Txdbuf[3]=(unsigned char)(((unsigned int)addr) & 0xff);	//Addr(Low)
	Txdbuf[4]=(unsigned char)(((unsigned int)num) >> 8);	//Length_High
	Txdbuf[5]=(unsigned char)(((unsigned int)num) & 0xff);	//Length_Low
	CRC.Word=0xffff;	//Recived Data CRC Check,6bytes
	for(i=0;i<6;i++)
		CRC.Word = MBus_CRCGen(Txdbuf[i],CRC.Word);
	Txdbuf[6] = CRC.Byte[0];	//Produce Transmited Data CRC code
	Txdbuf[7] = CRC.Byte[1];

	if(num%8 == 0)
		len = num/8;		
	else
		len = num/8+1;
	RecLength = len+5; 
	SendProcess(Txbuf,8);		//调用发送过程函数,发送长度为8个字节
}

/****************************************/
/* 系统主程序                            */
/****************************************/
void main(void)
{
	EA=1;
	for(;;)
	{
		if(RxdMessage==1)
		{
			RxdMessage = 0;
			//----
			Ri0Process();
			//----
		}
	}
}

//触摸屏作为通信从站的通信程序
//触摸屏作为通信的从站时,单片机的通信流程应该是这样的:单片机的主程序每隔一段时间就会发送一个通信数据包给触摸屏,然后在串行口通信中断中接收触摸屏返回的数据,单片机将这些数据进行相应的处理。

void ReceDataProcess(unsigned char *RxBuf)
{
	//数据保存过程,略去。
}

interrupt void Rx0Int(void)		//接收中断
{
	unsigned int t, i, ibuf, num;
	unsigned char ByteCom;
	EA = 0;
	R0EN =1;
	t=0;

	ReTryTimes=0;
	CrcCheck=0;	
	//数据接收过程
	for(;;)
	{
		i=50;
		ibuf=10;
		while(!RI0)
		{
			FeedDog();
			ibuf--;
			if(ibuf==0)
			{
				i--;
				ibuf=10;
				if(i==0)
				{
					EA =1;
					if( t!=15)
					{
						if(ReTryTimes>10)
						{
							return;
						}
					}
				}
			}
		}
		RI0=0;
		Rxd0.Data[t]=S0BUF;
		FeedDog();
		t++;
		//数据接收完毕后处理
		if( t==15)
		{	
			int i;
			//计算CRC校验
			for(i=0;i<14;i++)
			{
				CrcCheck=CheckCRC(CrcCheck,Rxd0.Data[i]);
			}
			if(CrcCheck==Rxd0.Data[14])	//接收正确
			{
				ReceDataProcess(Rxd0.Data);
				return;//	
			}
			else						//接收错误
			{
				return;
			}
}	
       }	
	return;
}

/****************************************/
/* 系统主程序                            */
/****************************************/
main()
{
	//
	for(;;)
	{	
		wSendLength = SendDataPrepare(2,2,1, Sendbuf);
		SendDataProcess(wSendLength, Sendbuf);
		DelayTime(200);

	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -