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

📄 scomm.c

📁 完全按照645协议编写的RS485通讯程序 (REG764单片机)
💻 C
字号:
#include "Config.h"
#include "I2C.h"
#include "Scomm.h"
#include "ZI.h"

bit IRcvStr(uchar sla,uchar suba,uchar *s,uchar no);
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
void Delay(uchar);

#define uchar unsigned char
#define uint  unsigned int

sbit CTRL485 = P1^7;

#define N  32
uchar idata Serial_buf[N];
#define AT24c04 0x08
uchar data Command_status1 = 0x00;

uchar Receive_Data()
{
	RI = 0;
	while(!RI)
	RI = 0;
	ACC = SBUF;
	if(P != RB8)
		{
			SP--;
			SP--;
			CY = 0;
			return CY;
		}
		return(ACC);
}

bit Receive_One(uchar *s)
{
	uchar CS = 0x00;
	uchar Serial_data;
	char i,j;
	RI = 0;
	Serial_data = SBUF;
	while(Serial_data != 0xfe)
	return 0;
	do 
	  Serial_data = Receive_Data();
	while(Serial_data == 0xfe);
	if(Serial_data != 0x68)
		return 0;
	CS += 0x68;
	for(i=0;i<=5;i++)
	{
		*(s+i) = Receive_Data();
		CS += *(s+i);
	}
	if(Receive_Data() != 0x68)
		return 0;
	CS += 0x68;
	CS +=(*(s+6) = Receive_Data());
	j = *(s+7)=Receive_Data();
	CS += j;
	for(i=0;i<=(j-1);i++)
	{
		CS += (*(s+i+8) = Receive_Data());
		*(s+i+8) -= 0x33;
	}
	if(CS != Receive_Data())
		return 0;
	if(Receive_Data() != 0x16)
		return 0;
	REN = 0;
	return 1;
}

void RXD_Int(void) interrupt 4
{
	CY = Receive_One(Serial_buf);
	if(CY)
		Command_status1 |= 0x04;	
}

void Send_Data(uchar Serial_data)
{
	ACC = Serial_data;
	TB8 = P;
	TI = 0;
	SBUF = Serial_data;
	while(!TI)
	TI = 0;
}

void TXD_Int(uchar *s)
{
	uchar CS = 0x68;
	char i,j;
	
	CTRL485 = 0;
	Delay(1);
	TI = 0;
	Send_Data(0xfe);
	Send_Data(0xfe);
	Send_Data(0x68);
	for(i=0;i<=5;i++)
	{
		CS += *(s+i);
		Send_Data(*(s+i));
	}
	CS += 0x68;
	Send_Data(0x68);
	CS += *(s+6);
	Send_Data(*(s+6));
	CS += *(s+7);
	j = *(s+7);
	Send_Data(j);
	for(i=0;i<=j-1;i++)
	{
		(*(s+i+8)) += 0x33;
		Send_Data(*(s+i+8));
		CS +=	(*(s+i+8));
	}
	Send_Data(CS);
	Send_Data(0x16);
	RI = 0;
	TI = 0;
	Delay(1);
	CTRL485 = 1;
}

uchar Serial_Addr(uchar *s1)
{
	uchar i,a[6];
	IRcvStr(AT24c04,0x00,a,6);
	for(i=0;i<=5;i++)
	{
		if(*(s1+i) != 0x99)
			break;
		if(i == 5)
			return(0x02);
	}
	for(i=0;i<=5;i++)
	{
		if(*(s1+i) != a[i])
			return(0x00);
	}
	return(0x01);
}


bit Serial_Password(uchar *s)
{
	uchar i,a[4];
	IRcvStr(AT24c04,0x06,a,4);
	for(i=0;i<=3;i++)
	{
		if(*(s+i) != a[i])
			return 0;
	}
	return 1;
}

bit Serial_Command_Run(uchar *s)
{
	switch(Serial_Addr(s))
  {
  	case 0x02:
  		break;
  	case 0x01:
  		switch(*(s+6))
  		{
  			case 0x0f:
  			  if(~Serial_Password(s+8))
  				  return 0;
  			
  			  ISendStr(AT24c04,0x06,s+12,4);
  			  Delay(5);
  			  IRcvStr(AT24c04,0x00,s,6);				
		      IRcvStr(AT24c04,0x06,s+8,4);
		      (*(s+6)) |= 0x80;
		      (*(s+7)) = 0x04;
		      TXD_Int(s);
		      break;
		    case 0x01:
		    	break;
		    case 0x04:
		    	break;
		    default:
		    	break;
		    }
		    break;
		  case 0x00:
		  	return 0;
		  	break;
		  }
		  return 1;
}


void Serial_Command()
{
 	if(Command_status1 & 0x04)
		{
			if(~Serial_Command_Run(Serial_buf))
			{
				REN = 1;
				Command_status1 &= 0xfb;
				return;
			}
			REN = 1;
			Command_status1 &= 0xfb;
		}
}


⌨️ 快捷键说明

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