您好,欢迎来到意榕旅游网。
搜索
您的当前位置:首页电梯控制程序源代码(带流程图-功能分解、源代码)

电梯控制程序源代码(带流程图-功能分解、源代码)

来源:意榕旅游网
电梯控制程序源代码(带流程图-功能分解、源代码)

《综合电子创新训练》研究报告

研究题目:CTS1600-1控制技术综合试验

院系名称: 专业名称: 学生姓名:

指导教师:

xxxx年 xx月 xx日

xxxxxxxxxx

1 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

目录

第一章 绪论 ........................................................................ 1

1.1 1.2

课题背景与目的 ............................................................................... 1 课题研究方法 ................................................................................... 1

第二章 电梯模型硬件设备 ................................................. 2

2.1 实验单片机模型与接口定义 ................................................................... 2

2.1.1 实验用单片机 ................................................................................................. 2 2.1.2 单片机接口定义 ............................................................................................. 3 2.1.3 I/O接口DATA控制命令表 .......................................................................... 4

2.2 电梯控制命令说明 .................................................................................. 6 2.3 实验用电梯模型 ..................................................................................... 8

第三章 与电梯模型相关的实验程序 .................................. 10

3.1数码管连续显示 ..................................................................................... 10

3.1.1 程序流程图 ................................................................................................... 10 3.1.2 功能简介 ....................................................................................................... 10 3.1.3 功能实现过程 ............................................................................................... 11 3.1.4 问题的解决及收获 ....................................................................................... 11

3.2 外部按键灯连续闪烁 ............................................................................. 12

3.2.1 程序流程图 ................................................................................................... 12 3.2.2 功能简介 ....................................................................................................... 12 3.2.3 功能实现过程 ............................................................................................... 12 3.2.4 问题的解决及收获 ....................................................................................... 13

3.3 键、灯、数码管 .................................................................................... 14

I / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.3.1 程序流程图 ................................................................................................... 14 3.3.2 功能简介 ....................................................................................................... 14 3.3.3 功能实现过程 ............................................................................................... 14 3.3.4 问题的解决及收获 ....................................................................................... 15

3.4 外部按键上下行 .................................................................................... 16

3.4.1 程序流程图 ................................................................................................... 16 3.4.2 功能简介 ....................................................................................................... 17 3.4.3 功能实现过程 ............................................................................................... 17 3.4.4 问题的解决及收获 ....................................................................................... 18

3.5 计算器 ................................................................................................... 19

3.5.1 程序流程图 ................................................................................................... 19 3.5.2 功能简介 ....................................................................................................... 21 3.5.3 功能实现过程 ............................................................................................... 21 3.5.4 问题的解决及收获 ....................................................................................... 22

3.6 密码锁 ................................................................................................... 23

3.6.1程序流程图 .................................................................................................... 23 3.6.2功能简介 ........................................................................................................ 24 3.6.3实现功能过程 ................................................................................................ 24 3.6.4问题的解决及收获 ........................................................................................ 24

3.7逐层停自动开关门循环 .......................................................................... 25

3.7.1程序流程图 .................................................................................................... 25 3.7.2功能简介 ........................................................................................................ 27 3.7.3实现功能过程 ................................................................................................ 27 3.7.4问题的解决及收获 ........................................................................................ 27

3.8 可记录顺序逐层停自动开关门 .............................................................. 28

II / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.8.1程序流程图 .................................................................................................... 28 3.8.2功能简介 ........................................................................................................ 28 3.8.3实现功能过程 ................................................................................................ 29 3.8.4问题的解决及收获 ........................................................................................ 29

3.9 外部按键电梯 ........................................................................................ 30

3.9.1 主程序 ........................................................................................................... 30 3.9.2 开关门模块 ................................................................................................... 31 3.9.3 上下行模块 ................................................................................................... 32 3.9.4 LED模块 ......................................................................................................... 34

第四章 电梯模型完整控制程序 ......................................... 36

4.1 完整控制程序(main函数) ................................................................ 36

4.1.1 功能说明 ....................................................................................................... 36 4.1.2 功能实现过程 ............................................................................................... 37 4.1.3 问题的解决及收获 ....................................................................................... 37

4.2 按键扫描模块(getto函数) ................................................................ 38

4.2.1功能简介 ........................................................................................................ 38 4.2.2 问题的解决及收获 ....................................................................................... 38

4.3 当前层判断模块(getat函数)............................................................. 38

4.3.1 功能简介 ....................................................................................................... 38 4.3.2 问题的解决及收获 ....................................................................................... 38

4.4 电梯门的选通、禁止模块(DoorEnable函数) .................................. 38

4.4.1 功能简介 ....................................................................................................... 38 4.4.2 问题的解决及收获 ....................................................................................... 38

4.5 电梯开关门模块(openandclose函数) ............................................... 39

III / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

4.5.1 功能简介 ....................................................................................................... 39 4.5.2 功能实现过程 ............................................................................................... 39 4.5.3 问题的解决及收获 ....................................................................................... 39

第五章 总结与致谢 ............................................................ 41

5.1 总结 ....................................................................................................... 41 5.2 致谢 ....................................................................................................... 41

附录 控制电梯模型相关程序 ............................................. 42

附录一 数码管连续显示 ............................................................................ 42 附录二 外部按键灯连续闪烁 ..................................................................... 43 附录三 外部按键逐个亮灭 ........................................................................ 45 附录四 键、灯、数码管 ............................................................................ 47 附录五 外部按键上下行 ............................................................................ 49 附录六 计算器 ........................................................................................... 51 附录七 密码锁 ........................................................................................... 56 附录八 逐层停开关门循环 ........................................................................ 59 附录九 可记录顺序逐层停自动开关门 ...................................................... 附录十 外部按键电梯 ................................................................................ 70 附录十一 完整电梯程序 ............................................................................ 77

IV / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

图目录

Figure 1 凌阳单片机 ...................................................................................................... 2 Figure 2 凌阳单片机接口定义 ...................................................................................... 3 Figure 3 实验用电梯模型 .............................................................................................. 9 Figure 4 数码管连续显示流程图 ................................................................................ 10 Figure 5 外部按键灯连续闪烁流程图 ........................................................................ 12 Figure 6 LED1to7流程图 ............................................................................................. 13 Figure 7 键、灯、数码管流程图 ................................................................................ 14 Figure 8 外部按键上下行流程图 ................................................................................ 16 Figure 9 计算器数字扫描函数流程图 ........................................................................ 19 Figure 10 计算器主函数流程图 .................................................................................. 20 Figure 11 密码锁流程图 .............................................................................................. 23 Figure 12 逐层停自动开关门循环main函数 ............................................................ 25 Figure 13 逐层停自动开关门循环AtAndTo函数 ...................................................... 26 Figure 14 逐层停自动开关门循环OpenAndClose函数 ............................................ 26 Figure 15 可记录顺序逐层停自动开关门 .................................................................. 28 Figure 16 外部按键电梯主函数流程图 ...................................................................... 30 Figure 17 外部按键电梯开关门函数流程图 .............................................................. 31 Figure 18 外部按键电梯上下行函数流程图 .............................................................. 32 Figure 19 外部按键电梯LED函数流程图 .................................................................. 34 Figure 20 外部按键电梯btLED函数流程图 ............................................................... 35 Figure 21 电梯完整程序主函数 .................................................................................. 36 Figure 22 电梯完整程序openandclose函数流程图.................................................. 39

V / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

第一章 绪论

1.1 课题背景与目的

现代社会中,电梯已经成为不可缺少的运输设备。电梯的存在使得每幢高层建筑的交通更为便利。电梯控制技术的发展主要经历了三个阶段:继电器控制阶段,微机控制阶段,现场总线控制阶段。随着经济的高速发展,微电子技术、计算机技术和自动控制技术也得到了迅速发展,交流变频调速技术已经进入一个崭新的时代,其应用越来越广。电梯是现代高层建筑的垂直交通工具,其设计要求稳定性、安全性及高。随着人们生活水平的不断提高,对电梯的要求的也相应提高,电梯得到了快速发展。

