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

📄 pmpdatat.c

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

#include "PMPDataT.h"

/* 延时t毫秒 */
void delay(uint t)
{
	uint i;
	while(t--)
	{
		/* 对于11.0592M时钟,约延时1ms */
		for (i=0;i<125;i++)
		{}
	}
} 

/* 发送数据函数 */
void senddata(uchar *buf)
{
	uchar i;
	uchar len;					// 保存数据长度
	uchar ecc;					// 保存校验字节

	len = strlen(buf);			// 计算要发送数据的长度
	ecc = len;					// 开始进行校验字节计算

	/* 发送数据长度 */
	TI = 0;
	TB8 = 0;					// 发送数据帧
	SBUF = len;					// 发送长度
	while(!TI);
	TI = 0;

	/* 发送数据 */
	for (i=0;i<len;i++)
	{
		ecc = ecc^(*buf);
		TB8 = 0;				// 发送数据帧
		SBUF = *buf;	
		buf++;
		while(!TI);
		TI = 0;
	}
	
	/* 发送校验字节 */
	TB8 = 0;					// 发送数据帧
	SBUF = ecc;
	while(!TI);
	TI = 0;
}

/* 串口初始化函数 */
void init_serial()
{
	TMOD = 0x20;				// 定时器T1使用工作方式2
	TH1 = 250;
	TL1 = 250;
	TR1 = 1;					// 开始计时
	PCON = 0x80;				// SMOD = 1
	SCON = 0xd0;				// 工作方式,9位数据位,波特率9600kbit/s,允许接收 
}

/* 主程序 */
void main()
{ 
	uchar i = 0;
	uchar tmp; 

	/* 为缓冲区赋初值 */
	P0 = 0xff;
	while(P1!=0)				// 每隔100ms从P0口读取,读取到0表示数据采集结束
	{
		*(buf+i) = P0;
		delay(100);				// 延时100ms
		P0 = 0xff;
		i++;
	}
	*(buf+i) = 0;				// 缓冲区最后一个字节为0表示数据结束

	/* 通过P0口读要访问的从机地址 */
	P0 = 0xff;
	addr = P0;

	init_serial();				// 串口初始化 

	EA = 0;						// 关闭所有中断
	
	/* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧 */
	tmp = addr-1;
	while(tmp!=addr)			
	{
		/* 发送从机地址 */
		TI = 0;
		TB8 = 1;				// 发送地址帧	
		SBUF = addr;
		while(!TI);
		TI = 0;

		/* 接收从机应答 */
		RI = 0;
		while(!RI);
		tmp = SBUF;
		RI = 0;	
	}

	/* 发送数据并接收校验信息,如果接收到SUCC,表示从机接收成功,否则将重新发送该组数据 */	
	tmp = ERR;
  	while(tmp!=SUCC)
    {
		senddata(buf);			// 发送数据
		RI = 0;
		while(!RI);
		tmp	= SBUF;
		RI = 0;
	}
}

⌨️ 快捷键说明

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