找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 9109|回复: 1
打印 上一主题 下一主题
收起左侧

基于单片机设计的8层电梯模拟系统

[复制链接]
跳转到指定楼层
楼主
ID:289106 发表于 2018-5-2 15:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目录
摘要.............................................................................................................................................. I
Abstract........................................................................................................................................ II
1  绪论........................................................................................................................................ 1
1.1  课题背景....................................................................................................................... 1
1.2  电梯的发展趋势............................................................................................................ 1
1.3  设计目的....................................................................................................................... 3
1.4  本设计完成的工作......................................................................................................... 3
2  总体方案设计.......................................................................................................................... 4
2.1  硬件设计....................................................................................................................... 4
2.2.1  引言................................................................................................................... 4
2.1.2  主控芯片选择..................................................................................................... 4
2.1.3  电源选取............................................................................................................ 5
3  硬件实现及单元电路设计......................................................................................................... 5
3.1  主控制模块................................................................................................................... 5
3.2  单片机的时钟电路与复位电路设计................................................................................ 5
3.3  电源设计....................................................................................................................... 6
3.4  电梯呼叫按键电路......................................................................................................... 6
3.5  楼层显示和楼层指示电路图........................................................................................... 7
3.6  电梯上下指示电路......................................................................................................... 7
3.7  声音提醒电路................................................................................................................ 8
4  系统软件设计方案................................................................................................................... 8
4.1  主程序流程图................................................................................................................ 8
4.2  电梯各情况下所对应的处理方法.................................................................................. 10
4.3  本章小结..................................................................................................................... 10
5  系统的安装与调试.................................................................................................................. 11
5.1 安装步骤....................................................................................................................... 11
结论............................................................................................................................................ 11
致谢............................................................................................................................................ 11
参考文献..................................................................................................................................... 12
附录1  整机电路原理图............................................................................................................. 13
附录2   部分源程序................................................................................................................... 14


摘要
    本文介绍了一种采用STC89C52芯片进行的电梯模拟控制系统,介绍了如何使用单片机进行编程来实现电子控制的方法。单片机编程实现功能,简洁多变,大大缩短了研发周期,同时能使电梯控制系统体积更小功能更强大。本设计模拟了电梯控制系统所需的一些基本功能,能通过能通过按键选择楼层,数码管显示实时楼层数,LED灯组成的箭头指示上下方向。本次设计更注重了把一些所学的知识加入到设计中。主要包括采用了STC89C52芯片,使用C语言进行编程,使其具有了更强的移植性,更加利于产品的开发。

1.2 电梯的发展趋势
    绿色化:绿色理念是电梯发展总趋势。发展趋势主要有如下:不断改进产品的设计、生产环保型低能耗、低噪声、无漏油、无漏水、无电磁干扰、无井道导轨油渍污染的电梯。电梯曳引采用尼龙合成纤维曳引绳、钢皮带等无润滑油污染曳引方式。电梯装璜将采用无(少)环境污染材料、电梯空载上升和满载下行电机再生发电回收技术,安装电梯将无需安装脚手架,电梯零件在生产和使用过程中对环境没有影响(如刹车皮一定不能使用石棉)并且材料是可以回收的。
   降低能耗:减少电梯能耗的措施是多方面的。主要包括:选择减小电梯机械系统的惯性和磨擦阻力;合理运用对重和平衡重。驱动系统使用永磁同步无齿轮曳引机从永磁同步电机工作原理可知其励磁是由永磁铁来实现的,不需要定子额外提供励磁电流 因而电机的功率因数,可以达到很高(理论上可以达到1)。同时永磁同步电机的转子无电流通过,不存在转子耗损问题,一般比异步电机降低45%~60%耗损。由于没有效率低,高能耗蜗轮蜗杆传动副,能耗进一步降低。在停站较少的群梯布置中,一个主机驱动两个轿厢分别上下运行是一种节能的方案。而减少能耗的另一途径是电梯运行过程的能耗控制。利用电梯空载上行、满载下行时电机处以发电状态的特性,将再生能量反馈给电网,这种节能措施在高速梯上效果显著。还有一种节能方案将在软件控制中得以实现。如建立实时控制的交通模式,尽量以较少的运行次数来运载较多的乘客,使电梯的停站次数减至最少。电梯召唤与轿厢指令合一的楼层入口乘客登记方案是电梯控制方式的一项革命性技术,使原来层站上乘客未知的目的层变得一目了然,从而使控制系统的派梯效率达到最高。减少运行过程能耗的另一措施是将电梯运行中的加减速度模式设置成变参数,即电梯控制系统中运行的速度、加速度以及加速度变化率曲线既随运行距离变化,也随轿厢负载变化通过仿真软件模拟,确定出不同楼层之间的最佳运行曲线。利用电梯机房在楼顶的优势,充分利用太阳能作为电梯的补充能源也将是新的研究课题。
   智能化:随着计算机技术,通讯技术与控制技术的发展使大厦的智能化成为现实,而电梯是智能建筑中的重要交通工具,其技术发展及智能化程度也倍受世人关注。智能化的电梯首先要与智能大厦中所有自动化系统联网,如与楼宇控制系统、消防系统、保安监控系统等交互联系,使电梯成为高效优质、安全舒适的服务工具。
