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

📄 comu485.c

📁 单片机的多级通讯程序 包含有keil源程序 和proteus的仿真程序
💻 C
字号:

#include "reg52.H"
#include "Typedef.H"
#include "UserDef.H"
#include "Comu485.H"

#define BAUD	1200		
#define T_Baud8_0	(256 - F_OSC/BAUD/12/32)	//SMOD=0
#define T_Baud8_1	(256 - F_OSC/BAUD/12/16)	//SMOD=1

/*
	通讯协议:
	BoF + 地址 + 数据(变长)+ EoF ; 支持ESC换码

	因为本范例中数据及地址由主机的键盘输入,因此,只能产生‘0’~‘9’有限数字。
	
*/

/*  */
#define CC_BOF '1'
#define CC_EOF '2'
#define CC_ESC '3'

/*  全局变量 */
INT8U comu_recv_len = 0;
INT8U idata Rxbuf[32];
static INT8U iRx=0;
static INT8U idata Txbuf[32];
static INT8U iTx=0;
static INT8U myaddr;

sbit P_Tx = P3^2;	/* RS485芯片的发送/接收工作状态控制 */

/***************************************

	串口初始化
	入口参数:
	返回值:

****************************************/
void comu_init(INT8U addr)
	{
	/* 串口通讯相关定时器设置  */
	TMOD &= 0x0F;						//定时器1 :自动再装入8位定时器
	TMOD |= 0x20;						
	TH1 = T_Baud8_0;TL1=T_Baud8_0;		//波特率

	/* 串口配置  */
	SCON = 0x50;						//方式1,SM2=0,8Bits,REN=1
	PCON = 0x00;						//SMOD=0
//	PCON = 0x80;						//SMOD=1

	myaddr = addr;
	P_Tx = 0;

	ES = TRUE;							//串口中断允许
	TR1 = TRUE;							//启动波特率定时器
	}


/* 对发送内容进行格式化,加上BoF,EoF,以及在需要时换码,并发送头一个字符,以启动发送序列 */
void comu485_send_packet(INT8U * send_data,INT8U len)
{
	INT8U c,i;

	Txbuf[0] = CC_BOF;
	i = 1;
	while (len!=0)
	{
		c = *send_data;		
		if ((c==CC_BOF) || (c==CC_EOF) || (c==CC_ESC))
		{
			Txbuf[i] = CC_ESC;
			i ++;
			Txbuf[i] = ~c;
			i ++;	
		}
		else
		{
			Txbuf[i] = c;
			i ++;	
		}
 		
		send_data ++;
		len --;
	}		
	Txbuf[i] = CC_EOF;

	P_Tx = 1;
	iTx = 0;
	SBUF = CC_BOF;
}

/* 对接收到的内容进行处理,去除可能存在的换码,返回接收到的字节数 */
INT8U comu485_recv_packet(INT8U len)
{
	INT8U i,n;

	i = 0;
	n = 0;

	while (i<len)
	{
		if (Rxbuf[i] == CC_ESC)
		{
			i ++;
			Rxbuf[n] = ~Rxbuf[i];
		}
		else
		{
			Rxbuf[n] = Rxbuf[i];
		}
		n ++;
		i ++;
	}

	return n;
}

//-------------------------------------
//       串口中断
//-------------------------------------
void int_comu(void) interrupt 4 using 2
{
	INT8U c;

	/* 发送中断  */
	if (TI)
	{
		TI = FALSE;
		if (Txbuf[iTx] == CC_EOF)
		{
			P_Tx = 0;
		}
		else
		{
			iTx ++;
			SBUF = Txbuf[iTx];
		}
	}

	/* 接收中断  */
	if (RI)
	{
		RI = FALSE;
		c = SBUF;
		if (c == CC_BOF)
		{
			iRx = 0;
		}
		else if (c == CC_EOF)
		{
			comu_recv_len = comu485_recv_packet(iRx);	
			if (Rxbuf[0] != myaddr)
			{
				comu_recv_len = 0;
			}
		}
		else
		{
			Rxbuf[iRx] = c;
			iRx ++;
		}
	}
}

⌨️ 快捷键说明

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