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

📄 main.c

📁 AT89C51串行口通信设计C程序_定长协议
💻 C
字号:
// Remote Host Control program
// 2007.8.1 by Ericosn

#include <REG51.h>
#define uchar unsigned char
#define uint  unsigned int
#define DevAddr 0x00			//1号设备为0x00,2号设备为0x01

uchar idata Buffer[6];
uint  idata Timer[16];
uint  PortFlag;
uchar rlength;
uchar PF;

sbit  P15 = P1^5;
sbit  P17 = P1^7;
sbit  P07 = P0^7;
bit   RcvFlag = 0;
uchar HandonFlag = 0;
uchar HandonTimer = 0;

void init(void);
void Delay(uint);
void ProcMsg(void);

void main(void)
{
	uchar i;

	init();
	for(i=0;i<16;i++)
		Timer[i] = 0;
	while(1){
	  if(RcvFlag==1){
	   	 ProcMsg();
	  	 RcvFlag = 0;
	  	 ES = 1;
	  }
	  if (HandonFlag==1){
	  	 HandonFlag = 2;
		 P0 = 0x00;
		 P2 = 0x00;
		 Delay(100);
		 P0 = 0xFF;
		 P2 = 0xFF;
	  }
	}
}

///////////////////////////////////////////////////////////////
void init(void)
{
	rlength = 0;
	PF = 0;
	RcvFlag = 0;
	PortFlag = 0;

	P0 = 0xFF;
	P2 = 0xFF;
	TMOD = 0x21;
	TH1 = 0xFD;
	TL1 = 0xFD;
	TH0 = 0xDC;
	TL0 = 0x00;                   
	SCON = 0x50;
	IE |= 0x92;
	IP |= 0x10;
	TR0 = 1;
	TR1 = 1;
	P17 = 0;
}

///////////////////////////////////////////////////////////////
void ProcMsg(void)
{
 	uchar i,temp;
	uint  j;
	uchar comid;
	uchar TNum1 = Buffer[2];
	uchar TNum2 = Buffer[3];
	
	for(i=0,temp=0;i<8;i++)
	  temp += (((TNum2>>i)&0x01)<<(7-i));
	TNum2 = temp;
	TNum1=(uchar)((~PortFlag)&TNum1);                  //Mask the inefficent command
	TNum2=(uchar)(((~PortFlag)>>8)&TNum2);             //Mask the inefficent command
	comid = ((Buffer[1]<<2)>>6);
	switch(comid){
	   case 1:
	   		P0 = ~TNum1;
			P2 = ~TNum2;
			Delay(100);
			P0 = 0xFF;
			P2 = 0xFF;
			break;
	   case 2:   
			//the shutdown processing code
			break;
	   default: 
	    	break;
	}
	j = 1;
	for(i=0;i<8;i++){
	   if(((TNum1>>i)&0x01)==1){
	   	   PortFlag |= (j<<i);
		   Timer[i] = 500;
	   }
	}
	for(i=0;i<8;i++){
	   if(((TNum2>>i)&0x01)==1){
	       i += 8;
	   	   PortFlag |= (j<<i);
		   Timer[i] = 500;
		   i -= 8;
	   }
	}
}

///////////////////////////////////////////////////////////////
//delay 1ms procedure
void Delay(uint n)
{   
	uchar i;
	while(n--){
	   for(i=0;i<99;i++)
	   {;}
	}
}

///////////////////////////////////////////////////////////////
//Timer0 10ms interrupt 
void timer0(void) interrupt 1 using 1
{
	bit Sample;
	uchar i;
	uint  j = 1;
	
	TH0 = 0xDC;
	TL0 = 0x00;

	if(HandonFlag==0)
	{
		Sample = P15;
		if(Sample==0)
		{
			HandonTimer++;
			if(HandonTimer>10)
			{
				HandonFlag = 1;
				HandonTimer = 0;
			}		
		}
		else  HandonTimer=0;
	}
	if(HandonFlag==2)
	{
		Sample = P15;
		if(Sample==1)	
		{
			HandonTimer++;
			if(HandonTimer>10)
			{
				HandonFlag = 0;
				HandonTimer = 0;
				for(i=0;i<16;i++)
			 		Timer[i] = 0;
				PortFlag = 0;
			}
		}
		else  HandonTimer=0;
	}
	for(i=0;i<16;i++){
	   if(((PortFlag>>i)&0x01)==1){
	   	  Timer[i]--;
		  if(Timer[i]==0)   PortFlag&=~(j<<i);
	   }
	}
}

///////////////////////////////////////////////////////////////
//Serial port receive interrupt
void serial(void) interrupt 4 using 2
{
	uchar temp;
	if(RI&(!RcvFlag)){
		temp = SBUF;
		RI = 0;
		if(rlength == 0)
		{
			if(temp == 0xA1)
			{
				Buffer[rlength] = temp;
				rlength ++;
				PF = temp; 
			}
			else
			{
				rlength = 0;
			}
		}
		else if(rlength == 5)
		{
			Buffer[rlength] = temp;
			if(((PF^temp)==0)&&(Buffer[4]==0xAF)&&((Buffer[1]&0x0F)==DevAddr))
				{
					RcvFlag = 1;
					ES = 0;
				}
			rlength = 0;
			PF = 0;
		}
		else
		{
			Buffer[rlength] = temp;
			PF += temp;
			rlength ++;
		}
	}
    if(TI){
		TI=0;
		//the Tx interrupt processing code
	}
}

//END
	

⌨️ 快捷键说明

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