从电梯运行的控制智能化角度讲,要求电梯有优质的服务质量,控制程序中应采用先进的调度规则,使群控管理有最佳的派梯模式。现在的群控算法中已不是单一地依赖“乘客等候时间最短”为目标,而是采用模糊理论、神经网络、专家系统的方法,将要综合考虑的因素(即专家知识)吸收到群控系统中去,在这些因素中既有影响乘客心理的因素,也有对即将要发生的情况作评价决策,是专家系统和电梯当前运行状态组合在一起的多元目标控制。利用遗传算法对客流交通模式及派梯规则进行优化、自学习,实现电梯调度规则的进化,以适应环境的变化。“以人为本”设计的电梯控制系统,将会使电梯的服务质量越来越好。
1.3  设计目的
   目前电梯控制系统大多采用继电器或者可编程控制器(PLC)的控制方式,存在着成本高,需要三相供电等缺点,本设计给出了一种基于单片机的电梯模型控制系统设计。以单片机为核心,再辅以适当的硬件电路和控制程序来检测和控制整个电梯的信号,具有成本低、通用性强、灵活性大、扩展容易及易于实现复杂控制等优点。本设计注重基本理论知识与实际情况的紧密结合,同时对学生独立创新和分析问题的能力进行培养,加深对知识的理解,为以后的工作和学习打下坚实的基础
1.4  本设计完成的工作
1、设计电路模拟8层电梯运行
2、设置电梯的每一层按键,每按下一个按键有相应的二极管指示。
3、电梯具有向上还是向下指示,同时能显示到了哪一层
4、电梯无人时,应默认停在第一层
5、自行构建基于单片机的最小系统,完成相关硬件电路的设计实现;

   
2  总体方案设计
系统采用STC89C52单片机作为核心控制单元用于智能车系统的控制,小车车头装有5个ST178红外光电传感器,检测地面黑线。ST178光电传感器将地面黑线转化成电信号,用于判断是否需要转弯和小车是否偏离跑道。系统总体的设计方框图如图1所示。



图1 系统总体方框图
2.1  硬件设计
2.2.1  引言
    由于电梯要运送客人到不同楼层,所以每一层都要有按键才可以满足不同楼层顾客的需求。而且,电梯还要有人性化的显示,如哪个按钮按下了,就把它对应楼层按钮的二极管点亮,还要有一个数码管实时显示电梯所在层数,用发光二极管组成的上下箭头来表示电梯当前的运行方向等等。而这些零碎的原件,又需要高效的芯片来控制,它们相互之间的物理连接问题这些就是本章所要叙述的硬件设计部分。
