电梯控制程序源代码带流程图功能分解源代码Word下载.docx
《电梯控制程序源代码带流程图功能分解源代码Word下载.docx》由会员分享,可在线阅读,更多相关《电梯控制程序源代码带流程图功能分解源代码Word下载.docx(82页珍藏版)》请在冰豆网上搜索。
电梯是现代高层建筑的垂直交通工具,其设计要求稳定性、安全性及高。
随着人们生活水平的不断提高,对电梯的要求的也相应提高,电梯得到了快速发展。
电梯模型将机械和电气两方面有机地结合起来,充分体现了机电结合的特点,同时微机控制即单片机控制的电梯在成本上较低,同时还有着较高的精度,非常适合在学生机电实验方面得到广泛的应用,可以提高大家的编程能力,加深对单片机的理解和应用,同时增强创新精神和团队合作精神。
1.2课题研究方法课题研究方法参照凌阳SPCE061A开发的相关资料,加深对控制电梯模型的单片机的了解,进行61板的相关实验,掌握单片机实现基本功能的技术。
对单片机编写程序,以达到控制电梯模型的目的。
第二章第二章电梯模型硬件设备电梯模型硬件设备2.1实验单片机模型与接口定义实验单片机模型与接口定义2.1.1实验用单片机实验用单片机实验用单片机为凌阳SPCE061A微控制器(简称61板),是以凌阳16位单片机SPCE061A为核心的精简开发-仿真-电路板。
61板除了具备单片机最小系统电路外,还包括有电源电路、音频电路、复位电路等,采用电池供电,方便携带。
SPCE061A是继unSP?
系列产品SPCE500A等之后凌阳科技推出的又一款16位结构的微控制器。
跟市面上常见的avr、51等单片机相比,这款单片机具有一个绝招:
语言功能。
与SPCE500A不同的是,在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,SPCE061A里只内嵌32K字的闪存(FLASH)。
较高的处理速度使unSP?
能够非常容易地、快速地处理复杂的数字信号。
SPCE061A主要包括输入/输出端口、定时/计数器、数/模转换、模/数转换、串行设备输入/输出、通用异步串行接口、低电压检测和复位等部分,且内置在线仿真电路ICE接口,较高的处理速度使其能够快速地处理复杂的数字信号。
本电梯模型就是采用此单片机进行程序编写和实现电梯的运行控制。
Figure1凌阳单片机2.1.2单片机接口定义单片机接口定义实验用单片机接口定义如图,其中A口为输入,B口为输出。
+去一层三层下去二层四层下去三层一层到达去四层二层到达一层上三层到达二层上四层到达二层下开门三层上关门+电梯上下运行(1上0下)三层下灯电梯运行选通(1行0停)四层下灯开关门运行(1开0关)开门到位开关门选通(1行0禁)关门到位一层上灯二层上灯二层下灯三层上灯Figure2凌阳单片机接口定义2.1.3I/O接口接口DATA控制命令表控制命令表单片机A口DATA控制命令表A口(信号输入)*P_IOA_Data接口编号电梯动作0x0001A0去一层(内部按键)0x0002A1去二层(内部按键)0x0004A2去三层(内部按键)0x0008A3去四层(内部按键)0x0010A4一层上(外部按键)0x0020A5二层上(外部按键)0x0040A6二层下(外部按键)0x0080A7三层上(外部按键)0x0100A8三层下(外部按键)0x0200A9四层下(外部按键)0x0400A10一层到达(外部按键)0x0800A11二层到达(外部按键)0x1000A12三层到达(外部按键)0x2000A13四层到达(外部按键)0x4000A14开门(内部按键)0x8000A15关门(内部按键)单片机A口DATA控制命令表A口(信号输入)*P_IOB_Data接口编号电梯动作0x0001B0电梯上下运行(1上0下)0x0002B1电梯运行选通(1行0停)0x0004B2开关门运行(1开0关)0x0008B3开关门选通(1行0禁)0x0010B4一层上灯0x0020B5二层上灯0x0040B6二层下灯0x0080B7三层上灯0x0100B8三层下灯0x0200B9四层下灯0x0400B10开门到位0x0800B11关门到位0x1000B12数码管0x2000B13数码管0x4000B14数码管0x8000B15单片机接口属性设置:
*P_IOA_Dir=0*P_IOA_Attrib=0*P_IOA_Data=0(设A0-A15口为输入)*P_IOB_Dir=0xf3ff*P_IOB_Attrib=0xf3ff(设B0-B9口为输出,B10、B11口为输入)*P_IOB_Data=0;
2.2电梯控制命令说明电梯控制命令说明1.一层上按钮按下,*P_IOA_Data输入值为0x0010;
2.使一层上按键灯亮起的命令为:
*P_IOB_Data=0x0010,同时其它层按键灯熄灭;
3.如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:
*P_IOB_Data=0x0010|P_IOB_Data;
4.二层上按钮按下,*P_IOA_Data输入值为0x00205.使二层上按键灯亮起的命令为:
*P_IOB_Data=0x0020同时其它层按键灯熄灭;
6.如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:
*P_IOB_Data=0x0020|P_IOB_Data;
7.二层下按钮按下,*P_IOA_Data输入值为0x00408.使二层下按键灯亮起的命令为:
*P_IOB_Data=0x0040时其它层按键灯熄灭;
9.如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:
*P_IOB_Data=0x0040|P_IOB_Data;
10.三层上按钮按下,*P_IOA_Data输入值为0x008011.使三层上按键灯亮起的命令为:
*P_IOB_Data=0x0080;
同时其它层按键灯熄灭;
12.如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:
*P_IOB_Data=0x0080|P_IOB_Data;
13.三层下按钮按下,*P_IOA_Data输入值为0x0100,14.使三层下按键灯亮起的命令为:
*P_IOB_Data=0x0100,同时其它层按键灯熄灭;
15.如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:
*P_IOB_Data=0x0100|P_IOB_Data;
16.四层下按钮按下,*P_IOA_Data输入值为0x0200,17.使四层上按键灯亮起的命令为:
*P_IOB_Data=0x0200,同时其它层按键灯熄灭;
18.如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:
*P_IOB_Data=0x0200|P_IOB_Data;
19.电梯内部开门按钮按下,*P_IOA_Data输入值为0x4000,20.使电梯开门的命令为:
*P_IOB_Data=0x000c;
21.电梯内部关门按钮按下,*P_IOA_Data输入值为0x8000;
22.使电梯关门的命令为:
*P_IOB_Data=0x0008。
我们为了能够简化我们的程序,我们在头文件define.h中定义了直观易懂的单词来表示数字指令,这样使得编程过程更加容易直观,并且使得程序的可读性更强,但是这种方法是在之前不断地尝试的基础上才逐渐摸索出来的,因而在后来编写的程序中普遍用到了这种方法,而在开始训练阶段编写的程序还往往是使用数字型的指令,具体的定义如下:
#ifndef_DEFINE_h_#define_DEFINE_h_#defineIOA*P_IOA_Data#defineIOB*P_IOB_Data#defineuintunsignedint#defineucharunsignedchar#defineulongunsignedlong#definestop0x0000#definedown0x0002#defineup0x0003#definebt1up0x0010#definebt2up0x0020#definebt2down0x0040#definebt3up0x0080#definebt3down0x0100#definebt4down0x0200#definebtin10x0001#definebtin20x0002#definebtin30x0004#definebtin40x0008#definebtopen0x4000#definebtclose0x8000#defineopenok0x0400#definecloseok0x0800#definedown0x0002#defineup0x0003#defineclose0x0008#defineopen0x000c#defineL10x1000#defineL20x2000#defineL30x3000#defineL40x4000#defineL1up0x0010#defineL2up0x0020#defineL2down0x0040#defineL3up0x0080#defineL3down0x0100#defineL4down0x0200#defineat10x0400#defineat20x0800#defineat30x1000#defineat40x2000#endif同时由于看门狗在程序中频繁出现,故定义看门狗函数dog方便使用:
#includespce061A.h#includedingyi.hvoiddog()*P_Watchdog_Clear=0x0001;
2.3实验用电梯模型实验用电梯模型Figure3实验用电梯模型第三章第三章与电梯模型相关的实验程序与电梯模型相关的实验程序3.1数码管连续显示数码管连续显示3.1.1程序流程图程序流程图Figure4数码管连续显示流程图3.1.2功能简介功能简介程序初始化完成后,数码管从0连续变化到7,再从7连续变化到1。
3.1.3功能实现过程功能实现过程通过定义一个指示当前数码管显示数值的变量,以该变量为循环条件,每次循环结束后变量自动加1,即指示下一个数码管显示数值,并且通过延时函数使得输出持续一段时间一边观察现象。
(代码详见附录一)3.1.4问题的解决及收获问题的解决及收获该程序较为简单,但是通过该程序我们对软件的运行、调试有了初步的认识,对采集输入数据、设置输出命令的基本方法的认识更加清晰直观,同时对控制命令部分有了更加深刻的了解。
3.2外部按键灯连续闪烁外部按键灯连续闪烁3.2.1程序流程图程序流程图Figure5外部按键灯连续闪烁流程图3.2.2功能简介功能简介程序初始化完成后,外部按键灯连续闪烁,即从一层上灯到四层下等逐个亮,并不断循环。
3.2.3功能实现过程功能实现过程定义一个整形变量,通过该变量对6(外部按键一共有6个灯,可按顺序定义六个灯分别为0,1,2,3,4,5)取余的结构判断应该哪一个灯亮,同时通过延时函数使得输出得到持续。
(代码详见附录二)3.2.4问题的解决及收获问题的解决及收获这个程序的思路非常好,但是在逻辑上需要通过取余这种方法实现,有些复杂,可以将代码直接描述为外部按键逐个灯亮这样也可以实现,我们用这种思路写了一个让外部按键的灯逐个亮且保持,直到所有的灯都亮了之后,再逐个灯灭的程序,代码见附录三,程序流程图如下:
Figure6LED1to7流程图3.3键、灯、数码管3.3.1程序流程图程序流程图Figure7键、灯、数码管流程图3.3.2功能简介功能简介程序运行后,按下电梯外部按键之后该层外部按键的灯亮,同时数码管显示按下的层数,等待下一次输入。
3.3.3功能实现过程功能实现过程程序初始化完成后,开始扫描是否有按键按下,若接收到外部某一按键按下信号后,那么该层按键的灯亮,并且数码管显示对应的层数。
(代码见附录四)现以一层上按键被按下举例:
if(t&
0x0010)=0x0010)/如果一层上按键被按下*P_IOB_Data=0x1011;
/输出为一层上按键灯亮且数码管显示1*P_Watchdog_Clear=0x0001;
3.3.4问题的解决及收获问题的解决及收获通过该程序,我们对多个部件的共同控制方法有了非常清晰的认识,在61中只需要将需要共同控制的部分的数字指令相加即可形成共同协调控制。
3.4外部按键上下行外部按键上下行3.4.1程序流程图程序流程图Figure8外部按键上下行流程图3.4.2功能简介功能简介程序运行后,当按下电梯外部按键后,电梯从当前层运行至目标层后停止,等待下一次输入。
3.4.3功能实现过程功能实现过程首先程序定义了一个指示当前所在层的变量at,以及一个指示目标层的变量to,程序初始化完成后,给变量at赋上对应的层数值,如若当前所在层为2层:
0x0800)=0x0800)/判断当前所在层数,若当前所在层数为2层at=2;
/给变量at赋当前层数值2*P_Watchdog_Clear=0x0001;
扫描外部按键是否按下,若按下,则对变量to赋上对应层数值,如若三层上或三层下按键被按下:
0x0080)=0x0080)|(t&
0x0100)=0x0100)/若三层上、三层下按键被按/下to=3;
/给变量to赋目标层数为3*P_Watchdog_Clear=0x0001;
进行目标层与当前层的比较判断,若目标层大于当前层,即toat,那么电梯应向上运行,直到获取的当前值at=to之后,电梯停止运行:
if(toat)*P_IOB_Data=up;
*P_Watchdog_Clear=0x0001;
若目标层等于当前层,即to=at,那么电梯停止运行:
if(to=at)*P_IOB_Data=stop;
若目标层小于当前层,即toat,那么电梯应向下运行,直到获取的当前值at=to之后,电梯停止运行:
if(toat,那么电梯应向上运行,直到获取的当前值at=to之后,电梯停止运行:
if(toat)*P_IOB_Data=down;
3.9.4LED模块模块3.9.4.1程序流程图程序流程图Figure19外部按键电梯LED函数流程图Figure20外部按键电梯btLED函数流程图3.9.4.2功能过程功能过程程序初始化完成后,外部按键灯以及指示层数的数码管根据现在电梯的运行状态正常显示。
3.9.4.3实现功能过程实现功能过程当外部六个按键按下后,外部按键的灯亮,电梯上部的LED灯显示当前运行的所在层数。
3.9.4.4问题的解决及收获问题的解决及收获在程序调试过程中,我们发现如果在电梯运行的过程中,即电梯不处于某层到位的状态时,若按下电梯外部的按键后,电梯有可能会卡死在中间部位,并且导致电梯无法运行,在发现这样的问题之后,我们对程序进行了修改,针对上下行部分,我们加入了使得电梯停止的条件,如果电梯没有处于到位状态的话就始终保持先前上行或下行的状态不变,从而使得问题得到了有效的解决。
第四章第四章电梯模型完整控制程序电梯模型完整控制程序4.1完整控制程序(完整控制程序(main函数)函数)4.1.1功能说明Figure21电梯完整程序主函数代码见附录十一4.1.2功能实现过程功能实现过程在上下行的优先级别判断上,我们没有使用以前的数组或者at和to大小判断的方式,而是按照内外部层数按键的个数分别定义了4个和6个变量,分别来指示目标层数,而何时选择上下行这一问题,举例如下:
如果电梯目前处于二层,首先判断电梯之前的运行方向,如果电梯之前运行方向向下,那么,若外部二层下按键或者内部二层按键被按下,电梯执行开门程序;
若外部按键二层下被按下且外部按键一层上与内部一层按键均未被按下,电梯执行开门程序。
之后进行上下行的判断,如果电梯外部按键一层上或者内部按键一层被按下,那么电梯下行至一层再做出判断;
如果电梯外部按键一层上或者内部按键一层均未被按下,且三、四层按键至少有一个被按下之后,电梯上行至三层再做出判断。
如果电梯之前运行方向向上,那门,如果外部二层上或者内部二层按键被按下,电梯执行开门程序;
若外部按键二层下被按下,且三、四层均没有按键被按下,那么电梯也执行开门程序。
之后进行上下行的判断,如果电梯三、四层有至少一个按键被按下之后,电梯上行至三层再做出判断;
如果电梯外部按键一层上被按下且三、四层都没有按键被按下的情况先,电梯执行下行动作至一层再做出判断。
其它功能的实现主要通过主函数调用其它函数实现,例如开关门函数,LED控制函数,外部按键扫描函数,获取目标层函数等等。
4.1.3问题的解决及收获问题的解决及收获在电梯完整程序中,我们改变了以往c文件过多的特点,尽量把一些判断都放在了主函数中完成,这也造成了主函数比较复杂。
4.2按键扫描模块(按键扫描模块(getto函数)函数)4.2.1功能简介功能简介程序初始化完成后,随时扫描内外部按键从而获得目标层,并通过各层的标志位将其记录下来。
4.2.2问题的解决及收获问题的解决及收获此次使用的获取目标层的函数虽与以往相同,但是由于实际的电梯会实时记录电梯内外按键的情况,同时在目标层之后会把相应的层数及方向清零并且对上下行做出判断,所以在获取目标层与及时清除已