基于51单片机的16层电梯控制系统(16)原理图、流程图、物料清单、仿真图、源代码

该博客介绍基于51单片机的16层电梯控制系统,包含原理图、流程图、物料清单、仿真图和源代码。系统可模拟16层电梯工作,实现上下行指示与楼层显示,用矩阵键盘输入楼层,且有红外检测,遮挡则停止运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基于51单片机的16层电梯控制系统(16)原理图、流程图、物料清单、仿真图、源代码请添加图片描述

基于51单片机的电梯(16)

简易电梯
1、模拟16层电梯工作,实现上下行指示,楼层显示
2、使用矩阵键盘输入要去的楼层
3、电梯进行红外检测,如果红外被遮挡则停止运行。
【说明:按多个楼层以后,LED会出现比较严重的闪烁】请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述
请添加图片描述

#include <reg52.h>	         //调用单片机头文件
#define uchar unsigned char  //无符号字符型 宏定义	变量范围0~255
#define uint  unsigned int	 //无符号整型 宏定义	变量范围0~65535

bit flag_100ms,flag_1s;	
bit flag_stop = 0;   //用做到了相应的楼停下

sbit beep  = P2^2;
sbit xia   = P2^5;
sbit zhong = P2^6;
sbit shang = P2^7;

sbit hw = P2^3;  //红外
uchar time1=0;
uchar value2;
 
uchar dt_1=0;  //1楼电梯标志位
uchar dt_2=0;  //2楼电梯标志位
uchar dt_3=0;  //3楼电梯标志位
uchar dt_4=0;  //4楼电梯标志位
uchar dt_5=0;  //5楼电梯标志位
uchar dt_6=0;  //6楼电梯标志位
uchar dt_7=0;  //7楼电梯标志位
uchar dt_8=0;  //8楼电梯标志位
uchar dt_9=0;  //9楼电梯标志位
uchar dt_10=0;  //10楼电梯标志位
uchar dt_11=0;  //11楼电梯标志位
uchar dt_12=0;  //12楼电梯标志位
uchar dt_13=0;  //13楼电梯标志位
uchar dt_14=0;  //14楼电梯标志位
uchar dt_15=0;  //15楼电梯标志位
uchar dt_16=0;  //16楼电梯标志位

uchar dt_value = 1;  //电梯到哪一层的变量
uchar dt_s_x ;    //电梯上下的标志位

数码管段选定义  0   1    2    3    4    5 	6	 7	  8	   9	
uchar smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
//					   A	B	 C	  D	   E   F	不显示
        			  0x37,0x7C,0x39,0x5E,0x5E,0x71,0};	 //断码

//数码管位选定义
sbit smg_we1 = P2^0;	    //数码管位选定义
sbit smg_we2 = P2^1;

uchar dis_smg[4] = {0};
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<120;j++);
}
/***********************1蜂鸣器函数*****************************/
void beep_on()
{
	beep=0;
	delay_1ms(1000);
	beep=1;
}
/***********************数码显示函数*****************************/
/*void display()
{	
	P0 = 0x00;			//消隐 
	smg_we1 = 0;  smg_we2 = 1;
	P0 = dis_smg[0];	//段选
	delay_1ms(1);
	P0 = 0x00;			//消隐 	
	smg_we1 = 1;  smg_we2 = 0;
	P0 = dis_smg[1];
	delay_1ms(1);	 
}*/

/********************独立按键程序*****************/
uchar key_can;	 //按键值
void key()	 //独立按键程序
{
	uchar i,j;
	i=0;
	j=0;
	P1=0xf0;
	switch(P1)
	{
		case 0xe0:i=0;break;
		case 0xd0:i=1;break;
		case 0xb0:i=2;break;  
		case 0x70:i=3;
	}
	P1=0x0f;
	switch(P1)
	{
		case 0x0e:j=13;break;
		case 0x0d:j=9;break;
		case 0x0b:j=5;break;  
		case 0x07:j=1;
	}
	while(P1!=0x0f);
	key_can=i+j;
}


