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

📄 pc与51的快速串行通信.c

📁 pc与51单片机的快速串行通信程序。开发环境KeilC
💻 C
字号:
/********************************************************************
* file name:	define.h
* writer:  		李慧(LH)
* created: 		2008-04-12
* last changed:	2008-05-22
* compiler:		KeilC51 7.01
* descreption:	单片机接收PC机发送的数据帧子程序
* resource:	T0,T1
*********************************************************************/

/*起始帧0x68
m_frameStatus 0x00接收		
			  0x01地址m_addrCode	
			  0x02控制码m_controlCode 
			  0x03数据长度m_dataLen
			  0x04数据m_dataBuffer[]		
			  0x05校验码 m_sysCheckData	
			  0x06帧结束m_frameEnd

			  m_dataFieldCount//串口接收数据信息计数器

b_validFrame=0;//置数据帧无效标志
				
*/

#include <reg51.h>

/*****************************************************************************************
* 函数名:	systeminitial
* 功能描述:系统初始化,初始化定时器1T1、串口、系统中断
* 创建时间:2008-05-12
* 修改时间:2008-05-22
******************************************************************************************/
void systeminitial(void) 					
{
	TMOD=0x21; 		//T1工作在方式2,T0工作在方式0
	PCON=0x00;		//设置波特率参数:单倍频,数据传输速率选择
	SCON=0x58;		//串口工作方式1选择,并打开接收允许
	ES=1;			//允许串行中断
	PS=1;			//设置串口中断优先级为高	
	TH1=0x0E8;		//系统选用11.0592Mhz晶振
	TL1=0x0E8;						
	TR1=1;			//启动定时器T1
	EA=1;			//打开总中断
}


bit b_validFrame;
unsigned char m_frameStatus;
unsigned char m_sysCheckData;//自己计算的校验数字
unsigned char m_controlCode;
unsigned char m_addrCode;
unsigned char m_dataLen;
unsigned char m_dataFieldCount;
unsigned char m_checkData;//接收来的校验数字
unsigned char m_frameEnd;
unsigned char m_dataBuffer[];

//};

//68H Address Control DataLen Datal Data2...DataN SumCheck 16??
/*****************************************************************************************
* 函数名:	corn_isp
* 功能描述:串口中断服务子程序
* 创建时间:2008-05-12
* 修改时间:2008-05-22
******************************************************************************************/
void corn_isp(void) interrupt 4 using 3
{
if(RI)								
{
	RI=0;							
	if(b_validFrame)//上一个数据帧未处理完
	{
		return;//放弃对当前数据帧的接收
	}								
	if(m_frameStatus==0x00)					//****串口接收中断处于接收帧起始字节阶段
	{
		if(SBUF!=0x68)//不是有效的帧起始字节
		{
			m_frameStatus=0x00;//串口接收中断状态标志不更新
		}
		else
		{
			m_frameStatus=0x01;//串口接收中断状态标志更新为接收					
		}
	}
	else if(m_frameStatus==0x01)			//****串口接收中断处于接收数据帧地址码阶段
	{
		m_addrCode=SBUF;//保存地址
		m_frameStatus=0x02;//串口接收中断状态标志更新为控制码阶段					
		m_sysCheckData=0x00;//准备进行数据和校验				
	}
	else if(m_frameStatus==0x02)			//****串口接收中断处于接收控制码阶段			
	{
		m_controlCode=SBUF;//保存控制码
		m_frameStatus=0x03;//串口接收中断状态标志更新为接收数据长度					
		m_sysCheckData+=m_controlCode;//更新校验和		
	}
	else if(m_frameStatus==0x03)			//****串口接收中断处于接收数据长度信息阶段			
	{
		m_dataLen=SBUF;					
		m_frameStatus=0x04;//接收数据
		m_sysCheckData+=m_dataLen;			
		m_dataFieldCount=0x00;//串口接收数据信息计数器清零
	}
	else if(m_frameStatus==0x04)			//****串口处于接收数据信息阶段
	{
		m_dataBuffer[m_dataFieldCount]=SBUF;
		m_sysCheckData+=m_dataBuffer[m_dataFieldCount];
		m_dataFieldCount++;					
		if(m_dataFieldCount==m_dataLen)	
		{
			m_frameStatus=0x05;//数据信息接收结束,更新状态					
		}
	}
	else if(m_frameStatus==0x05)			//****串口处于接收校验码阶段			
	{
		m_checkData=SBUF;					
		if(m_sysCheckData != m_checkData)		
		{
			m_frameStatus=0x00;//复位状态标志
		}
		else								
		{
			m_frameStatus=0x06;//更新状态标志为接收结束码					
		}
	}
	else if(m_frameStatus==0x06)			//****串口接收中断处于接收结束码阶段			
	{
		m_frameEnd=SBUF;//保存结束码					
		if(m_frameEnd!=0x16)//错误的帧结束标志				
		{
			b_validFrame=0;//置数据帧无效标志
		}
		else								
		{
			b_validFrame=1;//一个数据帧接收完毕						  
		}								
		m_frameStatus=0x00;//复位状标志,准备接收下一帧数据					
	}
}
}

void main(void)
{
	systeminitial();
}

⌨️ 快捷键说明

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