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

📄 elevator.c

📁 MAGE128下用RS485进行通讯并进行CRC校验以及中断的处理
💻 C
📖 第 1 页 / 共 2 页
字号:
	load=1;
	begin[3]=0xc8;
	}
else if(container&&0x40)
	{
	unload=1;
	begin[3]=0xc9;
	}
else
	{
	normalload=1;
	begin[3]=0xc4;
	}

}


void handshake(void)
{
state=0;
while(!instruction1)
	{;}
if(store13[0])
	{
	send_buf1[2]=0xcc;
	send_buf1[3]=0xac;   //发送握手指令
	change1();
	send_buf1[4]=crc_gen(byt1,3);
	USART_Transmit1(send_buf1,6);
        instruction1=0;
        store13[0]=0;
        }
while(!instruction1)
	{;}
send_buf0[1]=0x01;  //暂时先用0x01代表内呼板地址
send_buf0[3]=0xef;
change0();
send_buf0[4]=crc_gen(byt0,3);
USART_Transmit0(send_buf0,6);
while(!instruction0)
	{;}
if(store03[0]==1)
	{
	instruction0=0;
	send_buf1[2]=0x01;
	send_buf1[3]=0x1c;
	change1();
	send_buf1[4]=crc_gen(byt1,3);
	USART_Transmit1(send_buf1,6);
	store03[0]=0;
	}
else
	{
	instruction0=0;
	send_buf1[2]=0x01;
	send_buf1[3]=0x3c;
	change1();
	send_buf1[4]=crc_gen(byt1,3);
	USART_Transmit1(send_buf1,6);
	}
v=0x21;
for(u=0;u<=floor-1;u++)
	{
	send_buf0[1]=v;  //暂时先用0x01代表内呼板地址
	send_buf0[3]=0x03;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	while(!instruction0)
		{;}
	if(store03[1]==1)
		{
		instruction0=0;
		good++;
		}
	else
		{
		instruction0=0;
		good=0x4c;
		send_buf1[2]=v;
		send_buf1[3]=0x4c;
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);
		}	
	v++;
	}
if(good==floor)
	{
	send_buf1[2]=0x21;
	send_buf1[3]=0x2c;
	change1();
	send_buf1[4]=crc_gen(byt1,3);
	USART_Transmit1(send_buf1,6);
	}
for(u=0;u<=3;u++)
	{
	send_buf1[2]=0xcc;
	send_buf1[3]=begin[u];
	change1();
	send_buf1[4]=crc_gen(byt1,3);
	USART_Transmit1(send_buf1,6);
	}
state=1;
}


void sample()
{
if(container&&0x04)    //判断是司机还是自动
	{
	if(!motorman)
		{
		send_buf1[2]=0xcc;
		send_buf1[3]=0xc5;//司机钮有效
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);
		motorman=1;
		motor=0;
		}	
	}
else	
	{
	if(!motor)
		{
		send_buf1[2]=0xcc;
		send_buf1[3]=0xc6;  //自动钮有效
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);
		motor=1;
		motorman=0;		
		}
	}

if(motorman)//直驶按钮
	{
	if(container&&0x08)
		{
		if(!straight)
			{
			send_buf1[2]=0xcc;
			send_buf1[3]=0xc7;  
			change1();
			send_buf1[4]=crc_gen(byt1,3);
			USART_Transmit1(send_buf1,6);
	        	straight=1;
	        	}
		}
	else
		{
		straight=0;
		}
	}

 //判断载重情况
if(container&&0x10)
	{//超载
	if(!overload)
		{
		outp(0xa0,PORTC);
		overload=1;
		load=0;
		unload=0;
		normalload=0;
		}
	}
else if(container&&0x20)
	{//满载
	if(!load)
		{
		outp(0x40,PORTC);
		overload=0;
		load=1;
		unload=0;
		normalload=0;
		send_buf1[2]=0xcc;
		send_buf1[3]=0xc8;  
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);
	        }
	}
