单片机控制电梯模型教学教1.docx

上传人:b****6 文档编号:4765799 上传时间:2022-12-08 格式:DOCX 页数:54 大小:245.97KB
下载 相关 举报
单片机控制电梯模型教学教1.docx_第1页
第1页 / 共54页
单片机控制电梯模型教学教1.docx_第2页
第2页 / 共54页
单片机控制电梯模型教学教1.docx_第3页
第3页 / 共54页
单片机控制电梯模型教学教1.docx_第4页
第4页 / 共54页
单片机控制电梯模型教学教1.docx_第5页
第5页 / 共54页
点击查看更多>>
下载资源
资源描述

单片机控制电梯模型教学教1.docx

《单片机控制电梯模型教学教1.docx》由会员分享,可在线阅读,更多相关《单片机控制电梯模型教学教1.docx(54页珍藏版)》请在冰豆网上搜索。

单片机控制电梯模型教学教1.docx

单片机控制电梯模型教学教1

单片机控制电梯模型教学教案

蒋龙

 

2010年6月23日

 

工程训练中心

绪论

1.背景与目的

据统计,我国在用电梯34.6万多台,每年还以约5-6万台的速度增长。

电梯服务中国已有100多年的历史,而我国在用电梯数量的快速增长却发生在改革开放以后,目前我国电梯技术水平已与世界同步。

电梯模型将机械和电气两方面有机的结合起来,充分体现了机电结合的特点,并且可以在学生机电实验方面得到广泛的应用。

2.研究方法

参照凌阳SPCE061A开发的相关资料,加深对控制电梯模型的单片机的了解。

进行61板的相关实验,掌握单片机实现基本功能的技术。

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

 

第一章电梯模型硬件设备

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

1.1.1实验单片机模型

实验用单片机(图2.1)为凌阳SPCE061A微控制器(简称61板),是以凌阳16位单片机SPCE061A为核心的精简开发-仿真-实验板。

61板除了具备单片机最小系统电路外,还包括有电源电路、音频电路、复位电路等,采用电池供电,方便携带。

图1.1凌阳SPCE061A单片机

SPCE061A主要包括输入/输出端口、定时器/计数器、数/模转换、模/数转换、串行设备输入输出、通用异步串行接口、低电压监测和复位等部分,并且内置在线仿真电路ICE接口,较高的处理速度使其能够快速的处理复杂的数字信号。

本电梯模型就是采用此单片机进行程序编写与实现电梯的运行控制。

1.1.2单片机接口定义

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

 

图1.2单片机输入输出接口定义

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

表1.1是单片机A口Data控制命令表:

表1.1

A口

(信号输入)

*P_IOA_Data

接口编号

电梯动作

0x0001

A0

去一层(内部按键)

0x0002

A1

去二层(内部按键)

0x0004

A2

去三层(内部按键)

0x0008

A3

去四层(内部按键)

0x0010

A4

一层上(外部按键)

0x0020

A5

二层上(外部按键)

0x0040

A6

二层下(外部按键)

0x0080

A7

三层上(外部按键)

0x0100

A8

三层下(外部按键)

0x0200

A9

四层下(外部按键)

0x0400

A10

一层到达

0x0800

A11

二层到达

0x1000

A12

三层到达

0x2000

A13

四层到达

0x4000

A14

开门(内部按键)

0x8000

A15

关门(内部按键)

表1.2是单片机B口Data控制命令表:

表1.2:

B口

(信号输出)

*P_IOB_Data

接口编号

电梯动作

0x0001

B0

电梯上下运行(1上0下)

0x0002

B1

电梯运行选通(1行0停)

0x0004

B2

开关门运行(1开0关)

0x0008

B3

开关门选通(1行0禁)

0x0010

B4

一层上灯

0x0020

B5

二层上灯

0x0040

B6

二层下灯

0x0080

B7

三层上灯

0x0100

B8

三层下灯

0x0200

B9

四层下灯

0x0400

B10

开门到位

0x0800

B11

关门到位

0x1000

B12

数码管显示层数

0x2000

B13

0x4000

B14

0x8000

B15

 

单片机接口属性设置如下:

*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,其他层按键灯不受影响。

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=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.2程序

#include

#defineD10x0010

#defineD200x0040

#defineD210x0020

#defineD300x0100

#defineD310x0080

#defineD40x0200

voiddly(unsignedintundly)