2.1.2  主控芯片选择
    考虑到现在市场上能够买到的芯片以及系统要求实现的功能来看,采用STC89C52单片机。STC89C52单片机是CMOS工艺的8位单片机,片内含有8KB可反复擦写的只读程序存储器和256字节的随机存取存储器,片内置通用8位中央处理器(CPU)和Flash 存储单元,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C52具有以下标准功能:8k字节Flash,256字节RAM,32位I/O口线,2个数据指针,看门狗定时器,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。这一模块以单片机为中心把程序代码烧进去然后外围接上复位电路、振荡电路、键盘控制、LED显示电路、报警电路等子模块。
2.1.3  电源选取
     由于本系统是模拟电梯系统,我们采用9V直流电源为系统供电。经过7805稳压后为单片机,指示灯,数码管供电。经过实验验证系统工作时,数码管、单片机、指示灯工作稳定能够满足系统的要求。
3  硬件实现及单元电路设计3.1  主控制模块
主控制最小系统电路如图2所示。
图2 单片主控电路
3.2  单片机的时钟电路与复位电路设计
本系统采用STC89C52单片机,要使单片机工作起来,就必须有电源,晶振,复位电路。本系统采用外部方式的时钟电路和按键复位的复位电路,如下图3图4所示:  
                图3 时钟电路                    
图4 复位电路
3.3  电源设计
    供电电源电路如图5,9V电源经78L05稳压后输出5V供系统供电。D25为电源指示灯。C4、C6、C7、C5为电源滤波电容。
图5 电源电路
3.4  电梯呼叫按键电路
   本系统模拟的是8层楼电梯,所以有8个按键,每一个按键对应一层楼。8个按键接在P2口。
图6 电梯呼叫按键电路图
3.5  楼层显示和楼层指示电路图
图7 电路图
本系统总共8层,如图7楼层显示采用一位共阴数码管显示,每个楼层按键按下指示灯为8个发光二极管。
3.6  电梯上下指示电路
    电梯上下指示采用发光二级管组成一个箭头,当电梯向上时,点亮向上的箭头,向下时点亮向下的箭头。电路图如图8所示
图8 红外光电传感器安装
3.7  声音提醒电路
    当电梯到达每一层时通过蜂鸣器声音提醒,电路如图9
图9 声提醒电路
4 系统软件设计方案
4.1  主程序流程图
电梯所处的状态是整个程序成功运行的核心保证。在电梯每经过一个楼层时,就会自动调用该函数,它的作用是基于高效率、短时间、人性化的基础上,合理智能的对电梯的运行进行调度,结合实际情况,最终得出电梯下一个目标停留楼层。其流程如图10所示。
图10 主程序流程图
    由图可知,程序中将实际情况分为四种情况来判断:电梯上行且是去送人(即电梯此时位于底层,而高层有人呼叫要上楼)、电梯上行且是去接人(即电梯此时位于底层,而高层有人呼叫要下楼)、电梯下行且是去送人(即电梯此时位于高层,而低层有人呼叫要下楼)、电梯下行且是去接人(即电梯此时位于高层,而低层有人呼叫要上楼)。
    而这四种情况,也就包含了实际电梯中的绝大部分情况。情况不同,分析的方法也当然不一样。而首先,我们要了解电梯是如何得知此时它是上面四种的哪一种情况的呢?
    这可以分为两个步骤:第一判断电梯是上行还是下行;第二,判断是去接人还是去送人。当然,第一个是最好判断的,因为电梯在运行时,有两个与楼层有关的变量,一个为当前所在楼层值,一个为目标楼层值,当电梯运行时,会让这两个值进行比较,若前者大于后者,就为下行,从而让状态变量清零(由于电路中上下行的箭头使用了非门,故在程序中,两表示上下行的状态变量清零时表示有效);反之,当前者小于后者,即为上行,从而上行变量清零。
    至于是接人还是送人,是判别的难点。在此,巧妙地利用了两个状态变量scanup和scandown,前者等于所有上行按键和去几层按键状态变量的或,后者等于所有上行按键和去几层按键状态变量的或。由此可知,当上行按键和去几层按键均为0时,电梯仍为上行状态,那么此时,电梯的状态肯定处于上楼接人的状态中(即在高层,有人按了下行键)。反之,若它们中有一个为1(且按键所处楼层高于当前电梯所在楼层,这个由其他函数来限定,防止电梯在上行过程中受已经过楼层按键按下时的干扰),则电梯此时处于上楼送人状态,就会执行对应的子程序。其他的与此同理。
