51单片机模拟电梯控制(含完整代码)

51单片机模拟电梯控制

前言

这篇博客以“普中51-单核-A2开发板”为硬件,制作了一个模拟电梯控制系统;

一、普中51-单核-A2开发板

该开发板的相关电路图可去这个网站下载:普中科技
51单片机模拟电梯控制(含完整代码)

二、系统功能

  • 矩阵按键S1 ~ S4分别代表1楼,2楼下,2楼上,3楼的电梯外请求按键;
  • 独立按键K1~K3代表电梯内按键,分别代表123楼;+ 数码管显示当前电梯所在楼层,每上升,下降一层,均耗时约2秒
  • K4控制蜂鸣器报警
  • led灯代表电梯门开关状态,led亮就表示开门,灭就表示关门了;
  • 先按下矩阵按键,电梯会移动到对应呼叫楼层,然后开门(led亮),2秒后关门;
  • 之后等待电梯内按键(独立按键K1~K3),电梯就会移动到目标楼层,开门,2秒后关门;
  • 然后重新等待电梯外呼叫(矩阵按键)
  • 2楼上呼叫,电梯内按键只有K3(去三楼)有效;
  • 2楼下呼叫,电梯内按键只有K1(去一楼)有效;

三 、预定义

#include "reg52.h" 
typedef unsigned int u16;
typedef unsigned char u8;
//定义4个独立按键
sbit k1 = P3^1;
sbit k2 = P3^0;
sbit k3 = P3^2;
sbit k4 = P3^3;
sbit beep = P1^5;	 
sbit led = P2^0;
#define GPIO_DIG P0 //控制数码管显示引脚
#define GPIO_KEY P1 //矩阵按键控制端口
u8 KeyValue;//存储当前矩阵按键的值
u8 code smgduan[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
					0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管显示对应值

四、电梯内按有报警按键,该功能由外部中断功能和蜂鸣器实现

void Int1Init()//开启外部中断1(蜂鸣器报警用)
{
	IT1=1;
	EX1=1;
	EA=1;
}
void Int1()	interrupt 2 //外部中断1函数
{
	delay(1000);
	if(k4==0)
	{
		beep = ~beep;//k4触发蜂鸣器报警,蜂鸣器响/不响
	}
}

五、延时函数-----电梯每上升,下降一层和开门关门的时间,均为2秒;

void delay(u16 i)//延时函数
{
	while(i--);	
}
void delay_2s()//延时2s
{
	delay(2000000);
}

六、按键检测函数

void KeyDown(void)//检测矩阵按键的值,返回给keyvalue
{
	char a=0;
	GPIO_KEY=0x0f;
	if(GPIO_KEY!=0x0f)
	{
		delay(1000);
		if(GPIO_KEY!=0x0f)
		{	
			GPIO_KEY=0X0F;
			switch(GPIO_KEY)
			{
				case(0X07):	KeyValue=0;break;
				case(0X0b):	KeyValue=1;break;
				case(0X0d): KeyValue=2;break;
				case(0X0e):	KeyValue=3;break;
			}
			GPIO_KEY=0XF0;
			switch(GPIO_KEY)
			{
				case(0X70):	KeyValue=KeyValue;break;
				case(0Xb0):	KeyValue=KeyValue+4;break;
				case(0Xd0): KeyValue=KeyValue+8;break;
				case(0Xe0):	KeyValue=KeyValue+12;break;
			}
			
		}
	}
	while((a<50)&&(GPIO_KEY!=0xf0))
	{
		delay(100);
		a++;
	}
}

int keypros(void)//检测独立按键的值,返回0代表没按按键,1代表按下了key1.。。。。
{
	if(k1==0)
	{	
		delay(1000);
		if(k1==0)
		{
			while(!k1);
			return 1;
		}
		else return 0;
	}		
	else if(k2==0)
	{	
		delay(1000);
		if(k2==0)
		{
			while(!k2);
			return 2;
		}
		else return 0;
	}	
	else if(k3==0)
	{	
		delay(1000);
		if(k3==0)
		{
			while(!k3);
			return 3;
		}
		else return 0;
	}	
	else return 0;
}

七、主函数

int main()
{	
	char level = 1;//当前楼层
	char key = 0;//独立按键
	beep = 1;//蜂鸣器
	led = 1;//led灯
	GPIO_DIG=~smgduan[level];//显示当前楼层
	Int1Init();//外部中断1初始化
	while(1)
	{	
		KeyValue = 10;//矩阵按键的值在0~3,这里代表没有按下
		key = 0;//独立按键值
		while(KeyValue > 4)//如果按下了,矩阵按键值应为0~3,否则等待矩阵按键按下(电梯外呼叫)
		{
			KeyDown();
		}
		if(KeyValue == 0)//如果1楼呼叫
		{ 
			while(level!=1)//去1楼
			{
				level = level - 1;
				delay_2s();
				GPIO_DIG=~smgduan[level];				
			}
			led = 0;//开门,2秒后关门
			delay_2s();
			led = 1;
			while(!key)//等待电梯内按键按下
			{
				key = keypros();
			}
			if(key == 1)//如果去1楼,什么也不执行,升到对应楼层后的开关门在后面写着
			{
				key = 1;
			}
			else if(key == 2)//如果去2楼,升到2楼
			{
				level = 2;
				delay_2s();
				GPIO_DIG=~smgduan[level];				
			}
			else //否则就是去3楼,升到3楼
			{
				while(level!= 3)
				{
					level = level + 1;
					delay_2s();
					GPIO_DIG=~smgduan[level];				
				}
			}
		}
		else if(KeyValue == 1)//如果是2楼下呼叫
		{ 
				if(level != 2)//如果当前不在2楼,电梯去2楼
				{
					level = 2;
					delay_2s();
					GPIO_DIG=~smgduan[level];
				}
				led = 0;//开门,关门
				delay_2s();
				led = 1;
				while(key != 1)//如果电梯内不按键去1楼,等待
				{
					key = keypros();
				}
				level = 1;//去1楼
				delay_2s();
				GPIO_DIG=~smgduan[level];
			}
		else if(KeyValue == 2)//如果是2楼上呼叫
		{ 
				if(level != 2)//当前电梯不在2楼,就让电梯来二楼
				{
					level = 2;
					delay_2s();
					GPIO_DIG=~smgduan[level];
				}
				led = 0;
				delay_2s();
				led = 1;
				while(key != 3)//电梯内是否请求去三楼,不是就继续等待
				{
					key = keypros();
				}
				level = 3;//去3楼
				delay_2s();
				GPIO_DIG=~smgduan[level];
			}	
		else if(KeyValue == 3)//是否电梯外3楼呼叫
		{
			while(level != 3)//当前电梯在3楼?不在就升到3楼
			{
				level = level + 1;
				delay_2s();
				GPIO_DIG=~smgduan[level];				
			}
			led = 0;
			delay_2s();
			led = 1;
			while(key == 0)//等待电梯内按键按下
			{
				key = keypros();
			}
			if(key == 3)//去3楼?
			{
				key=3;
			}
			else if(key == 2)//去2楼?
			{
				level = 2;
				delay_2s();
				GPIO_DIG=~smgduan[level];				
			}
			else //去1楼?
			{
				while(level!= 1)
				{
					level = level - 1;
					delay_2s();
					GPIO_DIG=~smgduan[level];				
				}
			}
		}
		led = 0;//电梯到达目的地,开门延时2秒后,关门
		delay_2s();
		led = 1;
	}
}

总结

这篇博客以“普中51-单核-A2开发板”为硬件,制作了一个模拟电梯控制系统;

上一篇:04BaseRoleServlet


下一篇:51单片机制作简易计算器(动态数码管、矩阵按键)