else if(container&&0x40)   //轻载
	{
	if(!unload)
		{
		outp(0x00,PORTC);
		overload=0;
		load=0;
		unload=1;
		normalload=0;
		send_buf1[2]=0xcc;
		send_buf1[3]=0xc9;  
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);
		}    
	}
else                         //常载 
	{
	if(!normalload);
		{
		outp(0x00,PORTC);
		overload=0;
		load=0;
		unload=0;
		normalload=1;
		send_buf1[2]=0xcc;
		send_buf1[3]=0xc4;  
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);		
		}     
	}


//判断开关门按钮
if(container&&0x02)
	{
	if(!openbutton)
		{
		openbutton=1;
		closebutton=0;
		send_buf1[2]=0xcc;
		send_buf1[3]=0xc3;  
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);		
		
		}
	}
else if(container&&0x01)
	{
	openbutton=0;
	closebutton=1;
	shutdown();
	}
else   
	{;}

container=PINF;
if(container&&0x08)       //判断门的情况
	{                 //关门到位
	if(!closetip)
		{
		closetip=1;
		opentip=0;
		unclose=0;
		unopen=0;
		send_buf1[2]=0xcc;
		send_buf1[3]=0xc1;  
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);		
		}	   
	}
else
	{    //关门不到位
	if(!unclose)
		{
		closetip=0;
		opentip=0;
		unclose=1;
		unopen=0;
		send_buf1[2]=0xcc;
		send_buf1[3]=0x8c;  
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);		
		}
	}
if(container&&0x40)    //开门到位
	{
	if(!opentip)
		{
		closetip=0;
		opentip=1;
		unclose=0;
		unopen=0;
		send_buf1[2]=0xcc;
		send_buf1[3]=0xc0;  
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);		
		}    
	}
else
	{      //开门不到位
	if(!unopen)
		{
		closetip=0;
		opentip=0;
		unclose=0;
		unopen=1;
		send_buf1[2]=0xcc;
		send_buf1[3]=0xc0;  
		change1();
		send_buf1[4]=crc_gen(byt1,3);
		USART_Transmit1(send_buf1,6);
		}   
	}


if(container&&0x20)
	{
	if(!light)
		{
		light=1;
		opendoor();		
		}
	else
		{light=0;}
	}
}



