单片机交流
直播中

潘飘稚

7年用户 868经验值
私信 关注
[问答]

如何利用51单核开发板制作了一个模拟电梯控制系统

模拟电梯控制系统有哪些功能?
如何利用51单核开发板制作了一个模拟电梯控制系统?

回帖(1)

张飞雄

2021-10-26 16:29:08
  前言
  这篇以“普中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个独立按键
  ***it k1 = P3^1;
  ***it k2 = P3^0;
  ***it k3 = P3^2;
  ***it k4 = P3^3;
  ***it beep = P1^5;
  ***it 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开发板”为硬件,制作了一个模拟电梯控制系统。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分