void key_with()	 //设置楼层标志
{
	if(key_can == 1)
	{
		dt_1 = 1;	 //
	}		
	if(key_can == 2)
	{
		dt_2 = 1;
	}	
	if(key_can == 3)
	{
		dt_3 = 1;
	}	
	if(key_can == 4)
	{
		dt_4 = 1;
	}	
	if(key_can == 5)
	{
		dt_5 = 1;
	}	
	if(key_can == 6)
	{
		dt_6 = 1;
	}	
	if(key_can == 7)
	{
		dt_7 = 1;
	}	
	if(key_can == 8)
	{
		dt_8 = 1;
	}	
	if(key_can == 9)
	{
		dt_9 = 1;	 //
	}		
	if(key_can == 10)
	{
		dt_10 = 1;
	}	
	if(key_can == 11)
	{
		dt_11 = 1;
	}	
	if(key_can == 12)
	{
		dt_12 = 1;
	}	
	if(key_can == 13)
	{
		dt_13 = 1;
	}	
	if(key_can == 14)
	{
		dt_14 = 1;
	}	
	if(key_can == 15)
	{
		dt_15 = 1;
	}	
	if(key_can == 16)
	{
		dt_16 = 1;
	}	
}
 
/****************电梯向上、做最后的判断是否还要继续向上****************/
void dt_shang_guan()
{
	uchar value;
	if(dt_s_x == 1)    //电梯向上  做最后的判断是否还要继续向上
	{
		if(dt_value == 1)	//在第1层
		{
			value = dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16; 
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 2)	//在第2层
		{
			value = dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16; 
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 3)	//在第3层
		{
			value = dt_4 + dt_5 + dt_6 + dt_7 + dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  					
			}else 
				flag_stop = 1;	 
		}		
		else if(dt_value == 4)	//在第4层
		{
			value = dt_5 + dt_6 + dt_7 + dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	 	
		}		
		else if(dt_value == 5)	//在第5层
		{
			value = dt_6 + dt_7 + dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;		
		}		
		else if(dt_value == 6)	//在第6层
		{
			value = dt_7 + dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
            {
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;			
		}	
		else if(dt_value == 7)	//在第7层
		{
			value = dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 8)	//在第8层
		{
			value = dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 9)	//在第9层
		{
			value = dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 10)	//在第10层
		{
			value = dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 11)	//在第11层
		{
			value = dt_12+dt_13+dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 12)	//在第12层
		{
			value = dt_13+dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 13)	//在第13层
		{
			value = dt_14+dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 14)	//在第14层
		{
			value = dt_15+dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 15)	//在第15层
		{
			value = dt_16;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				shang = 1;		//关闭上字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 16)	//在第16层
		{
			dt_s_x = 0;  //电梯停下不动了
			shang = 1;		//关闭上字
			zhong = 1;  	
		}		
	}	
}

/****************电梯向下、做最后的判断是否还要继续向下****************/
void dt_xia_guan()
{
	uchar value;
	if(dt_s_x == 2)    //电梯向下  做最后的判断是否还要继续向下
	{
		if(dt_value == 1)	//在第1层
		{
			dt_s_x = 0;  //电梯停下不动了
			xia = 1;		//关闭上字
			zhong = 1;  	
			flag_stop = 1;	
		}		
		else if(dt_value == 2)	//在第2层
		{
			value = dt_1; 
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 3)	//在第3层
		{
			value = dt_1 + dt_2; 
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  					
			}else 
				flag_stop = 1;	 
		}		
		else if(dt_value == 4)	//在第4层
		{
			value = dt_1 + dt_2 + dt_3; 
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	 	
		}		
		else if(dt_value == 5)	//在第5层
		{
			value = dt_1 + dt_2 + dt_3 + dt_4; 
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;		
		}		
		else if(dt_value == 6)	//在第6层
		{
			value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5; 
			if(value == 0)	 //说明上面没有人按下
            {
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;			
		}	
		else if(dt_value == 7)	//在第7层
		{
			value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5+ dt_6; 
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 8)	//在第8层
		{
			value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7; 
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 9)	//在第9层
		{
			value = dt_1 + dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 10)	//在第10层
		{
			value = dt_1 + dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 11)	//在第11层
		{
			value = dt_1 + dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 12)	//在第12层
		{
			value = dt_1 + dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 13)	//在第13层
		{
			value = dt_1 + dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 14)	//在第14层
		{
			value = dt_1 + dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
		else if(dt_value == 15)	//在第15层
		{
			value = dt_1 + dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}	
		else if(dt_value == 16)	//在第16层
		{
			value = dt_1 + dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15;  
			if(value == 0)	 //说明上面没有人按下
			{
				dt_s_x = 0;  //电梯停下不动了  
				xia = 1;		//关闭下字
				zhong = 1;  
			}else 
				flag_stop = 1;	
		}		
			
	}		
}

/***********************电梯处理函数************************/
void td_dis()
{
	uchar value;
	value = dt_1+dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16; 
	if(value != 0)
	{		   //100ms
		if(flag_stop == 1)	//到相应的楼了  要停下
		{	 
/***************************向上走电梯***********************************/	
			if(dt_s_x != 0)		  //向上走电梯
			{
				if(dt_s_x == 1)		  //向上走电梯
				{
					dt_value ++;
					shang = 0;		//显示上字
					zhong = 0;
				}
				if(dt_s_x == 2)		  //向下走电梯
				{
					dt_value --;
					xia = 0;		//显示下字
					zhong = 0;
				}					
				if(dt_value == 1)	   //当到了第一层的时候
				{
					if(dt_1 == 1)
					{
						dt_1 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();        //打开蜂鸣器
					} 				
				}
				else if(dt_value == 2)	   //当到了第二层的时候
				{
					if(dt_2 == 1)
					{
						dt_2 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 3)	   //当到了第3层的时候
				{
					if(dt_3 == 1)
					{
						dt_3 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 4)	   //当到了第4层的时候
				{
					if(dt_4 == 1)
					{
						dt_4 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 5)	   //当到了第5层的时候
				{
					if(dt_5 == 1)
					{
						dt_5 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 6)	   //当到了第6层的时候
				{
					if(dt_6 == 1)
					{
						dt_6 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 7)	   //当到了第7层的时候
				{
					if(dt_7 == 1)
					{
						dt_7 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 8)	   //当到了第8层的时候
				{
					if(dt_8 == 1)
					{
						dt_8 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 9)	   //当到了第9层的时候
				{
					if(dt_9 == 1)
					{
						dt_9 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 10)	   //当到了第10层的时候
				{
					if(dt_10 == 1)
					{
						dt_10 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 11)	   //当到了第11层的时候
				{
					if(dt_11 == 1)
					{
						dt_11 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 12)	   //当到了第12层的时候
				{
					if(dt_12 == 1)
					{
						dt_12 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 13)	   //当到了第13层的时候
				{
					if(dt_13 == 1)
					{
						dt_13 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 14)	   //当到了第14层的时候
				{
					if(dt_14 == 1)
					{
						dt_14 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 15)	   //当到了第15层的时候
				{
					if(dt_15 == 1)
					{
						dt_15 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
				else if(dt_value == 16)	   //当到了第16层的时候
				{
					if(dt_16 == 1)
					{
						dt_16 = 0;        //清零电机在的标志
						flag_stop = 0;   //到停下
						beep_on();         //打开蜂鸣器
					} 				
				}
 			}		
		} 						
	}
	if(flag_stop == 0) 
	{
 		value2 ++;
		if(value2 % 5 == 0)
		{
			if(dt_s_x == 1)	   //上
			{
				shang = ~shang;
				zhong = ~zhong;				
			}
			if(dt_s_x == 2)	   //下
			{
				zhong = ~zhong;
				xia = ~xia;				
			}		
		}
		if(value2 >= 10) //1.0s
		{			
			beep = 1;  //关闭蜂鸣器
			value2 = 0;	 			
		} 
 		dt_shang_guan();  //电梯向上  做最后的判断是否还要继续向上
		dt_xia_guan();	  //电梯向下  做最后的判断是否还要继续向下
	}	
}


/*************定时器0初始化程序***************/
void time_init()	  
{
	EA   = 1;	 	  //开总中断
	TMOD = 0X01;	  //定时器0、工作方式1
	TH0 = 0x3c;
	TL0 = 0xb0;         // 50ms
	ET0  = 1;		  //开定时器0中断 
	TR0  = 1;		  //允许定时器0定时
}

void led_dong()
{
		if(dt_1)
		{
			P3 = 0xee;   //灯亮
		}
	P0 = 0x00;			//消隐 
	smg_we1 = 0;  smg_we2 = 1;
	P0 = dis_smg[0];	//段选
	delay_1ms(1);

		if(dt_2)
		{
			P3 = 0xde;    //灯亮
		}
	P0 = 0x00;			//消隐 	
	smg_we1 = 1;  smg_we2 = 0;
	P0 = dis_smg[1];
	delay_1ms(1);

		if(dt_3)
		{
			P3 = 0xbe;    //灯亮
		}
	P0 = 0x00;			//消隐 
	smg_we1 = 0;  smg_we2 = 1;
	P0 = dis_smg[0];	//段选
	delay_1ms(1);

		if(dt_4)
		{
			P3 = 0x7e;   //灯亮
		}
	P0 = 0x00;			//消隐 	
	smg_we1 = 1;  smg_we2 = 0;
	P0 = dis_smg[1];
	delay_1ms(1);
		if(dt_5)
		{
			P3 = 0xed;    //灯亮
		}
	P0 = 0x00;			//消隐 
	smg_we1 = 0;  smg_we2 = 1;
	P0 = dis_smg[0];	//段选
	delay_1ms(1);
		if(dt_6)
		{
			P3 = 0xdd;    //灯亮
		}
	P0 = 0x00;			//消隐 	
	smg_we1 = 1;  smg_we2 = 0;
	P0 = dis_smg[1];
	delay_1ms(1);
		if(dt_7)
		{
			P3 = 0xbd;    //灯亮
		}
	P0 = 0x00;			//消隐 
	smg_we1 = 0;  smg_we2 = 1;
	P0 = dis_smg[0];	//段选
	delay_1ms(1);
		if(dt_8)
		{
			P3 = 0x7d;    //灯亮
		}
	P0 = 0x00;			//消隐 	
	smg_we1 = 1;  smg_we2 = 0;
	P0 = dis_smg[1];
	delay_1ms(1);
		if(dt_9)
		{
			P3 = 0xeb;       //灯亮
		}
	P0 = 0x00;			//消隐 
	smg_we1 = 0;  smg_we2 = 1;
	P0 = dis_smg[0];	//段选
	delay_1ms(1);
		if(dt_10)
		{
			P3 = 0xdb;      //灯亮
		}
	P0 = 0x00;			//消隐 	
	smg_we1 = 1;  smg_we2 = 0;
	P0 = dis_smg[1];
	delay_1ms(1);
		if(dt_11)
		{
			P3 = 0xbb;      //灯亮
		}
	P0 = 0x00;			//消隐 
	smg_we1 = 0;  smg_we2 = 1;
	P0 = dis_smg[0];	//段选
	delay_1ms(1);
		if(dt_12)
		{
			P3 = 0x7b;     //灯亮
		}
	P0 = 0x00;			//消隐 	
	smg_we1 = 1;  smg_we2 = 0;
	P0 = dis_smg[1];
	delay_1ms(1);
		if(dt_13)
		{
			P3 = 0xe7;     //灯亮
		}
	P0 = 0x00;			//消隐 
	smg_we1 = 0;  smg_we2 = 1;
	P0 = dis_smg[0];	//段选
	delay_1ms(1);
		if(dt_14)
		{
			P3 = 0xd7;     //灯亮
		}
	P0 = 0x00;			//消隐 	
	smg_we1 = 1;  smg_we2 = 0;
	P0 = dis_smg[1];
	delay_1ms(1);
		if(dt_15)
		{
			P3 = 0xb7;     //灯亮
		}
	P0 = 0x00;			//消隐 
	smg_we1 = 0;  smg_we2 = 1;
	P0 = dis_smg[0];	//段选
	delay_1ms(1);
		if(dt_16)
		{
			P3 = 0x77;      //灯亮
		}
	P0 = 0x00;			//消隐 	
	smg_we1 = 1;  smg_we2 = 0;
	P0 = dis_smg[1];
	delay_1ms(1); 
}	
/******************电梯启动**********************/
void start()
{
	uchar value;

	switch(dt_value)
	{
		case 1:value=dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
			{
				dt_s_x=1;
			}
			break;
		case 2:value=dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1;
				if(value)
					dt_s_x=2;
			}
			break;
		case 3:value=dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2;
				if(value)
					dt_s_x=2;
			}
			break;
		case 4:value=dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3;
				if(value)
					dt_s_x=2;
			}
			break;
		case 5:value=dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4;
				if(value)
					dt_s_x=2;
			}
			break;
		case 6:value=dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4+dt_5;
				if(value)
					dt_s_x=2;
			}
			break;
		case 7:value=dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4+dt_5+dt_6;
				if(value)
					dt_s_x=2;
			}
			break;
		case 8:value=dt_9+dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4+dt_5+dt_6+dt_7;
				if(value)
					dt_s_x=2;
			}
			break;
		case 9:value=dt_10+dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8;
				if(value)
					dt_s_x=2;
			}
			break;
		case 10:value=dt_11+dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9;
				if(value)
					dt_s_x=2;
			}
			break;
		case 11:value=dt_12+dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10;
				if(value)
					dt_s_x=2;
			}
			break;
		case 12:value=dt_13+dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11;
				if(value)
					dt_s_x=2;
			}
			break;
		case 13:value=dt_14+dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12;
				if(value)
					dt_s_x=2;
			}
			break;
		case 14:value=dt_15+dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13;
				if(value)
					dt_s_x=2;
			}
			break;
		case 15:value=dt_16;
			if(value)
				dt_s_x=1;
			else
			{
			   	value=dt_1+dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14;
				if(value)
					dt_s_x=2;
			}
			break;
		case 16:value=dt_1+dt_2+dt_3+dt_4+dt_5+dt_6+dt_7+dt_8+dt_9+dt_10+dt_11+dt_12+dt_13+dt_14;
				if(value)
					dt_s_x=2;

		if(dt_s_x)
			flag_stop=1;
	}
} 
/******************主程序**********************/	   
void main()
{
	time_init();   //定时器初始化
	while(1)
	{
		if(hw == 0)	//正常工作
		{
			key();		  //按键程序
	  		key_with();		
	 		dis_smg[1] = smg_du[dt_value % 10];	  //显示楼层
			dis_smg[0] = smg_du[dt_value / 10];	  //显示楼层
			led_dong();
			//display();		//数码管显示函数
	 		
	 		if(flag_100ms  == 1)
			{
				flag_100ms = 0;
				td_dis();		 //电梯处理函数
				if(flag_stop==0)
					start();	 //启动电梯
	 		}
		}
		else   // 红外防夹 禁止工作
		{
			beep = 0;
			delay_1ms(100);
			beep = 1;
			delay_1ms(100);
		}
	}
}

/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{	
	TH0 = 0x3c;
	TL0 = 0xb0;         // 50ms
	if(time1<20)
		time1++;
	else
	{
		time1=0; 
		flag_100ms = 1 ;
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cqtianxingkeji

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值