电梯模型将机械和电气两方面有机地结合起来,充分体现了机电结合的特点,同时微机控制即单片机控制的电梯在成本上较低,同时还有着较高的精度,非常适合在学生机电实验方面得到广泛的应用,可以提高大家的编程能力,加深对单片机的理解和应用,同时增强创新精神和团队合作精神。

1.2 课题研究方法

参照凌阳SPCE061A开发的相关资料,加深对控制电梯模型的单片机的了解,进行61板的相关实验,掌握单片机实现基本功能的技术。

对单片机编写程序,以达到控制电梯模型的目的。

1 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

第二章 电梯模型硬件设备

2.1 实验单片机模型与接口定义

2.1.1 实验用单片机

实验用单片机为凌阳SPCE061A微控制器(简称61板),是以凌阳16位单片机SPCE061A为核心的精简开发-仿真-电路板。61板除了具备单片机最小系统电路外,还包括有电源电路、音频电路、复位电路等,采用电池供电,方便携带。

SPCE061A 是继u’nSP™系列产品SPCE500A等之后凌阳科技推出的又一款16位结构的微控制器。跟市面上常见的avr、51等单片机相比,这款单片机具有一个绝招:语言功能。与SPCE500A不同的是,在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,SPCE061A里只内嵌32K字的闪存(FLASH)。较高的处理速度使u’nSP™能够非常容易地、快速地处理复杂的数字信号。

SPCE061A主要包括输入/输出端口、定时/计数器、数/模转换、模/数转换、串行设备输入/输出、通用异步串行接口、低电压检测和复位等部分,且内置在线仿真电路ICE接口,较高的处理速度使其能够快速地处理复杂的数字信号。本电梯模型就是采用此单片机进行程序编写和实现电梯的运行控制。

Figure 1 凌阳单片机

2 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

2.1.2 单片机接口定义

实验用单片机接口定义如图,其中A口为输入,B口为输出。

+ 去一层 A0 A8 A1 A9 A2 A10 A3 A11 A4 A12 A5 A13 A6 A14 10 A7 A15 — 三层下 四层下 一层到达 二层到达 三层到达 四层到达 开门

30 关门 — + 三层下灯 四层下灯 开门到位 关门到位

40 —

电梯内按键 去二层 去三层 去四层 一层上 各楼层按键 各楼层按键二层上 二层下 三层上 + —

电梯上下运行(1上0下) 电梯运行选通(1行0停) 开关门运行(1开0关) 开关门选通(1行0禁) 实 验 单 片 机B0 B8 接B1 口 B9 电梯内按键 一层上灯 B2 B10 B3 B11 B4 B12 B5 B13 B6 B14 各楼层按键灯 各楼层按键灯二层上灯 二层下灯 三层上灯

20 B7 B15 Figure 2 凌阳单片机接口定义

3 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

2.1.3 I/O接口DATA控制命令表

单片机A口DATA控制命令表

*P_IOA_Data 0x0001 0x0002 0x0004 0x0008 0x0010 0x0020 0x0040 A口 (信号输入) 0x0080 0x0100 0x0200 0x0400 0x0800 0x1000 0x2000 0x4000 0x8000

接口编号 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 电梯动作 去一层(内部按键) 去二层(内部按键) 去三层(内部按键) 去四层(内部按键) 一层上(外部按键) 二层上(外部按键) 二层下(外部按键) 三层上(外部按键) 三层下(外部按键) 四层下(外部按键) 一层到达(外部按键) 二层到达(外部按键) 三层到达(外部按键) 四层到达(外部按键) 开门(内部按键) 关门(内部按键) 4 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

单片机A口DATA控制命令表

*P_IOB_Data 0x0001 0x0002 0x0004 0x0008 0x0010 0x0020 0x0040 A口 (信号输入) 0x0080 0x0100 0x0200 0x0400 0x0800 0x1000 0x2000 0x4000 0x8000 接口编号 B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 电梯动作 电梯上下运行(1上0下) 电梯运行选通(1行0停) 开关门运行(1开0关) 开关门选通(1行0禁) 一层上灯 二层上灯 二层下灯 三层上灯 三层下灯 四层下灯 开门到位 关门到位 数码管 数码管 数码管 单片机接口属性设置:

*P_IOA_Dir=0 *P_IOA_Attrib=0

*P_IOA_Data=0 (设A0-A15口为输入)

5 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

*P_IOB_Dir=0xf3ff

*P_IOB_Attrib=0xf3ff (设B0-B9口为输出,B10、B11口为输入) *P_IOB_Data=0;

2.2 电梯控制命令说明

1. 一层上按钮按下,*P_IOA_Data输入值为0x0010;

使一层上按键灯亮起的命令为:*P_IOB_Data=0x0010,同时其它层按键灯熄灭;

如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:*P_IOB_Data=0x0010| P_IOB_Data; 2. 二层上按钮按下,*P_IOA_Data输入值为0x0020

使二层上按键灯亮起的命令为:*P_IOB_Data=0x0020同时其它层按键灯熄灭; 如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:*P_IOB_Data=0x0020|P_IOB_Data; 3. 二层下按钮按下,*P_IOA_Data输入值为0x0040

使二层下按键灯亮起的命令为:*P_IOB_Data=0x0040时其它层按键灯熄灭; 如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:*P_IOB_Data=0x0040|P_IOB_Data; 4. 三层上按钮按下,*P_IOA_Data输入值为0x0080

使三层上按键灯亮起的命令为:*P_IOB_Data=0x0080;同时其它层按键灯熄灭;

如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:*P_IOB_Data=0x0080| P_IOB_Data; 5. 三层下按钮按下,*P_IOA_Data输入值为0x0100,

使三层下按键灯亮起的命令为:*P_IOB_Data=0x0100,同时其它层按键灯熄灭;

如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:*P_IOB_Data=0x0100| P_IOB_Data;

6 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

6. 四层下按钮按下,*P_IOA_Data输入值为0x0200,

使四层上按键灯亮起的命令为:*P_IOB_Data=0x0200,同时其它层按键灯熄灭;

如果要使其它层按键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:*P_IOB_Data=0x0200| P_IOB_Data;

7. 电梯内部开门按钮按下,*P_IOA_Data输入值为0x4000,

使电梯开门的命令为:*P_IOB_Data=0x000c;

8. 电梯内部关门按钮按下,*P_IOA_Data输入值为0x8000;

使电梯关门的命令为:*P_IOB_Data=0x0008。

我们为了能够简化我们的程序,我们在头文件define.h中定义了直观易懂的单词来表示数字指令,这样使得编程过程更加容易直观,并且使得程序的可读性更强,但是这种方法是在之前不断地尝试的基础上才逐渐摸索出来的,因而在后来编写的程序中普遍用到了这种方法,而在开始训练阶段编写的程序还往往是使用数字型的指令,具体的定义如下:

#ifndef __DEFINE_h__ #define __DEFINE_h__ #define IOA *P_IOA_Data #define IOB *P_IOB_Data #define uint unsigned int #define uchar unsigned char #define ulong unsigned long #define stop 0x0000 #define down 0x0002 #define up 0x0003

#define bt1up 0x0010 #define bt2up 0x0020 #define bt2down 0x0040 #define bt3up 0x0080 #define bt3down 0x0100 #define bt4down 0x0200

#define btin1 0x0001 #define btin2 0x0002 #define btin3 0x0004 #define btin4 0x0008

7 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

#define btopen 0x4000 #define btclose 0x8000 #define openok 0x0400 #define closeok 0x0800

#define down 0x0002 #define up 0x0003 #define close 0x0008 #define open 0x000c

#define L1 0x1000 #define L2 0x2000 #define L3 0x3000 #define L4 0x4000

#define L1up 0x0010 #define L2up 0x0020 #define L2down 0x0040 #define L3up 0x0080 #define L3down 0x0100 #define L4down 0x0200

#define at1 0x0400 #define at2 0x0800 #define at3 0x1000 #define at4 0x2000 #endif

