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

📄 rs-232.c.txt

📁 单片机数据通讯典型应用(光盘内容)
💻 TXT
字号:
#include <reg51.h>
#include <string.h>
#define uchar unsigned char
#define uint unsigned int
#define BUF_LEN 16   	 		// 接收缓冲区长度
void init_UART();				// 串口初始化
void send_char(uchar ch);  		// 发送一个字符
uchar rec_data(uchar *buf); 	// 接收一帧数据
void delay(uint time);       	// 延时函数
uchar inbuf[BUF_LEN];    		// 接收缓冲区
sbit P16 = P1^6;				// 绿灯指示
sbit P17 = P1^7;				// 红灯指示
void main()
{ 
	uchar i = 0;
	uchar self_add;				// 本机地址
	uchar rec_char;				// 接收字符
uchar return_flag;         	// 接收数据返回标志
	self_add = P1;				// 获取本机地址
	P16 = 1;					// 上电初始化,绿灯灭
	P17 = 1;					// 上电初始化,红灯灭
	init_UART();				// 串口初始化 
	while(1)
	{
		while (rec_char!= self_add)  // 等待本机地址
		{
			RI = 0;
			while(!RI)
			rec_char = SBUF;
			RI = 0;
		}	
			RI = 0;
while(!RI)
			rec_char = SBUF;  		// 检测下一个字符是否是0xAA?
			RI = 0;
		if(rec_char==0xAA)    		// 若是,则准备接收数据,否则返回等待地址
		{
send_char(0xBB); 		// 给主机发送允许接收标志0xBB
			
			/****************接收数据*****************/
			return_flag = rec_data (buf);	    	// 检查返回标志
			if (return_flag==0xFF)				// 校验正确
			{
				P16 = 0;						// 数据接收成功,绿灯亮1s
				delay(1000);
				P16 = 1;	
			}
			else if(return_flag==0x00)			// 校验错误
			{
				P17 = 0;						// 数据接收错误,红灯亮1s
				delay(1000);
				P17 = 1;	
			}
		}    
	}
}
/*************************延时子程序*******************************/
void delay(uint time)
{
	uint i;
	while(time --)
	{
		for (i=0;i<125;i++)
		{}
	}
} 
/*************************串口初始化*******************************/
void init_UART()
{ 
     TMOD=0x20;             			// T1,方式2,8位自动重装
     TL1=0xFD;              
     TH1=0xFD;
     SCON=0x50;             			// 串口工作于方式1,10位异步
     PCON=0x00;             			// 晶振11.0592MHz,9600bit/s
}
/************************发送一个字符******************************/
void send_char(uchar ch)
{
	SBUF=ch;
	while(TI==0);
	TI=0;
}
/************************接收一帧数据******************************/
uchar rec_data(uchar *buf)
{
	uchar i,erc;							// erc为主机发送的校验字节
	uchar data_len;							// 数据长度字节
	uchar data_erc;			   				// 接收数据校验字节
	/***********第一个字节为数据长度************/
	RI = 0;
	while(!RI);
	data_len = SBUF;
	RI = 0;
	data_erc = data_len;					//从数据长度字节开始校验
	/***********此后的字节为有效数据************/
	for (i=0;i< data_len;i++)
	{
		while(!RI);
		*buf = SBUF;	
		data_erc = data_erc ^(*buf);		//将每个字节进行异或校验
		RI = 0;	
		buf++;		
	}
	while(!RI);
	erc = SBUF;								// 接收校验字节
	RI = 0;
	data_erc = erc^ data_erc;				// 进行数据校验
	if (data_erc!=0)						// 如果校验错误
	{
		*(buf- data_len) = 0;				// 数据缓冲区清空
		send_char(0x00);					// 通知主机校验错误
		return 0x00;						// 校验错误返回码0x00
	}
	else
{
send_char(0xFF);							// 通知主机校验正确
		return 0xFF;						// 校验正确返回码0xFF
	}
}

⌨️ 快捷键说明

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