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

📄 carport.c

📁 改程序代码是运用Keil uVision3软件编写的C程序
💻 C
字号:
/***************************************
功能:立体车库上位机控制主程序
文件名:carport.c
硬件:AT89S52
编译人:肖强
编译:Keil-2008-12-9
****************************************/
#include<reg52.h>
#include<Up_control.h>
#include<KEY_scan.h>
#include<LCD_menu.h>
#define uchar unsigned char
#define uint unsigned char

uchar KEY_data_1;	  //键盘输入高位数据
uchar KEY_data_2;	  //键盘输入低位数据
uchar Reci;			  //下位机执行完成
bit  KEY_OK;
bit  KEY_ESC;
bit  Data_complit=0;
void delay(unsigned char y);
void int_string_com(void); 		   //串口初始化函数
uchar Data_sent(void);		   //有用数据发送
uchar senddate();//握手和数据传输 及检测传输是否正确;
void main(void)
{
	uchar Send_data,GET_ok,delay_i;
	uchar ch;
	Start_Piture(0,0,1,1); //开机画面函数
	for(delay_i=0;delay_i<40;delay_i++)
	{
		delay(65500);	
	}

	
	while(1)
	{
STA:
		Clear_12864(1);
		Clear_12864(2);
/********************
原始车位图面
**********************/

		Piture_1(1);
RET1:	
		BlackInput(6,16,2,1);					//1不反色,0反色
		Number(2,0,1);							//输入数字显示清零
/********************
原来车位数据输入
**********************/
		
		KEY_data_1=KEY_scan();					 //取原始位置十位数据
		while(1)													 
		{			
			if(KEY_data_1<6) 
			{
//				side=0;
				KEY_OK=0;
				KEY_ESC=0;
				Data_complit=0;
				break;
			}
			KEY_data_1=KEY_scan();		
		}
		delay(100);
		ClickNumber(KEY_data_1,1);						//输入个位数据
		KEY_data_2=KEY_scan();					  
		while(1)										//取原始位置十位数据
		{															  			
			if(KEY_data_2<10) 
			{
//				side=0;
				KEY_OK=0;
				KEY_ESC=0;
				Data_complit=0;
				break;
			}
			KEY_data_2=KEY_scan();			 			
		}
		delay(200);
		ClickNumber(KEY_data_2,0);			 				//输入个位数据送LCD显示
		Send_data=KEY_data_1*10+KEY_data_2;
		if((Send_data==0)||(Send_data>50))					//输入数据无效时
		{
			Unoption_Piture(0,0,1);							//调用无效输入画面重新
			for(delay_i=0;delay_i<20;delay_i++)
			{															
				delay(65500);					
			}
			goto STA;															
		}	
		GET_ok=GET_position(Send_data,Data_complit);					 
		while(1)										 
		{
			if(GET_ok) break;							 //数据获得成功
			GET_ok=GET_position(Send_data,Data_complit);
		}
/**/	KEY_data_2=KEY_scan();							//等待确认键按下
		while(1)											  
		{												
									
//			if(KEY_data_2=10) side=1;					  
			if	(KEY_data_2==10)						  //确认键/返回键按下处理
			{
				KEY_OK=1;
				KEY_ESC=0;
				SureKey(6,16,1,0);
				delay(1000);
				goto RET2;							// 进入下一界面显示
				break;
			} 
			else if (KEY_data_2==11)					//返回键按下
			{
				KEY_OK=0;
				KEY_ESC=1;
				BlackInput(6,16,2,0);
				delay(1000);
				goto RET1;//返回上一个界面
				break;			
			}

			KEY_data_2=KEY_scan();				
		}
/********************
目标车位数据输入
**********************/
RET2:	
		Clear_12864(1);
		Clear_12864(2);	
		Piture_1(0);
RET3:
		BlackInput(6,16,2,1);
		Number(2,0,1);							 //输入数字显示清零
		KEY_data_1=KEY_scan();					 //取目标车库位置十位数据
		while(1)													 
		{			
			if(KEY_data_1<6) 
			{
//				side=0;
				KEY_OK=0;
				KEY_ESC=0;
				Data_complit=1;
				break;
			}
			KEY_data_1=KEY_scan();		
		}
		ClickNumber(KEY_data_1,1);	  		   	  		//输入十位数据送LCD显示	 
		KEY_data_2=KEY_scan();					  
		while(1)										//取原始位置个位数据
		{															  			
			if(KEY_data_2<10) 
			{
//				side=0;
				KEY_OK=0;
				KEY_ESC=0;
				Data_complit=1;
				break;
			}
			KEY_data_2=KEY_scan();			 			
		}
		ClickNumber(KEY_data_2,0);					 //输入个位数据送LCD显示
		Send_data=KEY_data_1*10+KEY_data_2;	
		if((Send_data==0)||(Send_data>50))					//输入数据无效时
		{

			Unoption_Piture(0,0,1);						//调用无效输入画面重新
			for(delay_i=0;delay_i<20;delay_i++)
			{													
				delay(65500);				
			}
			goto RET2;														
		}
		GET_ok=GET_position(Send_data,Data_complit);					 
		while(1)										 
		{
			if(GET_ok) break;							 //数据获得成功
			GET_ok=GET_position(Send_data,Data_complit);
		}

/**/	KEY_data_2=KEY_scan();							//等待确认键按下
		while(1)											  
		{												
									
//			if(KEY_data_2=10) side=1;					  
			if	(KEY_data_2==10)						  //确认键/返回键按下处理
			{
				KEY_OK=1;
				KEY_ESC=0;
				Clear_12864(1);
				Clear_12864(2);
				goto RET4;// 进入下一界面显示
				break;
			} 
			else if (KEY_data_2==11)					//返回键按下
			{
				KEY_OK=0;
				KEY_ESC=1;
				BlackInput(6,16,2,0);
				delay(1000);
				goto RET3;//返回上一个界面
				break;			
			}

			KEY_data_2=KEY_scan();				
		}

/**************************************
显示执行画面
***************************************/
RET4:	
		Clear_12864(1);
		Clear_12864(2);	
		Work_Piture(0,0,1);				   //下位机执行画面
//RET5:


/**************************************
向下位机送数据
***************************************/
	//判断SENDEDATE 返回错误则延时一段实际后继续传送;
		
		int_string_com(); 
		while(1)
		{
			if(senddate())
				break;	   //传输正确
			 else
			 	delay(50);//如果出错则继续传送
		}
		delay(100);	

		int_string_com();
		while(!RI);				   //等待下位机返回执行完数据
			RI=0;
		ch=SBUF;
		if(ch=='E')//操作成功 进行下次输入
		{
					 					 				   
			Over_Piture(0,0,1);		//调用LCD显示执行完成画面函数
			for(delay_i=0;delay_i<40;delay_i++)
			{
				delay(65500);	
			}
		}
		else if(ch=='F') //则严重出错 严重出错处理;
		{
			Eorr_Piture(0,0,1);
			for(delay_i=0;delay_i<40;delay_i++)
			{
				delay(65500);	
			}				
		}
		else	//数据传输错误,请检查数据传输;
		{
			
		}
	}


//	delay(65000);							   
}
uchar senddate()
{
	uchar ch;
	while(1)
	{
		SBUF='A';
		while(!TI);
		TI=0;

		while(!RI);
		ch = SBUF;
		RI=0;
		if(ch=='B')
			break;
		else
			delay(256);	
	}
	Data_sent();//发送数据 

	while(!RI);
	ch = SBUF;
	RI=0;
	if(ch=='C')	 //传输出错
		return 0;
	else		 //传输正确;
		return 1;
		
}
uchar Data_sent(void)
{
	uchar i;
	uchar total=0;
	for (i=0;i<7;i++)	
	{
		SBUF=car_tab[i];
		total=total+car_tab[i];	 //求校验和
		while(!TI);	
		TI=0;
	}
	SBUF=total;	 //传输校验和
	while(!TI);	
	TI=0;

	return 1;
}

void int_string_com(void)
{
	TMOD=0x20;
	TL1=0xfd;
	TH1=0xfd;
	SCON=0x50;	 //设置串行口方式,工作于方式2
	PCON=0x00; 
	ES=0; //允许串口中断
	EA=1;//开总中断	  
	TR1=1;
}

/*//串口中断程序
void String(void) interrupt 4 using 2
{
//	uchar x,y;
	if(RI)
	{
		Reci=SBUF;  //单片机接收数据	
//		for (i=0;i<8;i++)
//		{		}
//		p=p-8;
	}
	RI=0;
}  */
void delay(uint y)
{
	uchar x;
	for(;y;y--)
		for(x=0;x<100;x++);
}

⌨️ 快捷键说明

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