同时由于看门狗在程序中频繁出现,故定义看门狗函数dog方便使用:

#include \"spce061A.h\" #include \"dingyi.h\" void dog() {

*P_Watchdog_Clear=0x0001; }

2.3 实验用电梯模型

8 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

Figure 3 实验用电梯模型

9 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

第三章 与电梯模型相关的实验程序

3.1数码管连续显示

3.1.1 程序流程图

Figure 4 数码管连续显示流程图

3.1.2 功能简介

10 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

程序初始化完成后,数码管从0连续变化到7,再从7连续变化到1。

3.1.3 功能实现过程

通过定义一个指示当前数码管显示数值的变量,以该变量为循环条件,每次循环结束后变量自动加1,即指示下一个数码管显示数值,并且通过延时函数使得输出持续一段时间一边观察现象。(代码详见附录一)

3.1.4 问题的解决及收获

该程序较为简单,但是通过该程序我们对软件的运行、调试有了初步的认识,对采集输入数据、设置输出命令的基本方法的认识更加清晰直观,同时对控制命令部分有了更加深刻的了解。

11 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.2 外部按键灯连续闪烁

3.2.1 程序流程图

Figure 5 外部按键灯连续闪烁流程图

3.2.2 功能简介

程序初始化完成后,外部按键灯连续闪烁,即从一层上灯到四层下等逐个亮,并不断循环。

3.2.3 功能实现过程

定义一个整形变量,通过该变量对6(外部按键一共有6个灯,可按顺序定义六个灯分别为0,1,2,3,4,5)取余的结构判断应该哪一个灯亮,同时通过延时函数使得输出得到持续。(代码详见附录二)

12 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.2.4 问题的解决及收获

这个程序的思路非常好,但是在逻辑上需要通过取余这种方法实现,有些复杂,可以将代码直接描述为外部按键逐个灯亮这样也可以实现,我们用这种思路写了一个让外部按键的灯逐个亮且保持,直到所有的灯都亮了之后,再逐个灯灭的程序,代码见附录三,程序流程图如下:

Figure 6 LED1to7流程图

13 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.3 键、灯、数码管

3.3.1 程序流程图

Figure 7 键、灯、数码管流程图

3.3.2 功能简介

程序运行后,按下电梯外部按键之后该层外部按键的灯亮,同时数码管显示按下的层数,等待下一次输入。

3.3.3 功能实现过程

程序初始化完成后,开始扫描是否有按键按下,若接收到外部某一按键按下信号后,那么该层按键的灯亮,并且数码管显示对应的层数。(代码见附录四) 现以一层上按键被按下举例:

if((t&0x0010)==0x0010) //如果一层上按键被按下

14 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

{

}

*P_IOB_Data=0x1011; //输出为一层上按键灯亮且数码管显示1 *P_Watchdog_Clear=0x0001;

3.3.4 问题的解决及收获

通过该程序,我们对多个部件的共同控制方法有了非常清晰的认识,在61中只需要将需要共同控制的部分的数字指令相加即可形成共同协制。

15 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.4 外部按键上下行

3.4.1 程序流程图

Figure 8 外部按键上下行流程图

16 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.4.2 功能简介

程序运行后,当按下电梯外部按键后,电梯从当前层运行至目标层后停止,等待下一次输入。

3.4.3 功能实现过程

首先程序定义了一个指示当前所在层的变量at,以及一个指示目标层的变量to,程序初始化完成后,给变量at赋上对应的层数值, 如若当前所在层为2层:

if((t&0x0800)==0x0800) //判断当前所在层数,若当前所在层数为2层 { at=2; //给变量at赋当前层数值2 *P_Watchdog_Clear=0x0001; }

扫描外部按键是否按下,若按下,则对变量to赋上对应层数值, 如若三层上或三层下按键被按下:

if(((t&0x0080)==0x0080)||((t&0x0100)==0x0100)) //若三层上、三层下按键被按//下

