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

📄 ppdatar.c

📁 51单片机C语言应用程序设计实例精讲.rar
💻 C
字号:
/*****************************************/
/* Copyright (c) 2005, 通信工程学院      */
/* All rights reserved.                  */
/* 作    者:戴 佳						 */
/*****************************************/

#include "PPDataR.h"

/* 发送数据函数 */
uchar recvdata(uchar *buf)
{
	uchar i,tmp;
	uchar len;					// 保存数据长度
	uchar ecc;					// 保存校验字节
	
	/* 接收数据长度字节 */
	RI = 0;
	while(!RI);
	len = SBUF;
	RI = 0;
	
	/* 使用len的值为校验字节ecc赋初值 */
	ecc = len;					

	/* 接收数据 */
	for (i=0;i<len;i++)
	{
		while(!RI);
		*buf = SBUF;	
		ecc = ecc^(*buf);		// 进行字节校验
		RI = 0;	
		buf++;		
	}
	*buf = 0;					// 表示数据结束
	
	/* 接收校验字节 */
	while(!RI);
	tmp = SBUF;
	RI = 0;

	/* 进行数据校验 */
	ecc = tmp^ecc;
	if (ecc!=0)					// 如果校验错误
	{
		*(buf-len) = 0;			// 清空数据缓冲区
		
		/* 发送校验错误信号ERR */
		TI = 0;	
		SBUF = ERR;
		while(!TI);
		TI = 0;

		return 0xff;			// 返回0xff表示校验错误
	}

	/* 发送校验成功信号SUCC */
	TI = 0;
	SBUF = SUCC;
	while(!TI);
	TI = 0;

	return 0;					// 校验成功,返回0
}

void init_serial()
{
	TMOD = 0x20;				// 定时器T1使用工作方式2
	TH1 = 250;
	TL1 = 250;
	TR1 = 1;					// 开始计时
	PCON = 0x80;				// SMOD = 1
	SCON = 0x50;				// 工作方式1,波特率9600kbit/s,允许接收 
}

/* 主程序 */
void main()
{ 
	uchar tmp = 0;
	/* 串口初始化 */
	init_serial();

	EA = 0;					// 关闭所有中断

	while(1)
	{
		/* 如果接收到的数据不是CALL,则继续等待 */
		while (tmp!=CALL)
		{
			RI = 0;
			while(!RI)
			tmp = SBUF;
			RI = 0;
		}
	
		/* 检测P0口判断当前是否工作忙,若P0=0xBB,则为忙状态 */
		P0 = 0xff;
		tmp = P0;
		if(tmp==0xBB)		// 如果P0口为0xBB,发送BUSY信号
		{
			TI = 0;
			SBUF = BUSY;
			while(!TI);
			TI = 0;
			continue;
		}

		/* 否则发送OK信号,表示从机可以接收数据 */
		TI = 0;				
		SBUF = OK;
		while(!TI);
		TI = 0;

		/* 数据接收 */
		tmp = 0xff;
		while(tmp==0xff)
		{
			tmp = recvdata(buf);	// 校验失败返回0xff,接收成功返回0
		}
	}
}

⌨️ 快捷键说明

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