4.2  电梯各情况下所对应的处理方法
    以电梯上行的两种状态为例。
    在实际应用中,最简单的情况莫过于电梯当前为闲置状态,然后有一人按下按键呼叫,然后电梯便响应呼叫。但是,实际情况往往比这复杂的多,在第一个人按下按键电梯运行的过程中,还很有可能会有其他不同楼层的人按下不同的按键(上行或者下行)的情况发生。那么就必须得为电梯规定好一个特定的优先级规则,让其依据这个规则来运行,以免乱作一团。那么这个规则就必须要高效且人性化,在此,我们规定,当电梯上行时,均不理会那些按下行按键的顾客。并且,若在上行过程中,也有人在某层按的是上行按键,但是电梯此时已经走过了该层,那么电梯也绝对不会再选择先下行接他。当然,当将高层上行的顾客送完后(此时一般来说电梯已经处于高层了),电梯便会检测下行按键,若更高层有人呼叫下行,则电梯会选择先去响应他们,然后再下行的过程中依次响应按了下行处于等待中的顾客,最后这些顾客都送完后,再去相应那些电梯上行过程中,处于比电梯低的楼层却按了上行键的顾客。
    简单地说,若电梯处于上行状态,则在该过程中响应不同顾客的优先级(或者电梯响应的先后顺序)为:高层呼叫上行顾客>高层呼叫下行顾客>底层呼叫下行顾客>底层呼叫上行顾客。那么,当电梯通过程序运行得知到相应状态后,又是如何具体的判断当天所锁定的目标楼层是否要变更呢?现以上行为例,加以详细说明:上行,且是送人,比如电梯当前在二层,五楼有人呼叫上楼,那么它就要响应这一呼叫,从而把自己的目标楼层锁定为五楼并向上运行,而在五楼呼叫后不久,四楼也有人呼叫上楼(且电梯此刻还未运行到六楼),那么在电梯运行中,没经过一个楼层,会做一次判决,因为四楼也有人呼叫,所以正常情况下,它应该在判决后将目标楼层定位四楼。而若四楼的顾客按下的是下行键,或者二楼的人按下呼叫键,电梯此时都会暂时不予理会。部分程序代码见附录。
4.3  本章小结
    本章介绍的是整体流程图以及工作原理。
5  系统的安装与调试5.1 安装步骤
1.检查元件的好坏
按电路图买好元件后首先检查买回元件的好坏,按各元件的检测方法分别进行检测,一定要仔细认真。而且要认真核对原理图是否一致,在检查好后才可上件、焊件,防止出现错误焊件后不便改正。
2.放置、焊接各元件
按原理图的位置放置各元件,在放置过程中要先放置、焊接较低的元件,后焊较高的和要求较高的元件。特别是容易损坏的元件要后焊,在焊集成芯片时连续焊接时间不要超过10s,注意芯片的安装方向。
结论
   经过几十天的艰苦奋斗,我最终完成了毕业设计的基本要求。在大学的最后一个学期里,我学到了很多的知识和技能。通过本次毕业设计,我掌握了做科学研究的基本方法和思路,为今后的工作打下了坚实的基础。
   首先,我学会了对相关文献的检索。随着计算机的普及以及网络技术的发展,对文献的检索,收集资料的形式也变得越来越丰富。我们一方面可以利用学校图书馆资源,另一方面可以利用网络来检索资源,例如中国知网CNKI、IEEE、万方数据库、百度文库、豆丁文库等数据库系统。
   其次,通过这次毕业设计,培养了我的动手能力,使我进一步了解毕业设计的基本知识。巩固了我的知识架构体系,强化了我对大学期间所学到的基础课以及专业课的认识和理解,为今后的工作打下理论基础。