void handle1()
{
inroom=*(*takeout1+0);
inroom=inroom<<8;
inroom=inroom|*(*takeout1+1);

if(inroom==0xccd0)
	{
	opendoor();
	takeout1++;
	c1++;
	
	}
else if(inroom==0xccd1)
	{
	shutdown();
	takeout1++;
	c1++;
	}
else if(inroom==0xccd2)
	{
	PORTC=PORTC|0x04;
	takeout1++;
	c1++;
	}
else if(inroom==0xccd3)
	{
	PORTC=PORTC&0xfb;
	takeout1++;
	c1++;
	}
else if(inroom==0xccd4)
	{
	PORTC=PORTC|0x08;
	takeout1++;
	c1++;
	}
else if(inroom==0xccd5)
	{
	PORTC=PORTC&0xf7;
	takeout1++;
	c1++;
	}
else if(inroom==0xccd6)
	{
	PORTC=PORTC|0x10;
	takeout1++;
	c1++;
	for(n=0;n<=255;n++)
		{
		for(m=0;m<=255;m++)
			{;}
		}
	PORTC=PORTC&0xef;
	}
else if(inroom==0xccde)
	{
	send_buf0[1]=0x01;
	send_buf0[3]=0xe8;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	c1++;
	takeout1++;
	}
else if(inroom==0xccdf)
	{
	send_buf0[1]=0x01;
	send_buf0[3]=0xe9;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	c1++;
	takeout1++;
	}
/*else if(inroom==0xcc3d)   //故障态
	{
	PORTC=PORTC|0x80;
	for(n=0;n<=255;n++)
		{
		for(m=0;m<=255;m++)
			{;}
		}
	PORTC=PORTC&0x7f;
	send_buf0[1]=0x01;
	send_buf0[3]=0xea;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	send_buf0[1]=0xdd;
	send_buf0[3]=0xf6;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	send_buf0[1]=0xdd;
	send_buf0[3]=0xd8;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	send_buf0[1]=0xdd;
	send_buf0[3]=0x26;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	fault();    故障态子程
	c1++;
	takeout1++;
	}
else if(inroom==0xcc0d)  //检修
	{
	send_buf0[1]=0x01;
	send_buf0[3]=0xea;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	send_buf0[1]=0xdd;
	send_buf0[3]=0xf6;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	send_buf0[1]=0xdd;
	send_buf0[3]=0xd8;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	send_buf0[1]=0xdd;
	send_buf0[3]=0x26;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	repair=1;   //检修子程
	c1++;
	takeout1++;
	}
else if(inroom==0xcc1d)
	{
	fire();  //消防子程
	c1++;
	takeout1++;
	}*/
else if(inroom&0x005d=0x005d)   //熄灭呼梯指令
	{
	send_buf0[1]=inroom>>8;
	send_buf0[3]=0x5d;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	c1++;
	takeout1++;
	}
else if(inroom==0xcc6d)       //锁梯态指令
	{
	send_buf0[1]=0x01;
	send_buf0[3]=0xea;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	send_buf0[1]=0xdd;
	send_buf0[3]=0xf6;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	send_buf0[1]=0xdd;
	send_buf0[3]=0xd8;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	send_buf0[1]=0xdd;
	send_buf0[3]=0x26;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	UCSR0B=(0<<RXEN)|(0<<TXEN);
	c1++;
	takeout1++;
	}
else if(inroom==0xcc8d)     //允许开门指令
	{
	opendoor();
	c1++;
	takeout1++;
	}
else if(inroom&&0x009d==0x9d)    //内呼外闪
	{
	send_buf0[1]=inroom>>8;
	send_buf0[3]=0x9d;
	change0();
	send_buf0[4]=crc_gen(byt0,3);
	USART_Transmit0(send_buf0,6);
	c1++;
	takeout1++;
	}
else
	{;}
if(c1>=50)
	{
	c1=0;
	takeout1=store2;
	}
}





int main(void)
{
DDRC=0xff;
DDRB=0x00;
DDRF=0x00;
u16 rate=UART_BAUD_SELECT;
USART_Init1(rate);
USART_Init0(rate);
sei();
ok1=0;
err1=0;
ok0=0;
err0=0;
r1=0;
r0=0;
state=0;
k=0;
wrong1=0;
wrong0=0;
good=0;
opentip=0;
closetip=0;
unopen=0;
unclose=0;
motorman=0;//
motor=0;//
load=0;
unload=0;
normalload=0;
overload=0;
container=0;
light=0;
openbutton=0;
closebutton=0;
straight=0;  //
inevenfloor=0;
outevenfloor=0;
evenfloor=0;

repair=0;
takeout1=store2;
timef=1;
c1=0;
DDRC=0x00;
outp(0xf0,TCNT1H);
outp(0xbe,TCNT1L);
outp(5,TCCR1B);
//outp((1<<TOIE1),TIMSK); 
sei();

putin1=store2;
takeout1=store2;
examself();//还有平层中断的处理程序
handshake();
for(;;)
	{  
	if(store13[1]||store13[6])       //电梯自动态和自学习态
		{
		sample();
		if(instruction1!=0)
			{
			handle1();
			}
		}
	}
}


SIGNAL(SIG_INTERRUPT4)
{
send_buf1[1]=0xbb;
send_buf1[3]=0xca;    //平层入信号
change1();
send_buf1[4]=crc_gen(byt1,3);
USART_Transmit1(send_buf0,6);
}



⌨️ 快捷键说明

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