{

intm;

for(m=0;m

{

intn;

for(n=0;n

{

n=n;

}

}

}

voidmain(void)

{

inti;

intshunxu[]={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<=5;i++)

{

*P_IOB_Data=shunxu[i];

dly(100);

*P_Watchdog_Clear=0x0001;

}

}

}

2.1.3功能简介及实现过程

本程序能实现是外部按键的灯从下到上依次亮起,在一个灯亮起的同时前一个已经亮起的灯灭掉,并且可以调节相邻两个灯亮起的时间间隔出的功能。

本程序采用宏定义功能,将各个灯的端口地址定义为一个简单的代码,最后在主程序中将代码全部放入一个数组中,这样可以方便地使用for循环语句,是程序看起来简单明了。

在这一段程序中还有一个时间延迟子程序,通过改变数值大小从而实现改变相邻灯亮起的时间间隔的功能。

 

2.2灯从下到上依次亮(后一个亮时前一个保持亮)

2.2.1流程图

开始

 

系统初始化

 

输出灯控制信号

 

相应的灯亮起

 

输出另一个灯控信号

 

相应灯亮起,之前灯灭掉

 

 

2.2.2程序

#include

#defineD10x0010

#defineD200x0050

#defineD210x0070

#defineD300x0170

#defineD310x01f0

#defineD40x03f0

voiddly(unsignedintundly)

{

intm;

for(m=0;m

{

intn;

for(n=0;n

{

n=n;

}

}

}

voidmain(void)

{

inti;

intshunxu[]={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=shunxu[i];

dly(100);

*P_Watchdog_Clear=0x0001;

}

}

}

2.2.3功能简介及实现过程

本程序能实现的功能是外部按键的灯从下到上依次亮起,在一个灯亮起的同时前一个已经亮起的灯仍然保持亮,知道全部的灯都亮起后再同时灭掉,而后开始下一个循环。

并且可以调节相邻两个灯亮起的时间间隔出的功能。

本程序同样采用采用宏定义功能,将同时亮着的各个灯的端口地址定义在一个一个简单的代码内,最后在主程序中将代码全部放入一个数组中,这样可以方便地使用for循环语句,是程序看起来简单明了。

在这一段程序中还有一个时间延迟子程序,通过改变数值大小从而实现改变相邻灯亮起的时间间隔的功能。

2.3灯成组亮

2.3.1流程图

开始

 

系统初始化

 

同时输出多个灯控制信号

 

相应的灯亮起

 

2.3.2程序

#include

#defineD10x0050

#defineD200x0120

#defineD210x0280

#defineD300x0070

#defineD310x0380

#defineD40x03f0

voiddly(unsignedintundly)

{

intm;

for(m=0;m

{

intn;

for(n=0;n

{

n=n;

}

}

}

voidmain(void)

{

inti;

intoutput=0;

intt=0;

intshunxu[]={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=shunxu[i];

dly(100);

*P_Watchdog_Clear=0x0001;

}

}

}

2.3.3功能简介及实现过程

本程序能实现的功能是一层上和二层下的灯同时亮,然后二层上和三层下的灯同时亮,然后三层上和四层下的灯同时亮,然后一层上、二层下和三层下的灯同时亮,然后二层上、二层下和三层下的灯同时亮,然后所有的灯全部亮起,而后所有灯灭掉开始新一轮循环。

在一组灯亮起的同时前一组已经亮起的灯灭掉,直到最后一组灯都亮起后再同时灭掉,而后开始下一个循环。

并且可以调节相邻两个灯亮起的时间间隔出的功能。

本程序同样采用采用宏定义功能,将同时亮着的一组灯的各个端口地址定义在一个一个简单的代码内,最后在主程序中将代码全部放入一个数组中,这样可以方便地使用for循环语句,是程序看起来简单明了。

在这一段程序中还有一个时间延迟子程序,通过改变数值大小从而实现改变相邻灯亮起的时间间隔的功能。

现在可以看出以上三个灯控制程序基本上是一样的,只是在宏定义语句中改变了每个代码所代表的端口地址值,其它的主程序语句完全一样。

这也反映出了使用宏定义语句的程序的优越性。

当然也可以采用其它语句来实现上述功能,比如采用while循环控制语句内嵌控制,每次只控制一个灯的亮或者灭,然后使用“或”逻辑语句实现前后亮灯的独立性或者实现灯的成组亮。

这样的程序看起来简单明了,便于理解,但是程序过于冗杂。

 

2.4数码显示

2.4.1流程图

开始

 

系统初始化

 

输出数字显示信号

 

显示相应的数字

 

2.4.2程序

#include

voidmain(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_Watchdog_Clear=0x0001;

}

}

2.4.3功能简介及实现过程

本程序实现的功能非常简单,就是让数码管显示一个数字2。

实现的过程也比较简单,只需将要显示的楼层数输入到相应的端口地址内就行了。

 

第三章按键与灯控制

3.1按电梯按键,相应灯亮并保持

3.1.1流程图

 

开始

系统初始化

 

按键信号扫描

 

是否有按键信号请求

N

 

Y

相应按键灯亮

 

3.1.2程序

#include

voidmain()

{

intinput,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)==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_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功能简介及实现过程

通过按电梯外部按键,相应按键会亮灯并保持住。

本程序通过对系统的初始化之后,识别电梯外部按键,即将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方法及建议

此程序的方法基础即按键控制灯亮,通过把按键信号传给A口,经单片机识别之后执行B口命令,则相应的灯亮起,编程时注意不要把相应的端口定义错,并且注意看门狗的使用,以免程序自动跳出,最重要的是对“或”语句的理解和使用。

3.2按电梯按键,相应灯亮但之前的灭掉

3.2.1流程图

开始

 

系统初始化

 

按键信号扫描

 

是否有按键信号请求

N

 

Y

相应按键亮灯,之前的灯灭

3.2.2程序

#include

voidmain()

{

intinput,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)==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=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,此时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方法及建议

此处涉及到的“或语句”和“与语句”在电梯的程序中经常用到,要认真体会其含义和用法才能运用自如,这就需要在编程中练习使用,以达到运用自如。

 

3.3按电梯按键,数码管显示相应层数

3.3.1流程图

开始

 

系统初始化

 

按键信号扫描

 

是否有按键信号请求

N

 

Y

显示相应的楼层数

 

3.3.2程序

#include

voidmain()

{

intinput,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)==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_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

voidmain()

{

inti,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