{ to=3; //给变量to赋目标层数为3 *P_Watchdog_Clear=0x0001; }

进行目标层与当前层的比较判断,

若目标层大于当前层,即to>at,那么电梯应向上运行,直到获取的当前值at=to之后,电梯停止运行:

if(to>at) { *P_IOB_Data=up; *P_Watchdog_Clear=0x0001; }

若目标层等于当前层,即to=at,那么电梯停止运行:

if(to==at) { *P_IOB_Data=stop; *P_Watchdog_Clear=0x0001;

17 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

}

若目标层小于当前层,即toif(to代码详见附录五

3.4.4 问题的解决及收获

对数据采集系统以及程序的运行方式有了更加深刻的认识,系统的输入的数据有一部分是可以持续的,而有一部分只是一个短暂的脉冲,比如说像开门到位或者关门到位这样的输入就可以是持续的信号,但外部按键这样的输入只能是一个脉冲信号,像这种信号就需要通过在这种脉冲信号产生的瞬间给另外一个自己定义的变量赋上相关信息的值这样的方式来保存这种信息;在加有

*P_Watchdog_Clear=0x0001的情况下,程序是以非常快的速度在一遍一遍的走整个代码部分,在没有加看门狗的情况下,程序在运行一段时间之后会从头初始化后继续运行。

18 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.5 计算器

3.5.1 程序流程图

Figure 9 计算器数字扫描函数流程图

19 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

Figure 10 计算器主函数流程图

20 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.5.2 功能简介

程序初始化完成后,一层上按键按下后,电梯门打开,内部层数按键1、2、3、4分别对应数字1、2、3、4,四层上、三层上、三层下分别对应加法、减法和乘法,首先按下内部两个按键分别对应数学符号前后两个数字,在电梯上部的LED显示屏上显示按下的数字,然后再按下加减乘符号,则在电梯上部的LED显示屏上显示计算结果,若答案在显示范围之内,即在0到7的范围正确显示,如果超出这个范围,则01闪烁。

3.5.3 功能实现过程

程序初始化完成后,通过扫描内部按键,获取两个数字作为即将进行数学计算的输入,而这两个数字的输入又靠一个标志位i实现,当清零按下之后或者在初始化完成后还没有进行输入的情况下,i标志位为0等待输入,当采集进来一个数据之后,i标志位自动加1,之后当i==1的情况下在采集进来第二个数据,例如第一个按键按下内部按键1,则该部分代码如下:

while (i==0)

{

if((IOA&btin1)==btin1) { num1=1; i++; IOB=0x1000; DelayMs(100); dog(); }

第二次按下内部按键3,则该部分代码如下:

while (i==0)

if((IOA&btin3)==btin3) { num2=3; i++; IOB=0x3000; dog(); }

21 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

之后在进行运算法则的选择,分别有加、减、乘三种,在按下运算法则的选择按键后,数码管显示最终的答案,如果运算结果没有超出显示范围的话那么就正常显示答案,如若超出了正常的显示范围,那么这个时候出现01闪烁以提示超出了运算范围。代码详见附录六

3.5.4 问题的解决及收获

计算器是我们比较有特色的一个程序,程序在实现上虽然比较简单,但是让我们对系统输入和输出的理解更加深刻,尤其是在帮助我们理解如何完成按键的实时扫描、并且记录相关数据这两点上起到非常重要的作用,比如说对外部案件的处理上,人手动按下外部按键的时间要比CPU扫过整个程序的时间来说长得多,这样如果没有延时函数作用而且又使用数组记录输入数据的情况下,可能会导致数组的溢出,从而达不到每次记录一个数据输入的目的。

22 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.6 密码锁

3.6.1程序流程图

Figure 11 密码锁流程图

23 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.6.2功能简介

程序初始化完成后,若电梯门没有关上则电梯门关闭,等待外部按键输入,若密码输入正确则开门。

3.6.3实现功能过程

在这一部分我们引入了两个数组对密码是否相同进行判断,一个是程序初始化完成后的正确密码,另外一个就是我们输入的密码,这个密码是通过当程序运行后,扫描外部按键的情况,对外部按键进行顺序记录,最终对外部按键输入的密码与真实密码进行逐位比对,若每一位均相同,那么执行开门动作,如果不相同,则不开门。代码详见附录七

3.6.4问题的解决及收获

密码锁程序的代码编写过程中我们使用了数组进行数据的采集和记录,所以这样我们又遇到了之前在编写计算器程序中遇到的问题,在按下按键之后数组溢出不能满足之前预定的要求,因而我们加入的延时函数以改进之前的程序,但是在这个过程中由于延时时间不是很好控制,所以也做了很多次尝试之后才最终确定了一个相对比较合适的时间常数,基本上可以满足正常速度的密码输入,从这一点上来说,通过编写密码锁程序让我们对61单片机的了解更加深入细致,以前总会遇到编译通过但是运行之后总会出现很多问题而且我们总是感觉无从下手的这种情况,但是完成密码锁程序之后,随着我们对单片机的了解更加深入,在程序运行之后,我们经过简单地调试一般就可以找到在那些环节的判断或者逻辑是存在不合理之处,使得我们的效率提高了很多。

24 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.7逐层停自动开关门循环

3.7.1程序流程图

Figure 12 逐层停自动开关门循环main函数

25 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

Figure 13 逐层停自动开关门循环AtAndTo函数

Figure 14 逐层停自动开关门循环OpenAndClose函数

26 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.7.2功能简介

程序初始化完成后,电梯自动完成上下行以及开关门动作,不断循环。

3.7.3实现功能过程

在这个程序中我们引入了一个指示上下行的变量shangxia,一层到位之后令该变量为1,指示电梯之后的运行状态为上行;当四层到位之后令该变量为0,指示电梯之后的运行状态为下行。这样电梯在二、三层进行上下行的判断时,只需判断现在指示电梯运行状态的shangxia则可以保证电梯的正常运行。代码详见附录八

3.7.4问题的解决及收获

逐层停自动开关门程序在前面诸多程序的铺垫下相对比较容易,不同点在于在这个程序中定义了一个指示电梯先前运动状态的变量,从而控制电梯现在时刻的上下行,这为之后的电梯完整程序打下了一定的基础。

27 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.8 可记录顺序逐层停自动开关门

3.8.1程序流程图

3.8.2功能简介Figure 15 可记录顺序逐层停自动开关门

28 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

在程序初始化完成后,首先连续输入目标层数,点击确定按键之后,电梯按照之前按键设定的顺序自动运行,完成上下行和相应的开关门功能。

3.8.3实现功能过程

代码详见附录九

3.8.4问题的解决及收获

这个程序在实现的过程中我们借鉴了密码锁的相关经验,不同之处在与之前的密码锁是有确定个数的输入的,而现在的可记录顺序的逐层停开关门的输入是不确定个数的,同时它还具备了清零和确定的选项,但是它是把之前的密码匹配部分改为了电梯的上下行和到达目标层之后自动开关门的功能,所以可记录顺序的逐层停自动开关门程序是继承了密码锁程序的一些特点的基础上,在功能上又有所拓展和创新。

29 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.9 外部按键电梯

3.9.1 主程序

3.9.1.1程序流程图

Figure 16 外部按键电梯主函数流程图

30 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

3.9.1.2功能过程

在程序初始化完成后,进入AtAndTo函数,判断当前层数和目标层,之后进入UpAndDown函数通过对at与to的大小比较,判断电梯的上下行,并将电梯送至目标层,进入OpenAndClose函数后进行开关门操作。(代码详见附录十)

3.9.2 开关门模块

3.9.2.1程序流程图

Figure 17 外部按键电梯开关门函数流程图

3.9.2.2功能过程

31 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

当从主函数进入开关门模块后,电梯自动开门,开门到位后,如果按下内部关门按键,电梯关门。

3.9.2.3实现功能过程

当从主函数进入开关门模块后,首先判断at和to的值,如果二者相等且DoorEnable允许开门即为1,此时执行开门动作,当开门到位且内部关门按键按下后,电梯关门。

3.9.3 上下行模块

3.9.3.1程序流程图

Figure 18 外部按键电梯上下行函数流程图

3.9.3.2功能过程

32 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

程序初始化完成后,若外部按键按下后,电梯运行到目标层。

3.9.3.3实现功能过程

这个函数定义了一个指示当前所在层的变量at,以及一个指示目标层的变量to,程序初始化完成后,给变量at赋上对应的层数值, 如若当前所在层为2层:

if((t&0x0800)==0x0800) //判断当前所在层数,若当前所在层数为2层 { }

at=2; //给变量at赋当前层数值2 *P_Watchdog_Clear=0x0001;

扫描外部按键是否按下,若按下,则对变量to赋上对应层数值, 如若三层上或三层下按键被按下:

if(((t&0x0080)==0x0080)||((t&0x0100)==0x0100)) //若三层上、三层下按键被按

{

to=3; //给变量to赋目标层数为3 }

*P_Watchdog_Clear=0x0001;

进行目标层与当前层的比较判断,

若目标层大于当前层,即to>at,那么电梯应向上运行,直到获取的当前值at=to之后,电梯停止运行:

if(to>at) { *P_IOB_Data=up; *P_Watchdog_Clear=0x0001; }

若目标层等于当前层,即to=at,那么电梯停止运行:

if(to==at)

{ *P_IOB_Data=stop; *P_Watchdog_Clear=0x0001; }

33 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

若目标层小于当前层,即toif(to3.9.4 LED模块

3.9.4.1程序流程图

Figure 19 外部按键电梯LED函数流程图

34 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

Figure 20 外部按键电梯btLED函数流程图

3.9.4.2功能过程

程序初始化完成后,外部按键灯以及指示层数的数码管根据现在电梯的运行状态正常显示。

3.9.4.3实现功能过程

当外部六个按键按下后,外部按键的灯亮,电梯上部的LED灯显示当前运行的所在层数。

3.9.4.4问题的解决及收获

在程序调试过程中,我们发现如果在电梯运行的过程中,即电梯不处于某层到位的状态时,若按下电梯外部的按键后,电梯有可能会卡死在中间部位,并且导致电梯无法运行,在发现这样的问题之后,我们对程序进行了修改,针对上下行部分,我们加入了使得电梯停止的条件,如果电梯没有处于到位状态的话就始终保持先前上行或下行的状态不变,从而使得问题得到了有效的解决。

35 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

第四章 电梯模型完整控制程序

4.1 完整控制程序(main函数)

4.1.1 功能说明

Figure 21 电梯完整程序主函数

代码见附录十一

36 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

4.1.2 功能实现过程

在上下行的优先级别判断上,我们没有使用以前的数组或者at和to大小判断的方式,而是按照内外部层数按键的个数分别定义了4个和6个变量,分别来指示目标层数,而何时选择上下行这一问题,举例如下:

如果电梯目前处于二层,首先判断电梯之前的运行方向,如果电梯之前运行方向向下,那么,若外部二层下按键或者内部二层按键被按下,电梯执行开门程序;若外部按键二层下被按下且外部按键一层上与内部一层按键均未被按下,电梯执行开门程序。

之后进行上下行的判断,如果电梯外部按键一层上或者内部按键一层被按下,那么电梯下行至一层再做出判断;如果电梯外部按键一层上或者内部按键一层均未被按下,且三、四层按键至少有一个被按下之后,电梯上行至三层再做出判断。

如果电梯之前运行方向向上,那门,如果外部二层上或者内部二层按键被按下,电梯执行开门程序;若外部按键二层下被按下,且三、四层均没有按键被按下,那么电梯也执行开门程序。

之后进行上下行的判断,如果电梯三、四层有至少一个按键被按下之后,电梯上行至三层再做出判断;如果电梯外部按键一层上被按下且三、四层都没有按键被按下的情况先,电梯执行下行动作至一层再做出判断。

其它功能的实现主要通过主函数调用其它函数实现,例如开关门函数,LED控制函数,外部按键扫描函数,获取目标层函数等等。

4.1.3 问题的解决及收获

在电梯完整程序中,我们改变了以往c文件过多的特点,尽量把一些判断都放在了主函数中完成,这也造成了主函数比较复杂。

37 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

4.2 按键扫描模块(getto函数)

4.2.1功能简介

程序初始化完成后,随时扫描内外部按键从而获得目标层,并通过各层的标志位将其记录下来。

4.2.2 问题的解决及收获

此次使用的获取目标层的函数虽与以往相同,但是由于实际的电梯会实时记录电梯内外按键的情况,同时在目标层之后会把相应的层数及方向清零并且对上下行做出判断,所以在获取目标层与及时清除已到达层这一问题上思路完全是崭新的,而这部分主要是体现在主函数中,在此不做赘述。

4.3 当前层判断模块(getat函数)

4.3.1 功能简介

当程序初始化完成后,实时确定当前所在层数。

4.3.2 问题的解决及收获

或许当前层数的模块在前面使用也较多,但是在这一部分我们加入了一个判断当前上部LED指示的部分,即上部LED显示当前所在的层数,并且通过此事state的状态来判断LED显示部分箭头的指向。

4.4 电梯门的选通、禁止模块(DoorEnable函数)

4.4.1 功能简介

程序初始化完成后,根据电梯当前的状态判断此时能否开门的一个标志位,例如当电梯某层的两个按键同时按下且上面层数没有按键被按下的情况下,只开门一次且清掉两个按键的灯和相应的标志位。

4.4.2 问题的解决及收获

38 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

在开关门选通的这一问题上,由于前期做过很多这方面的训练,所以解决起来比较容易,主要是保证它能够在应该可能需要开门的情况下该位是选通的,在不能开门的情况下该位一定要是禁止的。

4.5 电梯开关门模块(openandclose函数)

4.5.1 功能简介

开门部分的实现相对较为简单,在这里仅对关门模块进行分析,流程图如下:

Figure 22 电梯完整程序openandclose函数流程图

4.5.2 功能实现过程 4.5.3 问题的解决及收获

针对开门环节,由于考虑到真实电梯在开门过程中,电梯可以保持持续开门的状态,但是如果在关门过程中,为保证安全,在电梯内部按下开门键,或者电梯外部当前层被按下的情况下,电梯应该是可以立即停止关门动作从而进行开门动作以保证安全或者外部有人要进入电梯的需求。在面对这个问题是我们一度遇到了很多困难,不知道如何实现在关门动作进行的过程中如何来实现外部当前层按键按下后可以保证电梯转而执行开门动作,最后进过深入的思考之后,我们引

39 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

入了一个变量k,使得如果按下的按键所指示的层数后,我们给变量k赋值为1,在当k==1或者内部开门按键被按下的时候,终止之前的关门动作,转而执行开门动作,直到开门到位。

在开关门问题上我们还遇到了另外一个问题,如在上行过程中,三层的上下均被按下,且四层的按键又均未被按下的情况下,由于每次只能开门动作清掉一个标志位,而导致电梯会自动开关两次门,为了解决这一问题我们引入了一个doorenable变量,该变量作为是否进入开关门程序的条件之一,同时在进入开关门函数之后,令该变量无效,而只有再次上行或者下行之后再令该变量有效,从而解决了这样一个问题。

40 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

第五章 总结与致谢

5.1 总结

本电梯模型的控制程序采用凌阳SPCES061A单片机设计编写完成。前期,我们通过编制电梯相关小程序熟悉单片机的基本编程技术。

设计和制作该电梯模型的控制程序提升了我们的动手和动脑的积极性,锻炼了团队合作能力。同时这也是机电结合方面的优秀实例,是我们对控制理论和机电结合方面的知识有了更深入的认识和了解。

5.2 致谢

感谢xx老师和xx老师在综合电子创新训练过程中给予的大力帮助与支持,让我们在创新实习的过程中得到了充分的锻炼和提高。

感谢工程训练中心提供的场地与实验设备的支持。

最后也要感谢我们小团队的所有成员的共同努力,感谢其他同学的帮助,让我们在创新实习同进步、共同提高。

41 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录 控制电梯模型相关程序

附录一 数码管连续显示

#include \"spce061A.h\" #include \"define.h\"

void main() { *P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0; int i,j; while(1) { IOB=0x0001; for(i=0,i<=7,i++) { DelayMs(100); IOB=IOB+0x1000; } IOB=0x7000; for(j=0;j<=7;j++) { DelayMs(100); IOB=IOB+0x1000; } } }

42 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录二 外部按键灯连续闪烁

#include \"spce061A.h\" #include \"define.h\"

int BTLED,LED; int i=1;

void DelayMs(uint t) { while(t--) { uint j; for(j=0;j<200;j++) {dog();} } }

void main() { *P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0; while(1) { switch(i)

{

case 1: { IOB=L1up+L1;

i=((i+1)%6); DelayMs(100); dog(); break;

} case 2: { IOB=L2down+L2;

i=((i+1)%6); DelayMs(100);

43 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

}

}

}

dog(); break;

}

case 3: { IOB=L2up+L2;

i=((i+1)%6); DelayMs(100); dog(); break; }

case 4: { IOB=L3down+L3;

i=((i+1)%6); DelayMs(100); dog(); break; }

case 5: { IOB=L3up+L3;

i=((i+1)%6); DelayMs(100); dog(); break; }

case 0: { IOB=L4down+L4;

i=((i+1)%6); DelayMs(100); dog(); break; }

44 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录三 外部按键逐个亮灭

#include \"spce061A.h\" #include \"define.h\"

void DelayMs(uint t) { while(t--) { uint j; for(j=0;j<500;j++) {} } }

void main() { *P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0; while(1) { IOB=L1up+L1;

DelayMs(100); dog();

IOB=L1up+L2down+L2;

DelayMs(100); dog();

IOB=L1up+L2down+L2up+L2;

DelayMs(100); dog();

IOB=L1up+L2down+L2up+L3down+L3;

DelayMs(100); dog();

IOB=L1up+L2down+L2up+L3down+L3up+L3;

DelayMs(100); dog();

IOB=L1up+L2down+L2up+L3down+L3up+L4down+L4;

DelayMs(100); dog();

45 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

IOB=L1up+L2down+L2up+L3down+L3up+L3; DelayMs(100); dog();

IOB=L1up+L2down+L2up+L3down+L3; DelayMs(100); dog();

IOB=L1up+L2down+L2up+L2; DelayMs(100); dog();

IOB=L1up+L2down+L2; DelayMs(100); dog();

IOB=L1up+L1; DelayMs(100); dog(); IOB=L1;

DelayMs(100); dog();

}

}

46 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录四 键、灯、数码管

#include \"spce061A.h\"

void main() { intinput,t=0,m=0; *P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0; while(1) { t=*P_IOA_Data; if((t&0x0010)==0x0010) { *P_IOB_Data=0x1011; *P_Watchdog_Clear=0x0001; } if((t&0x0020)==0x0020) { *P_IOB_Data=0x2021; *P_Watchdog_Clear=0x0001; } if((t&0x0040)==0x0040) { *P_IOB_Data=0x2040; *P_Watchdog_Clear=0x0001; } if((t&0x0080)==0x0080) { *P_IOB_Data=0x3081; *P_Watchdog_Clear=0x0001; } if((t&0x0100)==0x0100) { *P_IOB_Data=0x3100; *P_Watchdog_Clear=0x0001; } if((t&0x0200)==0x0200) { *P_IOB_Data=0x4200;

47 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

}

*P_Watchdog_Clear=0x0001; }

*P_Watchdog_Clear=0x0001; }

48 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录五 外部按键上下行

#include \"spce061A.h\" #define up 0x0003 #define down 0x0002 #define stop 0x0000

#define stopandopen 0x000c #define close 0x0008

void main() {

intinput,t=0,s=0; intat,to;

*P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0;

while(1) { t=*P_IOA_Data; s=*P_IOB_Data; if((t&0x0800)==0x0800) { at=2; *P_Watchdog_Clear=0x0001; } if((t&0x1000)==0x1000) { at=3; *P_Watchdog_Clear=0x0001; } if((t&0x2000)==0x2000) { at=4; *P_Watchdog_Clear=0x0001; } if((t&0x0400)==0x0400) { at=1;

49 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

} }

*P_Watchdog_Clear=0x0001; }

if((t&0x0010)==0x0010) { to=1; *P_Watchdog_Clear=0x0001; }

if(((t&0x0020)==0x0020)||((t&0x0040)==0x0040)) { to=2; *P_Watchdog_Clear=0x0001; }

if(((t&0x0080)==0x0080)||((t&0x0100)==0x0100)) { to=3; *P_Watchdog_Clear=0x0001; }

if((t&0x0200)==0x0200) { to=4; *P_Watchdog_Clear=0x0001; }

if(to>at) { *P_IOB_Data=up; *P_Watchdog_Clear=0x0001; }

if(to==at) { *P_IOB_Data=stop; *P_Watchdog_Clear=0x0001; }

if(to50 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录六 计算器

#include \"spce061A.h\" #include \"Define.h\" void DelayMs(uint t) {

while(t--) { uint j; for(j=0;j<500;j++) {} } }

int num1=0,num2=0; int result=0; int i=0;k=0;

int Getnum() {

while (i==0) {

if((IOA&btin1)==btin1) { num1=1; i++; IOB=0x1000; DelayMs(100); dog(); }

if((IOA&btin2)==btin2) { num1=2; i++; IOB=0x2000; DelayMs(100); dog(); }

if((IOA&btin3)==btin3) { num1=3; i++; IOB=0x3000; DelayMs(100); dog();

51 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

}

if((IOA&btin4)==btin4) { num1=4; i++; IOB=0x4000; DelayMs(100); dog(); }

dog(); }

while (i==1) {

if((IOA&btin1)==btin1) { num2=1; i++; IOB=0x1000; dog(); }

if((IOA&btin2)==btin2) { num2=2; i++; IOB=0x2000; dog(); }

if((IOA&btin3)==btin3) { num2=3; i++; IOB=0x3000; dog(); }

if((IOA&btin4)==btin4) { num2=4; i++; IOB=0x4000; dog(); }

dog(); }

return(num1,num2);

52 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

}

void main() {

*P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0;

while(1) { Getnum(); while((i==2)&&((num1*num2)!=0)) { if((IOA&bt4down)==bt4down) { result=num1+num2; i++; DelayMs(100); dog(); } if((IOA&bt3up)==bt3up) { result=num1-num2; i++; DelayMs(100); dog(); } if((IOA&bt3down)==bt3down) { result=num1*num2; i++; DelayMs(100); dog(); } dog(); } if((result<0)||(result>7)) { IOB=0x0000; DelayMs(30); IOB=0x1000;

53 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

DelayMs(30); i++; } else { switch (result) { case 0: { i++; IOB=0x0000; dog(); break; } case 1: { i++; IOB=0x1000; dog(); break; } case 2: { i++; IOB=0x2000; dog(); break; } case 3: { i++; IOB=0x3000; dog(); break; } case 4: {i++; IOB=0x4000; dog(); break; } case 5: { i++;

/ 95

电梯控制程序源代码(带流程图-功能分解、源代码)

} }

IOB=0x5000; dog(); break; } case 6: { i++; IOB=0x6000; dog(); break; } case 7: {i++; IOB=0x7000; dog(); break; } } dog(); }

if((IOA&bt2down)==bt2down) { num1=0; num2=0; i=0; IOB=0x0000; }

dog();

55 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录七 密码锁

#include \"spce061A.h\" #include \"dingyi.h\"

char code[6]={'1','3','5','2','4','6'}; char input[6]={'0','0','0','0','0','0'}; char inputcode[6]; int i=0,j=0;

void DelayMs(uint t) {

while(t--) { uint j; for(j=0;j<100;j++) { dog(); } } }

char GetInput() {

while (i<6) {

if((IOA&bt1up)==bt1up) { input[i]='1'; i++; IOB=L1up; DelayMs(100); dog(); }

if((IOA&bt2up)==bt2up) { input[i]='3'; IOB=L2up; i++; DelayMs(100); dog(); }

if((IOA&bt3up)==bt3up) { input[i]='5';

56 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

IOB=L3up; i++; DelayMs(100); dog(); }

if((IOA&bt2down)==bt2down) { input[i]='2'; i++; IOB=L2down; DelayMs(100); dog(); }

if((IOA&bt3down)==bt3down) { input[i]='4'; i++; IOB=L3down; DelayMs(100); dog(); }

if((IOA&bt4down)==bt4down) { input[i]='6'; i++; IOB=L4down; DelayMs(100); dog(); }

dog(); }

return(input[i]); }

void main() {

*P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0;

while(1)

57 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

{ if((IOB&openok)==openok) { DelayMs(200); while((IOB&closeok)!=closeok) { IOB=close; dog(); } } dog(); input[0]='0'; input[1]='0'; input[2]='0'; input[3]='0'; input[4]='0'; input[5]='0'; i=0; GetInput(); dog(); if((input[0]==code[0])&&(input[1]==code[1])&&(input[2]==code[2])&&(input[3]== code[3])&&(input[4]==code[4])&&(input[5]==code[5])) { while ((IOB&openok)!=openok) { IOB=open; dog(); } } dog(); } }

58 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录八 逐层停开关门循环

#include \"spce061A.h\" #include \"Define.h\"

int IOB_LED; int IOB_GO; int shangxia=1; int DoorEnable=0;

void DelayMs(uint t) {

while(t--) { uint j; for(j=0;j<50;j++) { IOB=stop+IOB_LED; } } }

int at=1;

void main() {

*P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0;

while(1) { AtAndTo(); switch(at) { case 1: { IOB_LED=L1; DelayMs(100); OpenAndClose(); while(at==1)

59 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

{ IOB=up+L1+L1up; DoorEnable=1; AtAndTo(); dog(); } break; }

case 2: { IOB_LED=L2; if(shangxia==1) { DelayMs(100); OpenAndClose(); while(at==2) { IOB=up+L2+L2up; DoorEnable=1; AtAndTo(); dog(); } break; } if(shangxia==0) { DelayMs(100); OpenAndClose(); while(at==2) { IOB=down+L2+L2down; DoorEnable=1; AtAndTo(); dog(); } break; } }

case 3: { IOB_LED=L3; if(shangxia==1) {

60 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

} }

}

DelayMs(100); OpenAndClose(); while(at==3) { IOB=up+L3+L3up; DoorEnable=1; AtAndTo(); dog(); } break; } if(shangxia==0) { DelayMs(100); OpenAndClose(); while(at==3) { IOB=down+L3+L3down; DoorEnable=1; AtAndTo(); dog(); } break; } }

case 4: { IOB_LED=L4; DelayMs(100); OpenAndClose(); while(at==4) { IOB=down+L4+L4down; DoorEnable=1; AtAndTo(); dog(); } break; }

dog();

61 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

#include \"spce061A.h\" #include \"Define.h\" extern int shangxia; extern int at;

int AtAndTo() {

if((IOA&at1)==at1) { at=1; shangxia=1; dog(); }

if((IOA&at2)==at2) { at=2; dog(); }

if((IOA&at3)==at3) { at=3; dog(); }

if((IOA&at4)==at4) { at=4; shangxia=0; dog(); }

return (shangxia); }

#include \"spce061A.h\" #include \"Define.h\" extern int DoorEnable;

void OpenAndClose() {

while(((IOB&openok)!=openok)&&(DoorEnable==1)) { IOB=open; dog(); }

DelayMs(100);

62 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

while(((IOB&closeok)!=closeok)&&(DoorEnable==1)) { IOB=close; dog(); }

DoorEnable=0; }

63 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录九 可记录顺序逐层停自动开关门

#include \"spce061A.h\" #include \"define.h\"

char input[100]={'0'}; int i=0,j=0,k=0,m=0; char at; char to;

int DoorEnable=0; int IOB_GO; int IOB_LED=0;

void DelayMs(uint t) {

while(t--) { uint j; for(j=0;j<200;j++) { dog(); } } }

char GetInput() {

while ((i<10)&&(k==0)) {

if((IOA&bt1up)==bt1up) { input[i]='1'; i++; IOB=L1up; DelayMs(50); dog(); }

if((IOA&bt2up)==bt2up) { input[i]='2'; IOB=L2up; i++; DelayMs(50); dog();

/ 95

电梯控制程序源代码(带流程图-功能分解、源代码)

}

if((IOA&bt3up)==bt3up) { input[i]='3'; IOB=L3up; i++; DelayMs(50); dog(); }

if((IOA&bt2down)==bt2down) { i=0; IOB=L2down; DelayMs(50); dog(); }

if((IOA&bt3down)==bt3down) { k=1; IOB=L3down; DelayMs(50); dog(); }

if((IOA&bt4down)==bt4down) { input[i]='4'; i++; IOB=L4down; DelayMs(50); dog(); }

dog(); }

return(input[i],i); }

void main() {

*P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0;

65 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

while(1) { if((IOB&openok)==openok) { DelayMs(200); while((IOB&closeok)!=closeok) { IOB=close; dog(); } } dog(); input[1]='0'; input[2]='0'; input[3]='0'; input[4]='0'; input[5]='0'; i=0; k=0; GetInput(); for(m=0;m#include \"spce061A.h\" #include \"define.h\"

extern int at;

char GetAt() { if((IOA&at1)==at1) { at='1'; *P_Watchdog_Clear=0x0001; }

66 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

if((IOA&at2)==at2) { at='2'; *P_Watchdog_Clear=0x0001; } if((IOA&at3)==at3) { at='3'; *P_Watchdog_Clear=0x0001; } if((IOA&at4)==at4) { at='4'; *P_Watchdog_Clear=0x0001; } return(at); }

#include \"spce061A.h\" #include \"define.h\"

extern char at; extern char to; extern int IOB_GO; extern int DoorEnable; extern int i;

void UpAndDown(char to) { GetAt(); if(at==to) { IOB_GO=stop; IOB=stop; GetAt(); OpenAndClose(); *P_Watchdog_Clear=0x0001; } if(at>to) { while(at!=to) { IOB_GO=down;

67 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

IOB=down; GetAt(); DoorEnable=1; *P_Watchdog_Clear=0x0001; } OpenAndClose(); dog(); } if(at#include \"spce061A.h\" #include \"define.h\"

extern int IOB_LED,IOB_GO; extern int DoorEnable;

void OpenAndClose() {

while(((IOB&openok)!=openok)&(DoorEnable==1)) { IOB=open+IOB_LED; dog(); }

DelayMs(200);

while ((IOB&closeok)!=closeok) { IOB=close+IOB_LED; dog(); }

68 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

DoorEnable=0; return; }

69 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录十 外部按键电梯

#include \"spce061A.h\" #include \"qujing.h\"

int t=0;

int at=0,to=0;

int IOB_LED,IOB_GO; int IOB_BTLED; int DoorEnable;

void main () {

*P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0;

while(1) { t=IOA; AtAndTo(); UpAndDown(at,to); LED(at); btLED(t); IOB=IOB_LED+IOB_GO+IOB_BTLED; if(at==to) { DoorEnableFnc(); OpenAndClose(); } } }

#include \"spce061A.h\" #include \"qujing.h\"

extern int at;

extern int IOB_GO; extern int DoorEnable;

int UpAndDown(int at,int to)

70 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

{

if((at==to)&&(((IOA&at1)==at1)||((IOA&at2)==at2)||((IOA&at3)==at3)||((IOA&at4)==at4))) { IOB_GO=stop; AtAndTo(); *P_Watchdog_Clear=0x0001; }

if(at>to) { IOB_GO=down; AtAndTo(); DoorEnable=1; *P_Watchdog_Clear=0x0001; }

if(at } return(IOB_GO); }

#include \"spce061A.h\" #include \"qujing.h\"

extern int at; extern int to;

extern int IOB_LED,IOB_GO; extern int DoorEnable;

void OpenAndClose() {

if(at!=to) IOB=close;

while(((IOB&openok)!=openok)&(DoorEnable==1)) { IOB=open+IOB_LED; dog(); if(IOB==openok) break;

71 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

}

if((IOA&btclose)==btclose) { while ((IOB&closeok)!i=closeok) { IOB=close+IOB_LED; dog(); AtAndTo(); } DoorEnable=0; return; } }

#include \"spce061A.h\" #include \"qujing.h\"

extern int at; extern int to;

int AtAndTo() { if((IOA&at1)==at1) { at=1; *P_Watchdog_Clear=0x0001; } if((IOA&at2)==at2) { at=2; *P_Watchdog_Clear=0x0001; } if((IOA&at3)==at3) { at=3; *P_Watchdog_Clear=0x0001; } if((IOA&at4)==at4) { at=4; *P_Watchdog_Clear=0x0001; } if((IOA&bt1up)==bt1up)

72 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

{ to=1; dog(); } if((IOA&bt1up)==bt1up) { to=1; dog(); } if((IOA&bt2up)==bt2up) { to=2; dog(); } if((IOA&bt3up)==bt3up) { to=3; dog(); } if((IOA&bt2down)==bt2down) { to=2; dog(); } if((IOA&bt3down)==bt3down) { to=3; dog(); } if((IOA&bt4down)==bt4down) { to=4; dog(); } return (at,to); }

#include \"spce061A.h\" #include \"qujing.h\"

extern int at; extern int t;

extern int DoorEnable;

73 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

int DoorEnableFnc() {

if(at==1) { if((t&bt1up)==bt1up) DoorEnable=1; }

if(at==2) { if(((t&bt2up)==bt2up)||((t&bt2down)==bt2down)) DoorEnable=1; }

if(at==3) { if(((t&bt3up)==bt3up)||((t&bt3down)==bt3down)) DoorEnable=1; }

if(at==4) { if((t&bt4down)==bt4down) DoorEnable=1; }

return(DoorEnable); }

#include \"spce061A.h\" #include \"qujing.h\"

extern int IOB_BTLED;

int btLED(int t) {

if(t==bt1up) { IOB_BTLED=L1up; dog(); }

if(t==bt2up) { IOB_BTLED=L2up; dog(); }

if(t==bt2down) {

74 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

IOB_BTLED=L2down; dog(); }

if(t==bt3up) { IOB_BTLED=L3up; dog(); }

if(t==bt3down) { IOB_BTLED=L3down; dog(); }

if(t==bt4down) { IOB_BTLED=L4down; dog(); }

return(IOB_BTLED); }

#include \"spce061A.h\" #include \"qujing.h\" extern int at; extern int to;

extern int IOB_LED;

int LED(int at) {

if(at==1) { IOB_LED=L1; *P_Watchdog_Clear=0x0001; }

if(at==2) { IOB_LED=L2; *P_Watchdog_Clear=0x0001; }

if(at==3) { IOB_LED=L3; *P_Watchdog_Clear=0x0001; }

75 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

if(at==4) { IOB_LED=L4; *P_Watchdog_Clear=0x0001; }

return(IOB_LED); }

76 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

附录十一 完整电梯程序

#include \"spce061A.h\" #include \"define.h\"

void DelayMs(uint t) {

while(t--) { uint j; for(j=0;j<500;j++) {} } }

int twoup=0,twodown=0,threeup=0,threedown=0; int one=0,four=0,three=0,two=0; int at=0,state=0,doorenable=0; int IOB_LED,IOB_btLED;

int IOB_L2down,IOB_L3down,IOB_L4down,IOB_L1up,IOB_L2up,IOB_L3up;

void main() {

*P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0;

while(1) { getto(); getat(); while((IOB&closeok)!=closeok) { IOB=close+IOB_LED+IOB_btLED; getto(); dog(); } doorenable=0; if(at==1) { if(one==1)

77 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

{ doorenable=1; openandclose(); one=0; }

IOB_L1up=0; state=1;

if((twoup==1)||(twodown==1)||(threeup==1)||(threedown==1)||(four==1)||(two==1)||(three==1)) { while(at!=2) { IOB=up+IOB_LED+IOB_btLED; getat(); getto(); state=1; doorenable=1; } IOB_L2up=0; }

}

if(at==2) { if(state==0) { if((twodown==1)||(two==1)) { doorenable=1; openandclose(); twodown=0; two=0; state=0; } if(((twoup==1)||(two==1))&&(one==0)) { doorenable=1; openandclose(); twoup=0; two=0; state=1; } if(one==1) {

78 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

while(at!=1) { IOB=down+IOB_LED+IOB_btLED; getat(); getto(); state=0; doorenable=1; } IOB_L1up=0; }

if((one==0)&&((threeup==1)||(threedown==1)||(four==1)||(three==1))) { while(at!=3) { IOB=up+IOB_LED+IOB_btLED; getat(); getto(); state=1; doorenable=1; } IOB_L3up=0; }

}

if(state==1) { if((twoup==1)||(two==1)) { doorenable=1; openandclose(); twoup=0; two=0; state=1; }

if(((twodown==1)||(two==1))&&(threeup==0)&&(threedown==0)&&(four==0)&&(three==0)) { doorenable=1; openandclose(); twodown=0; two=0; state=0; } if((threeup==1)||(threedown==1)||(four==1)||(three==1))

79 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

{ while(at!=3) { IOB=up+IOB_LED+IOB_btLED; getat(); getto(); state=1; doorenable=1; } IOB_L3up=0; }

if((one==1)&&(threeup==0)&&(threedown==0)&&(four==0)&&(three==0)) { while(at!=1) { IOB=down+IOB_LED+IOB_btLED; getat(); getto(); state=0; doorenable=1; } IOB_L1up=0; }

} }

if(at==3) { if(state==1) { if((threeup==1)||(three==1)) { openandclose(); threeup=0; three=0; state=1; } if((threedown==1)&&(four==0)&&(three==1)) { openandclose(); threedown=0; three==0;

80 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

state=0; } if(four==1) { while(at!=4) { IOB=up+IOB_LED+IOB_btLED; getat(); getto(); state=1; doorenable=1; } IOB_L4down=0; } if((four==0)&&((twoup==1)||(twodown==1)||(one==1)||(two==1))) { while(at!=2) { IOB=down+IOB_LED+IOB_btLED; getat(); getto(); state=0; doorenable=1; } IOB_L2down=0; getat(); } }

if(state==0) { if((threedown==1)||(three==1)) { doorenable=1; openandclose(); threedown=0; state=0; }

if(((threeup==1)||(three==1))&&(twoup==0)&&(twodown==0)&&(one==0)&&(two==0)) { doorenable=1; openandclose(); threeup=0;

81 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

three==0; state=0; } if((twoup==1)||(twodown==1)||(one==1)||(two==1)) { while(at!=2) { IOB=down+IOB_LED+IOB_btLED; getat(); getto(); state=0; doorenable=1; } IOB_L2down=0; getat(); } if((four==1)&&(twoup==0)&&(twodown==0)&&(one==0)&&(two==0)) { while(at!=4) { IOB=up+IOB_LED+IOB_btLED; getat(); getto(); state=1; doorenable=1; } state=0; IOB_L4down=0; } } }

if(at==4) { if(four==1) { doorenable=1; openandclose(); four=0; } IOB_L4down=0; state=0;

if((threeup==1)||(threedown==1)||(twoup==1)||(twodown==1)||(one==1)|

82 / 95

电梯控制程序源代码(带流程图-功能分解、源代码) |(three==1)||(two==1)) { while(at!=3) { IOB=down+IOB_LED+IOB_btLED; getat(); getto(); state=0; doorenable=1; } IOB_L3down=0; }

} } }

#include \"spce061A.h\" #include \"define.h\"

extern int one,twodown,twoup,threedown,threeup,four,three,two; extern int IOB_btLED;

extern int IOB_L2down,IOB_L3down,IOB_L4down,IOB_L1up,IOB_L2up,IOB_L3up;

void getto() {

if((IOA&bt1up)==bt1up) { one=1; IOB_L1up=L1up; }

if((IOA&bt2up)==bt2up) { twoup=1; IOB_L2up=L2up; }

if((IOA&bt2down)==bt2down) { twodown=1; IOB_L2down=L2down; }

if((IOA&bt3up)==bt3up) { threeup=1; IOB_L3up=L3up;

83 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

}

if((IOA&bt3down)==bt3down) { threedown=1; IOB_L3down=L3down; }

if((IOA&bt4down)==bt4down) { four=1; IOB_L4down=L4down; }

if((IOA&btin1)==btin1) { one=1; }

if((IOA&btin2)==btin2) { two=1; }

if((IOA&btin3)==btin4) { three=1; }

if((IOA&btin4)==btin4) { four=1; }

dog();

IOB_btLED=IOB_L1up+IOB_L2up+IOB_L3up+IOB_L4down+IOB_L3down+IOB_L2down; return; }

#include \"spce061A.h\" #include \"define.h\"

extern int at;

extern int IOB_LED;

extern int IOB_L2down,IOB_L3down,IOB_L4down,IOB_L1up,IOB_L2up,IOB_L3up; extern int state;

void getat(state) {

if((IOA&at1)==at1) {

84 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

at=1; IOB_LED=L1; }

if((IOA&at2)==at2) { at=2; IOB_LED=L2; }

if((IOA&at3)==at3) { at=3; IOB_LED=L3; }

if((IOA&at4)==at4) { at=4; IOB_LED=L4; }

dog(); return; }

#include \"spce061A.h\" #include \"define.h\"

extern int doorenable; extern int state; extern int at;

int DoorEnable {

if((IOA&btopen)==btopen) doorenable=1; switch(state) { case 0: if(at==1) { if((IOA&bt1up)==bt1up) doorenable=1; } if(at==2) {

85 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

if((IOA&bt2down)==bt2down) doorenable=1; } if(at==3) { if((IOA&bt3down)==bt3down) doorenable=1; } if(at==4) { if((IOA&bt4down)==bt4down) doorenable=1; } break; case 1: if(at==1) { if((IOA&bt1up)==bt1up) doorenable=1; } if(at==2) { if((IOA&bt2up)==bt2up) doorenable=1; } if(at==3) { if((IOA&bt3up)==bt3up) doorenable=1; } if(at==4) { if((IOA&bt4down)==bt4down) doorenable=1; } break; }

return; }

#include \"spce061A.h\" #include \"define.h\"

extern int doorenable;

86 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

extern int IOB_LED; extern int IOB_btLED; extern int state; extern int at;

extern int IOB_L2down,IOB_L3down,IOB_L4down,IOB_L1up,IOB_L2up,IOB_L3up;

int openandclose() {

if(doorenable==1) { IOB=stop+IOB_LED; doorenable=0; while((IOB&openok)!=openok) { if(state==1) { IOB=open+IOB_LED+IOB_btLED+0x0001; getto(); dog(); } else { IOB=open+IOB_LED+IOB_btLED; getto(); dog(); } } DelayMs(100); while ((IOB&closeok)!=closeok) { DoorEnable(); if(doorenable==1) { IOB=stop+IOB_LED; while((IOB&openok)!=openok) { if(state==1) { IOB=open+IOB_LED+IOB_btLED+0x0001; getto(); dog(); }

87 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

else { IOB=open+IOB_LED+IOB_btLED; getto(); dog(); } } doorenable=0; DelayMs(100); } else if(state==1) { IOB=close+IOB_LED+IOB_btLED+0x0001; getto(); dog(); } else { IOB=close+IOB_LED+IOB_btLED; getto(); dog(); } }

switch(at) { case 1: IOB_L1up=0;break; case 2: { if(state==1) IOB_L2up=0; else IOB_L2down=0; break; } case 3: { if(state==1) IOB_L3up=0; else IOB_L3down=0; break; }

88 / 95

电梯控制程序源代码(带流程图-功能分解、源代码)

case 4: IOB_L4down=0;break; } }

return; }

/ 95

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- yrrf.cn 版权所有 赣ICP备2024042794号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务