一、系统方案
 1、本设计采用51单片机作为主控器。
 2、液晶显示楼层。
 3、防超重,防气体报警、防夹报警。
 
二、硬件设计
 原理图如下:
 
三、单片机软件设计
 1、首先是系统初始化
 /lcd1602初始化设置*/
 void init_1602() //lcd1602初始化设置
 {
 write_com(0x38); 
 write_com(0x0c);
 write_com(0x06);
 }
 2、液晶显示程序
 void delay_uint(uint q)
 {
 while(q–);
 }
/********************************************************************
- 名称 : write_com(uchar com)
- 功能 : 1602命令函数
- 输入 : 输入的命令值
- 输出 : 无
 ***********************************************************************/
 void write_com(uchar com)
 {
 e=0;
 rs=0;
 //rw=0;
 P0=com;
 delay_uint(3);
 e=1;
 delay_uint(25);
 e=0;
 }
/********************************************************************
- 名称 : write_data(uchar dat)
- 功能 : 1602写数据函数
- 输入 : 需要写入1602的数据
- 输出 : 无
 **********************************************************************/
 void write_data(uchar dat)
 {
 e=0;
 rs=1;
 //rw=0;
 P0=dat;
 delay_uint(3);
 e=1;
 delay_uint(25);
 e=0;
 }
 /lcd1602上显示这字符函数/
 void write_string(uchar hang,uchar add,uchar *p)
 {
 if(hang==1)
 write_com(0x80+add);
 else
 write_com(0x80+0x40+add);
 while(1)
 {
 if(*p == ‘\0’) break;
 write_data(*p);
 p++;
 }
 }
 3、按键电路程序
 void key() //按键程序
 {
 if(key1 == 0) //1楼按键按下
 {
 led1 = 1; //点亮1楼发光二极管
 dt_1 = 1; //1楼电梯按下变量置1
 }
 if(key2 == 0) //2楼按键按下
 {
 led2 = 1; //点亮2楼发光二极管
 dt_2 = 1; //2楼电梯按下变量置1
 }
 if(key3 == 0) //3楼按键按下
 {
 led3 = 1; //点亮3楼发光二极管
 dt_3 = 1; //3楼电梯按下变量置1
 }
 if(key4 == 0) //4楼按键按下
 {
 led4 = 1; //点亮4楼发光二极管
 dt_4 = 1; //4楼电梯按下变量置1
 }
 if(key5 == 0) //5楼按键按下
 {
 led5 = 1; //点亮5楼发光二极管
 dt_5 = 1; //5楼电梯按下变量置1
 }
 if(key6 == 0) //6楼按键按下
 {
 led6 = 1; //点亮6楼发光二极管
 dt_6 = 1; //6楼电梯按下变量置1
 }
 if(key7 == 0) //7楼按键按下
 {
 led7 = 1; //点亮7楼发光二极管
 dt_7 = 1; //7楼电梯按下变量置1
 }
 if(key8 == 0) //8楼按键按下
 {
 led8 = 1; //点亮8楼发光二极管
 dt_8 = 1; //8楼电梯按下变量置1
 }
 }
 4、核心算法程序
 /电梯向上、做最后的判断是否还要继续向上/
 void dt_shang_guan()
 {
 static 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;
 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;
 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;
 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;
 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;
 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;
 if(value == 0) //说明上面没有人按下
 {
 dt_s_x = 0; //电梯停下不动了
 shang = 1; //关闭上箭头
 zhong = 1;
 }else
 flag_stop = 1; //电梯继续运行
 }
 else if(dt_value == 7) //在第7层
 {
 value = dt_8;
 if(value == 0) //说明上面没有人按下
 {
 dt_s_x = 0; //电梯停下不动了
 shang = 1; //关闭上箭头
 zhong = 1;
 }else
 flag_stop = 1; //电梯继续运行
 }
 else if(dt_value == 8) //在第8层
 {
 dt_s_x = 0; //电梯停下不动了
 shang = 1; //关闭上箭头
 zhong = 1;
 }
 }
 }
 四、 proteus仿真设计
 Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
  






![[Linux] shell脚本相关知识](https://img-blog.csdnimg.cn/b94964fbc20348c898952dfc0115980f.png)