最后,通过本次毕业设计,使我懂得在遇到困惑和不解时要及时与老师和其他同学沟通,这样才能更迅速地解决设计中遇到的问题,提供工作效率。
总之,这次毕业设计不是一次简简单单地完成一个课题。它不仅让我锻炼了动手操作能力和分析解决问题的能力,巩固了我的专业知识,还让我学到了很多东西,为我今后的工作打下基础。
致谢
大学四年即将画上一个句号了,毕业设计是我在学校交的最后一份答卷。在论文完成之际,感受收获喜悦的同时,心中充满了更是感激之情。
首先感谢学校给我们提供的条件使我们有了一个可以对大学四年的知识进行温习总结并付诸实践的机会。在此次毕业设计过程中,特别要感谢我的毕业实际指导老师,感谢您在这段日子里对我亲切的关怀和悉心的指导。老师在我遇到难题时,不但给予我技术上的帮助,更教会我诸多检查及解决问题的方法。老师渊博的知识以及对待学生的耐心和责任感,不仅让我对专业知识有了更深的理解,还教会了我们今后面对工作生活的态度。
借此机会,我也感谢大学四年期间所有指导过我的老师,感谢他们对我无私的教诲和帮助,感谢他们的谆谆教导。
在此同时,我也要感谢一直陪伴在我身边给予我精神支持和行动支持的同学们,正是由于你们的帮助和支持,我才能克服一个又一个的困难,并且让我从你们身上学到了很多知识。
参考文献
[1]童诗白 华成英 编著《模拟电子技术基础》 高等教育出版社  2011年5月
[2]李朝青 编著《单片机原理及接口技术》 北京航天航空大学出版社 2011年1月
[3]马忠梅  编著 《单片机的C语言应用程序设计》     航空航天出版社 2003年7月
[4]佘新平 编著《数字电子技术》 华中科技大学出版社  2011年2月
[5]薛永毅 王淑英 何希才 编著《新型电源电路应用实例》 电子工业出版社     2001年10月
附录1  整机电路原理图
附录2   部分源程序
#include <reg52.h>            //调用单片机头文件
#define uchar unsignedchar  //无符号字符型 宏定义  变量范围0~255
#define uint  unsigned int      //无符号整型 宏定义    变量范围0~65535
//数码管段选定义       0    1   2    3   4          5      6      7     8    9      
uchar codesmg_du[]={0xde,0x90,0xcd,0xd9,0x93,0x5b,0x5f,0xd0,0xdf,0xdb
//                                   A     B     C    D          E   F    不显示
                                    };   //断码  
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};
bit flag_100ms,flag_1s;   
bit flag_stop = 1;   //用做到了相应的楼停下
sbit beep  = P2^6;
sbit xia   = P2^0;
sbit zhong = P2^1;
sbit shang = P2^2;
uchar value2;
sbit led1 = P1^0;   //8个发光二极管定义
sbit led2 = P1^1;
sbit led3 = P1^2;
sbit led4 = P1^3;
sbit led5 = P1^4;
sbit led6 = P1^5;
sbit led7 = P1^6;
sbit led8 = P1^7;
uchar dt_1;  //1楼电梯标志位
uchar dt_2;  //2楼电梯标志位
uchar dt_3;  //3楼电梯标志位
uchar dt_4;  //4楼电梯标志位
uchar dt_5;  //5楼电梯标志位
uchar dt_6;  //6楼电梯标志位
uchar dt_7;  //7楼电梯标志位
uchar dt_8;  //8楼电梯标志位
uchar dt_value = 1;  //电梯到哪一层的变量
uchar dt_s_x ;    //电梯上下的标志位
/***********************1ms延时函数*****************************/
void delay_1ms(uint q)
{
       uint i,j;
       for(i=0;i<q;i++)
              for(j=0;j<120;j++);
}
/********************独立按键程序*****************/
uchar key_can;     //按键值
void key()      //独立按键程序
{
       static uchar key_new;
       key_can = 20;                  //按键值还原
       P3 |= 0xff;
       if((P3 & 0xff) != 0xff)             //按键按下
       {
              delay_1ms(1);              //按键消抖动
              if(((P3 &0xff) != 0xff) && (key_new == 1))
              {                                        //确认是按键按下
                     key_new = 0;
                     switch(P3)
                     {
                            case0xfe: key_can = 1; break;   //得到按键值
                            case0xfd: key_can = 2; break;         //得到按键值
                            case0xfb: key_can = 3; break;   //得到按键值
                            case0xf7: key_can = 4; break;   //得到按键值
                            case0xef: key_can = 5; break;   //得到按键值
                            case0xdf: key_can = 6; break;         //得到按键值
                            case0xbf: key_can = 7; break;   //得到按键值
                            case0x7f: key_can = 8; break;   //得到按键值
                     }
              }                  
       }
       else
              key_new = 1;      
}
void key_with()
{
       if(key_can == 1)
       {
              led1 = 1;        //点亮发光二极管
              dt_1 = 1;       //
       }            
       if(key_can == 2)
       {
              led2 = 1;        //点亮发光二极管
              dt_2 = 1;
       }     
       if(key_can == 3)
       {
              led3 = 1;       //点亮发光二极管
              dt_3 = 1;
       }     
       if(key_can == 4)
       {
              led4 = 1;       //点亮发光二极管
              dt_4 = 1;
       }     
       if(key_can == 5)
       {
              led5 = 1;       //点亮发光二极管
              dt_5 = 1;
       }     
       if(key_can == 6)
       {
              led6 = 1;       //点亮发光二极管
              dt_6 = 1;
       }     
       if(key_can == 7)
       {
              led7 = 1;      
              dt_7 = 1;
       }     
       if(key_can == 8)
       {
              led8 = 1;      
              dt_8 = 1;
       }     
}
/*********************当电梯不动时、判断是向上、还是向下**********************/
void tiandi_shang_xia()
{
       static uchar value;
       if(dt_s_x == 0)
       {
              
              flag_stop = 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= 1;   //电梯向上      
                            shang= 0;      //显示上
                            zhong= 0;   
                            xia= 1;                             
                     }
              }                  
              if(dt_value == 2)  //电梯在第2层停下不走了
              {
                     value = dt_3 + dt_4 + dt_5 + dt_6 + dt_7+ dt_8;
                     if(value != 0)
                     {
                            dt_s_x= 1;   //电梯向上走   
                            shang= 0;      //显示上
                            zhong= 0;   
                            xia= 1;                             
                     }
                     value = dt_1;
                     if(value != 0)
                     {
                            dt_s_x= 2;   //电梯向下走   
                            xia= 0;   //显示下
                            zhong= 0;   
                            shang= 1;                                      
                     }     
              }
              if(dt_value == 3)  //电梯在第3层停下不走了
              {
                     value = dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
                     if(value != 0)
                     {
                            dt_s_x= 1;   //电梯向上走   
                            shang= 0;      //显示上
                            zhong= 0;   
                            xia= 1;                             
                     }
                     value = dt_1 + dt_2;
                     if(value != 0)
                     {
                            dt_s_x= 2;   //电梯向下走   
                            xia= 0;   //显示下
                            zhong= 0;   
                            shang= 1;     
                                                              
                     }     
              }     
              if(dt_value == 4)  //电梯在第4层停下不走了
              {
                     value = + dt_5 + dt_6 + dt_7 + dt_8;
                     if(value != 0)
                     {
                            dt_s_x= 1;   //电梯向上走   
                            shang= 0;      //显示上
                            zhong= 0;   
                            xia= 1;                             
                     }
                     value = dt_1 + dt_2 + dt_3;
                     if(value != 0)
                     {
                            dt_s_x= 2;   //电梯向下走   
                            xia= 0;   //显示下
                            zhong= 0;   
                            shang= 1;                                      
                     }     
              }     
              if(dt_value == 5)  //电梯在第5层停下不走了
              {
                     value = dt_6 + dt_7 + dt_8;
                     if(value != 0)
                     {
                            dt_s_x= 1;   //电梯向上走   
                            shang= 0;      //显示上
                            zhong= 0;
                            xia= 1;                                   
                     }
                     value = dt_1 + dt_2 + dt_3 + dt_4;
                     if(value != 0)
                     {
                            dt_s_x= 2;   //电梯向下走   
                            xia= 0;   //显示下
                            zhong= 0;   
                            shang= 1;                                      
                     }     
              }     
              if(dt_value == 6)  //电梯在第5层停下不走了
              {
                     value = dt_7 + dt_8;
                     if(value != 0)
                     {
                            dt_s_x= 1;   //电梯向上走   
                            shang= 0;      //显示上
                            zhong= 0;
                            xia= 1;                                   
                     }
                     value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5;
                     if(value != 0)
                     {
                            dt_s_x= 2;   //电梯向下走   
                            xia= 0;   //显示下
                            zhong= 0;   
                            shang= 1;                                      
                     }     
              }     
              if(dt_value == 7)  //电梯在第5层停下不走了
              {
                     value = dt_8;
                     if(value != 0)
                     {
                            dt_s_x= 1;   //电梯向上走   
                            shang= 0;      //显示上
                            zhong= 0;   
                            xia= 1;                             
                     }
                     value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5+ dt_6;
                     if(value != 0)
                     {
                            dt_s_x= 2;   //电梯向下走   
                            xia= 0;   //显示下
                            zhong= 0;   
                            shang= 1;                                      
                     }     
              }     
              if(dt_value == 8)   //电梯在第5层停下不走了
              {
                     value = dt_8;
                     if(value != 0)
                     {
                            dt_s_x= 1;   //电梯向上走   
                            shang= 0;      //显示上
                            zhong= 0;   
                            xia= 1;                             
                     }
                     value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5+ dt_6;
                     if(value != 0)
                     {
                            dt_s_x= 2;   //电梯向下走   
                            xia= 0;   //显示下
                            zhong= 0;   
                            shang= 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;
                     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_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;         
              }            
       }     
}
/****************电梯向下、做最后的判断是否还要继续向下****************/
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_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_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_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_3 + dt_4 + dt_5 + dt_6 + dt_7;
                     if(value == 0)       //说明上面没有人按下
                     {
                            dt_s_x= 0;  //电梯停下不动了  
                            xia= 1;         //关闭上字
                            zhong= 1;  
                     }else
                            flag_stop= 1;      
                     
              }            
       }            
}
/***********************电梯处理函数************************/
void td_dis()
{
       uchar value,value1;
       value = dt_1 + dt_2 + dt_3 + dt_4 + dt_5 + dt_6 + dt_7 + dt_8;
       if(value != 0)
       {              //100ms
              if(flag_stop == 1)       //到相应的楼了  要停下
              {
/***************************向上走电梯***********************************/
                     if(dt_s_x != 0)              //向上走电梯
                     {
                            value1++;
                            if(value1>= 10)  //1s
                            {
                                   value1 = 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)
                                          {
                                                 led1 = 0;               //关闭第一层发光二极管
                                                 dt_1 = 0;        //清零电机在的标志
                                                 flag_stop = 0;   //到停下
                                                 beep = 0;        //打开蜂鸣器
                                          }                        
                                   }
                                   else if(dt_value == 2)    //当到了第二层的时候
                                   {
                                          if(dt_2== 1)
                                          {
                                                 led2 = 0;               //关闭第二层发光二极管
                                                 dt_2 = 0;        //清零电机在的标志
                                                 flag_stop = 0;   //到停下
                                                 beep = 0;        //打开蜂鸣器
                                          }                        
                                   }
                                   else if(dt_value == 3)    //当到了第3层的时候
                                   {
                                          if(dt_3== 1)
                                          {
                                                 led3 = 0;               //关闭第3层发光二极管
                                                 dt_3 = 0;        //清零电机在的标志
                                                 flag_stop = 0;   //到停下
                                                 beep = 0;        //打开蜂鸣器
                                          }                        
                                   }
                                   else if(dt_value == 4)    //当到了第4层的时候
                                   {
                                          if(dt_4== 1)
                                          {
                                                 led4 = 0;               //关闭第4层发光二极管
                                                 dt_4 = 0;        //清零电机在的标志
                                                 flag_stop = 0;   //到停下
                                                 beep = 0;        //打开蜂鸣器
                                          }                        
                                   }
                                   else if(dt_value == 5)    //当到了第5层的时候
                                   {
                                          if(dt_5== 1)
                                          {
                                                 led5 = 0;               //关闭第5层发光二极管
                                                 dt_5 = 0;        //清零电机在的标志
                                                 flag_stop = 0;   //到停下
                                                 beep = 0;        //打开蜂鸣器
                                          }                        
                                   }
                                   else if(dt_value == 6)    //当到了第6层的时候
                                   {
                                          if(dt_6== 1)
                                          {
                                                 led6 = 0;               //关闭第6层发光二极管
                                                 dt_6 = 0;        //清零电机在的标志
                                                 flag_stop = 0;   //到停下
                                                 beep = 0;        //打开蜂鸣器
                                          }                        
                                   }
                                   else if(dt_value == 7)    //当到了第7层的时候
                                   {
                                          if(dt_7== 1)
                                          {
                                                 led7 = 0;               //关闭第7层发光二极管
                                                 dt_7 = 0;        //清零电机在的标志
                                                 flag_stop = 0;   //到停下
                                                 beep = 0;        //打开蜂鸣器
                                          }                        
                                   }
                                   else if(dt_value == 8)    //当到了第8层的时候
                                   {
                                          if(dt_8== 1)
                                          {
                                                 led8 = 0;               //关闭第8层发光二极管
                                                 dt_8 = 0;        //清零电机在的标志
                                                 flag_stop = 0;   //到停下
                                                 beep = 0;        //打开蜂鸣器
                                          }                        
                                   }
                            }
                     }            
              }                                       
       }
       if(flag_stop == 0)
       {
//                   flag_stop = 1;      
//                   value1 = 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; //关闭蜂鸣器
              }
              if(value2 >=20)
              {
                     value2 = 0;                       
                     dt_shang_guan();  //电梯向上  做最后的判断是否还要继续向上
                     dt_xia_guan();       //电梯向下  做最后的判断是否还要继续向下
              }
       }     
}
/*************定时器0初始化程序***************/
void time_init()     
{
       EA   = 1;            //开总中断
       TMOD = 0X01;    //定时器0、工作方式1
       ET0  = 1;             //开定时器0中断
       TR0  = 1;             //允许定时器0定时
}
/******************主程序**********************/      
void main()
{
       P3 = 0xff;
       P2 = 0xff;
       P1 = 0x00;
       P0 = 0X00;      //单片机IO口初始化
       time_init();   //定时器初始化
       while(1)
       {
              key();              //按键程序
              if(key_can <20)
              {      
                     if(dt_s_x == 0)
                     {
                            value2= 0;
                            flag_stop= 1;
                     }
                     key_with();         
              }  
              tiandi_shang_xia();      //当电梯不动时、判断是向上、还是向下
              P0 =smg_du[dt_value];     //显示
              if(flag_100ms  == 1)
              {
                     flag_100ms = 0;
                     td_dis();               //电梯处理函数
              }
       }
}
/*************定时器0中断服务程序***************/
void time0_int() interrupt 1
{     
       static uchar value;
       TH0 = 0x3c;
       TL0 = 0xb0;     // 50ms
       value ++;
       if(value % 2 == 0)
       {
              flag_100ms = 1 ;
       }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:646110 发表于 2019-12-17 08:45 | 只看该作者
很好,给力
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表