51单片机模拟电梯控制
- 前言
- 一、普中51-单核-A2开发板
- 二、系统功能
- 三 、预定义
- 四、电梯内按有报警按键,该功能由外部中断功能和蜂鸣器实现
- 五、延时函数-----电梯每上升,下降一层和开门关门的时间,均为2秒;
- 六、按键检测函数
- 七、主函数
- 总结
前言
这篇博客以“普中51-单核-A2开发板”为硬件,制作了一个模拟电梯控制系统;
一、普中51-单核-A2开发板
该开发板的相关电路图可去这个网站下载:普中科技
二、系统功能
- 矩阵按键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开发板”为硬件,制作了一个模拟电梯控制系统;