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

📄 zlg500s_comm.c

📁 内部包含多个文件:main.c,config.c,zlg500s.h zlg500s.c等。对于zlg500s开发板的使用
💻 C
字号:
#define ZLG500S_COMM_GLOBALS
#include "config.h"
#include "Zlg500S.h"
#include "zlg500S_comm.h"


INT8U SetBaud()
{
	INT8U temp;
	INT8U SetCunt = 3;

	while(SetCunt)
	{
		SBUF = STX;
		while(TI == 0);	TI = 0;
		for(temp=15;temp>0;temp--);	//延时30us
		SBUF = STX;
		while(TI == 0);	TI = 0;

		WaitRespDly = ZLG500S_DELAY_10ms;
		while(RI == 0 && WaitRespDly);	
		RI = 0;
		if(WaitRespDly == 0)
		{
			SetCunt--;
			continue;
		}
		else
		{
			temp = SBUF;
			if(temp == ACK)
				return TRUE;
			else
			{
				SetCunt--;
				continue;
			}
		}
	}
	return FALSE;

	}

void ZLG500S_COMM_Init()
{
	PCON = 0x80;              	// SMOD = 1;
	SCON = 0x50;              	// Mode 1, 8-bit UART, enable receiption
	TMOD = 0x21;	      		// Timer 1, mode 2, 8-bit auto reload,
	
	TH1=BAUDRATE;
	TL1=BAUDRATE;
	TR1 = 1;	
	
    SerDTvalid = FALSE;
    
	SetBaud();	

    ES = 1;
}

void UART_Isr() interrupt 4 using 1
{
    if(RI)
    {
		RI = 0;
		SerBfr[SerBfrIdx] = SBUF;
		if(SerBfrIdx == FRAMELEN)
		{
			if(SerBfr[FRAMELEN] < PRTCLEN || SerBfr[FRAMELEN] > MAXSERSIZE)
			{
				return;
			}
		}
		SerBfrIdx++;

		if(SerBfrIdx >= SerBfr[FRAMELEN])
		{
			SerDTvalid = TRUE;
			SerBfrIdx = FRAMELEN;
		}
	}
	else
    {
        TI = 0;
		if(SerBfrIdx < SerBfr[FRAMELEN])
		{
			SBUF = SerBfr[SerBfrIdx];
			SerBfrIdx++;
		}
		else
		{
			SerBfrIdx = FRAMELEN;
			REN = 1;		//发送响应完毕,重新使能接收
		}
    }
}

INT8U Ser_Rcv()
{
	INT8U i,BCC;
	INT8U Status = FALSE;

	if(SerDTvalid)
	{									//已接收一帧数据,进行数据校验
		if(SerBfr[SerBfr[FRAMELEN]-1] == ETX && SerBfr[FRAMELEN] == (SerBfr[LENGTH]+PRTCLEN))
		{			//正确接收到ETX,及帧长度等于数据长度加协议长度,则数据有效
			BCC = 0;
			for(i=0; i<(SerBfr[FRAMELEN]-1); i++)
			{
				BCC ^= SerBfr[i];
			}
			if(BCC == 0xff)
				Status = TRUE;	//BCC校验通过
		}
		SerDTvalid = FALSE;
	}
	return Status;
}

INT8U Ser_Send()
{
    INT8U i,BCC;

	SerBfr[FRAMELEN] = SerBfr[LENGTH]+PRTCLEN;	//帧长度等于数据长度加协议长度
	BCC = 0;
	for(i=0; i<(SerBfr[FRAMELEN]-2); i++)
		BCC ^= SerBfr[i];
	SerBfr[SerBfr[FRAMELEN]-2] = ~BCC;
	SerBfr[SerBfr[FRAMELEN]-1] = ETX;
	
	SerBfrIdx = FRAMELEN;
	TI = 1;

	return TRUE;
}

⌨️ 快捷键说明

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