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

📄 chuankou.c

📁 单片机数据通讯典型应用(光盘内容)
💻 C
字号:
#include<reg51.h>
#define rxMax 15   	//串口接收缓冲区大小
#define txMax 15  	//串口发送缓冲区大小
unsigned char rxBuf[rxMax + 1];		//定义串口通信接收缓冲区
unsigned char txBuf[txMax + 1];		//定义串口通信发送缓冲区	
unsigned char rxHead;	//串口接收缓冲区的头部
unsigned char rxTail;	//串口接收缓冲区的尾部
unsigned char txHead;	//串口发送缓冲区的头部
unsigned char txTail;	//串口发送缓冲区的尾部
unsigned char tempData;	//数据的临时变量

/**************************串口通信初始设定**************************/
void InitSerialcom( void )
{
	SCON = 0xD0 ;	//UART为模式3,9位数据,第9位用于奇偶校验,允许接收
	TMOD |= 0x20 ; 	//定时器1为模式2,8位自动重装
	PCON &= 0x7F ; 	//SMOD=0; 
	TH1 = 0xE8 ;   	//11.0592MHZ晶振下串口波特率为1200bps
	IE |= 0x90 ;	//使能串口中断
	TR1 = 1 ;		//启动定时器1
	TI=1; 
	//初始化串口接收和发送缓冲区
	rxHead = 0;
	rxTail = 0;
	txHead = 0;
	txTail = 0;
}
/************************串口中断服务函数****************************/
void serial () interrupt 4 using 3

{
	if ( RI )   
	{	
		RI = 0;
		tempData = SBUF;	//将数据放入C51寄存器A时,计算数据中1的个数,
		ACC = tempData;		//如果个数为偶数,则P=0,否则P=1,用于奇偶校验
		if( TB8 == P )	//对数据进行偶校验
		{
			rxBuf[rxHead] = tempData;
			if ( rxHead == rxMax )
			{
				rxHead = 0;
			}
			else
			{
				rxHead++;
			}
		}
		else	
		{
			//如果校验错误,要求重传
		}
	}
	else if ( TI )
	{  
		TI = 0;
		if( txTail != txHead )	//如果缓冲区有数据则发送数据
		{	
			ACC = txBuf[txTail];	//数据放入寄存器A,计算数据的偶校验,
			TB8 = P;		  		//将偶校验结果放入串口发送的第9位数据位
			SBUF = txBuf[txTail];
		}
		if( txTail == txMax )
		{
			txTail = 0;
		}
		else
		{
			txTail ++;
		}	
	}
}
/****************从串口缓冲区中读取数据,返回读取数据的个数**************/
unsigned char SerialcomRead( unsigned char *buf, unsigned char len )
{
	unsigned char cnt = 0;
	//当缓冲区中有数据时,开始读<=len个数的数据
	while ( ( rxTail != rxHead ) && ( cnt < len ) )
	{
		*buf ++ = rxBuf[rxTail];
		if( rxTail == rxMax )
		{
			rxTail = 0;
		}
		else
		{
			rxTail ++;
		}
		cnt ++;
	}
	return cnt;
}

/************向串口发送缓冲区中写入数据,使串口发送数据**************/
unsigned char SerialcomWrite( unsigned char *buf, unsigned char len )
{
	unsigned char cnt;
	//计算发送缓冲区中可用容量
	if( txHead > txTail )
	{
	 	cnt = txMax - txHead + txTail + 1;
	}
	else
	{
		cnt = txTail - txHead;
	}
	//如果有足够的缓冲区空间,则将数据写入缓冲区
	if( cnt >= len )
	{
		for ( cnt = len; cnt; cnt -- )
		{
			txBuf[txHead] = *buf++;
			if( txHead == txMax )
			{
				txHead = 0;
			}
			else
			{
				txHead ++;
			}
		}
		SBUF = txBuf[txTail];
		return len;
	}
	else
		return cnt;	
}

⌨️ 快捷键说明

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