1、单片机控制电梯模型教学教1 单片机控制电梯模型教学教案:蒋龙 2010年 6月 23日工程训练中心 绪论1.背景与目的 据统计,我国在用电梯34.6万多台,每年还以约5-6万台的速度增长。电梯服务中国已有100多年的历史,而我国在用电梯数量的快速增长却发生在改革开放以后,目前我国电梯技术水平已与世界同步。电梯模型将机械和电气两方面有机的结合起来,充分体现了机电结合的特点,并且可以在学生机电实验方面得到广泛的应用。2.研究方法参照凌阳SPCE061A开发的相关资料,加深对控制电梯模型的单片机的了解。进行61板的相关实验,掌握单片机实现基本功能的技术。对单片机编写程序,以达到控制电梯模型的目的。第
2、一章 电梯模型硬件设备1.1 实验单片机模型与接口定义1.1.1实验单片机模型实验用单片机(图2.1)为凌阳SPCE061A微控制器(简称61板),是以凌阳16位单片机SPCE061A为核心的精简开发仿真实验板。61板除了具备单片机最小系统电路外,还包括有电源电路、音频电路、复位电路等,采用电池供电,方便携带。图1.1 凌阳SPCE061A单片机SPCE061A主要包括输入/输出端口、定时器/计数器、数/模转换、模/数转换、串行设备输入输出、通用异步串行接口、低电压监测和复位等部分,并且内置在线仿真电路ICE接口,较高的处理速度使其能够快速的处理复杂的数字信号。本电梯模型就是采用此单片机进行程
3、序编写与实现电梯的运行控制。1.1.2单片机接口定义实验单片机的接口定义如图1.2,其中A口为输入,B口为输出。图1.2 单片机输入输出接口定义1.1.3 I/O接口DATA控制命令表表1.1是单片机A口Data控制命令表:表1.1A 口(信号输入)*P_IOA_Data接口编号电梯动作0x0001A0去一层(内部按键)0x0002A1去二层(内部按键)0x0004A2去三层(内部按键)0x0008A3去四层(内部按键)0x0010A4一层上(外部按键)0x0020A5二层上(外部按键)0x0040A6二层下(外部按键)0x0080A7三层上(外部按键)0x0100A8三层下(外部按键)0x0
4、200A9四层下(外部按键)0x0400A10一层到达0x0800A11二层到达0x1000A12三层到达0x2000A13四层到达0x4000A14开门(内部按键)0x8000A15关门(内部按键)表1.2是单片机B口Data控制命令表:表1.2:B口(信号输出)*P_IOB_Data接口编号电梯动作0x0001B0电梯上下运行(1上0下)0x0002B1电梯运行选通(1行0停)0x0004B2开关门运行(1开0关)0x0008B3开关门选通(1行0禁)0x0010B4一层上灯0x0020B5二层上灯0x0040B6二层下灯0x0080B7三层上灯0x0100B8三层下灯0x0200B9四层
5、下灯0x0400B10开门到位0x0800B11关门到位0x1000B12数码管显示层数0x2000B130x4000B140x8000B15单片机接口属性设置如下:*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;1.2 电梯控制命令说明1. 一层上按钮按下, *P_IOA_Data输入值为0x0010,使一层上按键灯亮起的命令为:*P_IOB_Data=0x0010,其他层按
6、键灯不受影响。2. 二层上按钮按下, *P_IOA_Data输入值为0x0020,使二层上按键灯亮起的命令为:*P_IOB_Data=0x0020,其他层按键灯不受影响。3. 二层下按钮按下, *P_IOA_Data输入值为0x0040,使二层下按键灯亮起的命令为:*P_IOB_Data=0x0040,其他层按键灯不受影响。4. 三层上按钮按下, *P_IOA_Data输入值为0x0080,使三层上按键灯亮起的命令为:*P_IOB_Data=0x0080,其他层按键灯不受影响。5. 三层下按钮按下, *P_IOA_Data输入值为0x0100,使三层下按键灯亮起的命令为:*P_IOB_Data
7、=0x0100,其他层按键灯不受影响。6. 四层下按钮按下, *P_IOA_Data输入值为0x0200,使四层下按键灯亮起的命令为:*P_IOB_Data=0x0200,其他层按键灯不受影响。7. 电梯内部开门按钮按下,*P_IOA_Data输入值为0x4000,使电梯开门的命令为:*P_IOB_Data=0x000c,电梯执行开门动作。8. 电梯内部关门按钮按下,*P_IOA_Data输入值为0x8000,使电梯关门的命令为:*P_IOB_Data=0x0008,电梯执行关门动作。第二章 灯控制程序2.1灯从下到上循环亮2.1.1流程图开始系统初始化输出单个灯控制信号 相应的灯亮起2.1.
8、2程序#include #define D1 0x0010 #define D20 0x0040 #define D21 0x0020 #define D30 0x0100 #define D31 0x0080 #define D4 0x0200void dly (unsigned int undly) int m; for(m=0;mundly;m+) int n; for(n=0;nundly;n+) n=n; void main(void) int i; int shunxu=D1,D20,D21,D30,D31,D4; *P_IOA_Dir=0; *P_IOA_Attrib=0; *P
9、_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0; while(1) for(i=0;i=5;i+) *P_IOB_Data=shunxui; dly(100); *P_Watchdog_Clear=0x0001; 2.1.3功能简介及实现过程本程序能实现是外部按键的灯从下到上依次亮起,在一个灯亮起的同时前一个已经亮起的灯灭掉,并且可以调节相邻两个灯亮起的时间间隔出的功能。本程序采用宏定义功能,将各个灯的端口地址定义为一个简单的代码,最后在主程序中将代码全部放入一个数组中,这样可以方便地使用for循环语句,是
10、程序看起来简单明了。在这一段程序中还有一个时间延迟子程序,通过改变数值大小从而实现改变相邻灯亮起的时间间隔的功能。2.2灯从下到上依次亮(后一个亮时前一个保持亮)2.2.1流程图开始系统初始化输出灯控制信号 相应的灯亮起输出另一个灯控信号相应灯亮起,之前灯灭掉 2.2.2 程序 #include #define D1 0x0010 #define D20 0x0050 #define D21 0x0070 #define D30 0x0170 #define D31 0x01f0 #define D4 0x03f0void dly (unsigned int undly) int m; for
11、(m=0;mundly;m+) int n; for(n=0;nundly;n+) n=n; void main(void) int i; int shunxu=0,D1,D20,D21,D30,D31,D4; *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) for(i=0;i=6;i+) *P_IOB_Data=shunxui; dly(100); *P_Watchdog_Clear=0x0001; 2.2.3功能简介及
12、实现过程本程序能实现的功能是外部按键的灯从下到上依次亮起,在一个灯亮起的同时前一个已经亮起的灯仍然保持亮,知道全部的灯都亮起后再同时灭掉,而后开始下一个循环。并且可以调节相邻两个灯亮起的时间间隔出的功能。本程序同样采用采用宏定义功能,将同时亮着的各个灯的端口地址定义在一个一个简单的代码内,最后在主程序中将代码全部放入一个数组中,这样可以方便地使用for循环语句,是程序看起来简单明了。在这一段程序中还有一个时间延迟子程序,通过改变数值大小从而实现改变相邻灯亮起的时间间隔的功能。2.3灯成组亮2.3.1流程图 开始系统初始化同时输出多个灯控制信号 相应的灯亮起2.3.2程序#include #de
13、fine D1 0x0050 #define D20 0x0120 #define D21 0x0280 #define D30 0x0070 #define D31 0x0380 #define D4 0x03f0void dly (unsigned int undly) int m; for(m=0;mundly;m+) int n; for(n=0;nundly;n+) n=n; void main(void) int i; int output=0; int t=0; int shunxu=0,D1,D20,D21,D30,D31,D4; *P_IOA_Dir=0; *P_IOA_At
14、trib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff; *P_IOB_Data=0; while(1) for(i=0;i=6;i+) *P_IOB_Data=shunxui; dly(100); *P_Watchdog_Clear=0x0001; 2.3.3功能简介及实现过程本程序能实现的功能是一层上和二层下的灯同时亮,然后二层上和三层下的灯同时亮,然后三层上和四层下的灯同时亮,然后一层上、二层下和三层下的灯同时亮,然后二层上、二层下和三层下的灯同时亮,然后所有的灯全部亮起,而后所有灯灭掉开始新一轮循环。在一组灯亮起的同
15、时前一组已经亮起的灯灭掉,直到最后一组灯都亮起后再同时灭掉,而后开始下一个循环。并且可以调节相邻两个灯亮起的时间间隔出的功能。本程序同样采用采用宏定义功能,将同时亮着的一组灯的各个端口地址定义在一个一个简单的代码内,最后在主程序中将代码全部放入一个数组中,这样可以方便地使用for循环语句,是程序看起来简单明了。在这一段程序中还有一个时间延迟子程序,通过改变数值大小从而实现改变相邻灯亮起的时间间隔的功能。现在可以看出以上三个灯控制程序基本上是一样的,只是在宏定义语句中改变了每个代码所代表的端口地址值,其它的主程序语句完全一样。这也反映出了使用宏定义语句的程序的优越性。当然也可以采用其它语句来实现
16、上述功能,比如采用while循环控制语句内嵌控制,每次只控制一个灯的亮或者灭,然后使用“或”逻辑语句实现前后亮灯的独立性或者实现灯的成组亮。这样的程序看起来简单明了,便于理解,但是程序过于冗杂。2.4数码显示2.4.1流程图开始系统初始化输出数字显示信号显示相应的数字 2.4.2程序#include void main(void) *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) *P_IOB_Data=0x2000; *P
17、_Watchdog_Clear=0x0001; 2.4.3功能简介及实现过程本程序实现的功能非常简单,就是让数码管显示一个数字2。实现的过程也比较简单,只需将要显示的楼层数输入到相应的端口地址内就行了。第三章 按键与灯控制3.1按电梯按键,相应灯亮并保持3.1.1流程图 开始 系统初始化按键信号扫描 是否有按键信号请求N Y相应按键灯亮 3.1.2程序#include void main() int input,t=0; *P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff;
18、*P_IOB_Data=0; while(1) t=*P_IOA_Data; if(t&0x0010)=0x0010) *P_IOB_Data=*P_IOB_Data|0x0010; *P_Watchdog_Clear=0x0001; if(t&0x0020)=0x0020) *P_IOB_Data=*P_IOB_Data|0x0020; *P_Watchdog_Clear=0x0001; if(t&0x0040)=0x0040) *P_IOB_Data=*P_IOB_Data|0x0040; *P_Watchdog_Clear=0x0001; if(t&0x0080)=0x0080) *P_
19、IOB_Data=*P_IOB_Data|0x0080; *P_Watchdog_Clear=0x0001; if(t&0x0100)=0x0100) *P_IOB_Data=*P_IOB_Data|0x0100; *P_Watchdog_Clear=0x0001; if(t&0x0200)=0x0200) *P_IOB_Data=*P_IOB_Data|0x0200; *P_Watchdog_Clear=0x0001;*P_Watchdog_Clear=0x0001; 3.1.3功能简介及实现过程通过按电梯外部按键,相应按键会亮灯并保持住。本程序通过对系统的初始化之后,识别电梯外部按键,即将
20、A口定义为相应的按键层数,然后B口得到相应的信号,使电梯按键灯亮起。例如:按电梯2层上按键,则对应的A口即为*P_IOA_Data=0x0020,此时B口*P_IOB_Data=0x0020,即二层上按键亮起;再按四层下按键,则四层下按键灯亮起,此时二层上和四层下灯都亮着,依次类推。这里涉及到“或语句”,即在执行下一条命令时,不会破坏之前的定义值,如之前的B口为*P_IOB_Data=0x0100,即三层下灯亮,如果接下来按三层上键,则*P_IOB_Data=*P_IOB_Data|0x0080,即此时*P_IOB_Data=0x01800,三层上键和下键的灯都亮。3.1.4方法及建议此程序的
21、方法基础即按键控制灯亮,通过把按键信号传给A口,经单片机识别之后执行B口命令,则相应的灯亮起,编程时注意不要把相应的端口定义错,并且注意看门狗的使用,以免程序自动跳出,最重要的是对“或”语句的理解和使用。3.2按电梯按键,相应灯亮但之前的灭掉3.2.1流程图 开始系统初始化按键信号扫描 是否有按键信号请求N Y 相应按键亮灯, 之前的灯灭 3.2.2程序#include void main() int input,t=0; *P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0xf3ff; *P_IOB_Attrib=0xf3ff;
22、 *P_IOB_Data=0; while(1) t=*P_IOA_Data; if(t&0x0010)=0x0010) *P_IOB_Data=0x0010; *P_Watchdog_Clear=0x0001; if(t&0x0020)=0x0020) *P_IOB_Data=0x0020; *P_Watchdog_Clear=0x0001; if(t&0x0040)=0x0040) *P_IOB_Data=0x0040; *P_Watchdog_Clear=0x0001; if(t&0x0080)=0x0080) *P_IOB_Data=0x0080; *P_Watchdog_Clear=
23、0x0001; if(t&0x0100)=0x0100) *P_IOB_Data=0x0100; *P_Watchdog_Clear=0x0001; if(t&0x0200)=0x0200) *P_IOB_Data=0x0200; *P_Watchdog_Clear=0x0001; *P_Watchdog_Clear=0x0001; 3.2.2功能简介及实现过程通过按电梯外部按键,相应按键会亮灯。本程序通过对系统的初始化之后,识别电梯外部按键,即将A 口定义为相应的按键层数,然后B口得到相应的信号,使电梯按键灯亮起。例如:按电梯2层上按键,则对应的A口即为*P_IOA_Data=0x0020,
24、此时B口*P_IOB_Data=0x0020,即二层上按键亮起;再按四层下按键,则四层下按键灯亮起,此时二层灯会灭掉,这里涉及到“与语句”, 注意体会它与“或语句”的区别和使用方法,如之前的B口为*P_IOB_Data=0x0100,即三层下灯亮,如果接下来按三层上键,则*P_IOB_Data=*P_IOB_Data|0x0080,即此时*P_IOB_Data=0x01800,三层上键和下键的灯都亮,再执行“与语句“*P_IOB_Data=*P_IOB_Data&0x0080,则此时*P_IOB_Data=0x0080,即只有三层上灯亮,三层下灯将灭掉。3.2.3方法及建议此处涉及到的“或语句
25、”和“与语句”在电梯的程序中经常用到,要认真体会其含义和用法才能运用自如,这就需要在编程中练习使用,以达到运用自如。3.3按电梯按键,数码管显示相应层数3.3.1流程图开始系统初始化按键信号扫描 是否有按键信号请求N Y显示相应的楼层数 3.3.2程序#include void main() int input,t=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)
26、=0x0010) *P_IOB_Data=0x1000; *P_Watchdog_Clear=0x0001; if(t&0x0020)=0x0020) *P_IOB_Data=0x2000; *P_Watchdog_Clear=0x0001; if(t&0x0040)=0x0040) *P_IOB_Data=0x2000; *P_Watchdog_Clear=0x0001; if(t&0x0080)=0x0080) *P_IOB_Data=0x3000; *P_Watchdog_Clear=0x0001; if(t&0x0100)=0x0100) *P_IOB_Data=0x3000; *P_
27、Watchdog_Clear=0x0001; if(t&0x0200)=0x0200) *P_IOB_Data=0x4000; *P_Watchdog_Clear=0x0001;*P_Watchdog_Clear=0x0001; 3.3.3功能简介及实现过程通过按电梯外部按键,数码管能显示相应的层数。本程序通过对系统的初始化之后,识别电梯外部按键,即将A口定义为相应的按键层数,然后B口得到相应的信号,使数码管显示相应的层数。例如:按电梯2层上按键,则对应的A口即为*P_IOA_Data=0x0020,此时B口*P_IOB_Data=0x2000,即数码管显示2层。3.3.4方法及建议此程序相对基础,对单片机的接口定义的理解很有帮助,编辑时注意接口对应即可,对程序做一些自己的改动以实现新的功能,可练习对单片机的灵活使用。第四章 电梯上下运行4.1电梯三四层无开关门无层数显示循环运作4.1.1流程图开始系统初始化是否有关门到位信号 Y N 关门电梯上行 N是否四层到达 Y暂停电梯下行 N是否三层到达 Y暂停4.1.2程序#include void main() int i,j,p; *P_IOA_Dir=0; *P_IOA_Attrib=0; *P_IOA_Data=0; *P_IOB_Dir=0x0300; *P_IOB_Attri
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1