1、电梯控制程序源代码带流程图功能分解源代码 综合电子创新训练研究报告研究题目:CTS1600-1控制技术综合试验院系名称: 专业名称: 学生姓名:指导教师: xxxx年 xx月 xx日xxxxxxxxxx图目录第一章绪论1.1课题背景与目的现代社会中,电梯已经成为不可缺少的运输设备。电梯的存在使得每幢高层建筑的交通更为便利。电梯控制技术的发展主要经历了三个阶段:继电器控制阶段,微机控制阶段,现场总线控制阶段。随着经济的高速发展,微电子技术、计算机技术和自动控制技术也得到了迅速发展,交流变频调速技术已经进入一个崭新的时代,其应用越来越广。电梯是现代高层建筑的垂直交通工具,其设计要求稳定性、安全性及
2、高。随着人们生活水平的不断提高,对电梯的要求的也相应提高,电梯得到了快速发展。电梯模型将机械和电气两方面有机地结合起来,充分体现了机电结合的特点,同时微机控制即单片机控制的电梯在成本上较低,同时还有着较高的精度,非常适合在学生机电实验方面得到广泛的应用,可以提高大家的编程能力,加深对单片机的理解和应用,同时增强创新精神和团队合作精神。1.2课题研究方法参照凌阳SPCE061A开发的相关资料,加深对控制电梯模型的单片机的了解,进行61板的相关实验,掌握单片机实现基本功能的技术。对单片机编写程序,以达到控制电梯模型的目的。第二章电梯模型硬件设备 实验单片机模型与接口定义2.1.1 实验用单片机实验
3、用单片机为凌阳SPCE061A微控制器(简称61板),是以凌阳16位单片机SPCE061A为核心的精简开发-仿真-电路板。61板除了具备单片机最小系统电路外,还包括有电源电路、音频电路、复位电路等,采用电池供电,方便携带。SPCE061A 是继unSP系列产品SPCE500A等之后凌阳科技推出的又一款16位结构的微控制器。跟市面上常见的avr、51等单片机相比,这款单片机具有一个绝招:语言功能。与SPCE500A不同的是,在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,SPCE061A里只内嵌32K字的闪存(FLASH)。较高的处理速度使unSP能够非常容易地、快速地处理复杂
4、的数字信号。SPCE061A主要包括输入/输出端口、定时/计数器、数/模转换、模/数转换、串行设备输入/输出、通用异步串行接口、低电压检测和复位等部分,且内置在线仿真电路ICE接口,较高的处理速度使其能够快速地处理复杂的数字信号。本电梯模型就是采用此单片机进行程序编写和实现电梯的运行控制。Figure 1 凌阳单片机 单片机接口定义实验用单片机接口定义如图,其中A口为输入,B口为输出。+ 去一层 三层下 去二层 四层下去三层 一层到达去四层 二层到达一层上 三层到达二层上 四层到达二层下 开门 三层上 关门 + +电梯上下运行(1上0下) 三层下灯电梯运行选通(1行0停) 四层下灯开关门运行(
5、1开0关) 开门到位开关门选通(1行0禁) 关门到位一层上灯 二层上灯 二层下灯 三层上灯 Figure 2 凌阳单片机接口定义 I/O接口DATA控制命令表单片机A口DATA控制命令表A口(信号输入)*P_IOA_Data接口编号电梯动作0x0001A0去一层(内部按键)0x0002A1去二层(内部按键)0x0004A2去三层(内部按键)0x0008A3去四层(内部按键)0x0010A4一层上(外部按键)0x0020A5二层上(外部按键)0x0040A6二层下(外部按键)0x0080A7三层上(外部按键)0x0100A8三层下(外部按键)0x0200A9四层下(外部按键)0x0400A10一
6、层到达(外部按键)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
7、开门到位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; 电梯控制命令说明1.一层上按钮按下,*P_IOA_Data输入值为0x0010;2.使一层上按键灯亮起的命令为:*P_IOB_Data=0x0010,同时其它层按键灯熄灭;3.如果要使其它层按
8、键灯不受此按键灯影响,保持原来的状态,则输入的命令应为:*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.如果要使其它层按键灯不受此按键灯影响,保
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.如果要使其它层按键灯不受此按键灯影响,保持原
10、来的状态,则输入的命令应为:*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;2
11、2.使电梯关门的命令为:*P_IOB_Data=0x0008。我们为了能够简化我们的程序,我们在头文件中定义了直观易懂的单词来表示数字指令,这样使得编程过程更加容易直观,并且使得程序的可读性更强,但是这种方法是在之前不断地尝试的基础上才逐渐摸索出来的,因而在后来编写的程序中普遍用到了这种方法,而在开始训练阶段编写的程序还往往是使用数字型的指令,具体的定义如下:#ifndef _DEFINE_h_#define _DEFINE_h_#define IOA *P_IOA_Data#define IOB *P_IOB_Data#define uint unsigned int#define ucha
12、r 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 0x0
13、008#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 L
14、3up 0x0080#define L3down 0x0100#define L4down 0x0200#define at1 0x0400#define at2 0x0800#define at3 0x1000#define at4 0x2000#endif同时由于看门狗在程序中频繁出现,故定义看门狗函数dog方便使用:#include #include void dog() *P_Watchdog_Clear=0x0001; 实验用电梯模型Figure 3 实验用电梯模型第三章 与电梯模型相关的实验程序数码管连续显示 程序流程图Figure 4 数码管连续显示流程图 功能简介程序初始化完成
15、后,数码管从0连续变化到7,再从7连续变化到1。 功能实现过程通过定义一个指示当前数码管显示数值的变量,以该变量为循环条件,每次循环结束后变量自动加1,即指示下一个数码管显示数值,并且通过延时函数使得输出持续一段时间一边观察现象。(代码详见附录一) 问题的解决及收获该程序较为简单,但是通过该程序我们对软件的运行、调试有了初步的认识,对采集输入数据、设置输出命令的基本方法的认识更加清晰直观,同时对控制命令部分有了更加深刻的了解。 外部按键灯连续闪烁 程序流程图Figure 5 外部按键灯连续闪烁流程图 功能简介程序初始化完成后,外部按键灯连续闪烁,即从一层上灯到四层下等逐个亮,并不断循环。 功能
16、实现过程定义一个整形变量,通过该变量对6(外部按键一共有6个灯,可按顺序定义六个灯分别为0,1,2,3,4,5)取余的结构判断应该哪一个灯亮,同时通过延时函数使得输出得到持续。(代码详见附录二) 问题的解决及收获这个程序的思路非常好,但是在逻辑上需要通过取余这种方法实现,有些复杂,可以将代码直接描述为外部按键逐个灯亮这样也可以实现,我们用这种思路写了一个让外部按键的灯逐个亮且保持,直到所有的灯都亮了之后,再逐个灯灭的程序,代码见附录三,程序流程图如下:Figure 6 LED1to7流程图 键、灯、数码管 程序流程图Figure 7 键、灯、数码管流程图 功能简介程序运行后,按下电梯外部按键之
17、后该层外部按键的灯亮,同时数码管显示按下的层数,等待下一次输入。 功能实现过程程序初始化完成后,开始扫描是否有按键按下,若接收到外部某一按键按下信号后,那么该层按键的灯亮,并且数码管显示对应的层数。(代码见附录四)现以一层上按键被按下举例: if(t&0x0010)=0x0010) /如果一层上按键被按下*P_IOB_Data=0x1011; /输出为一层上按键灯亮且数码管显示1 *P_Watchdog_Clear=0x0001; 问题的解决及收获通过该程序,我们对多个部件的共同控制方法有了非常清晰的认识,在61中只需要将需要共同控制的部分的数字指令相加即可形成共同协调控制。 外部按键上下行
18、程序流程图Figure 8 外部按键上下行流程图 功能简介程序运行后,当按下电梯外部按键后,电梯从当前层运行至目标层后停止,等待下一次输入。 功能实现过程首先程序定义了一个指示当前所在层的变量at,以及一个指示目标层的变量to,程序初始化完成后,给变量at赋上对应的层数值,如若当前所在层为2层:if(t&0x0800)=0x0800) /判断当前所在层数,若当前所在层数为2层 at=2; /给变量at赋当前层数值2 *P_Watchdog_Clear=0x0001; 扫描外部按键是否按下,若按下,则对变量to赋上对应层数值,如若三层上或三层下按键被按下:if(t&0x0080)=0x0080)
19、|(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; *P_Watchdog_Clear=0x0001; 若目标层小于当前层,即toat,那么电梯应向下
20、运行,直到获取的当前值at=to之后,电梯停止运行:if(toat) *P_IOB_Data=down; *P_Watchdog_Clear=0x0001; 代码详见附录五 问题的解决及收获对数据采集系统以及程序的运行方式有了更加深刻的认识,系统的输入的数据有一部分是可以持续的,而有一部分只是一个短暂的脉冲,比如说像开门到位或者关门到位这样的输入就可以是持续的信号,但外部按键这样的输入只能是一个脉冲信号,像这种信号就需要通过在这种脉冲信号产生的瞬间给另外一个自己定义的变量赋上相关信息的值这样的方式来保存这种信息;在加有*P_Watchdog_Clear=0x0001的情况下,程序是以非常快的速
21、度在一遍一遍的走整个代码部分,在没有加看门狗的情况下,程序在运行一段时间之后会从头初始化后继续运行。 计算器 程序流程图Figure 9 计算器数字扫描函数流程图Figure 10 计算器主函数流程图 功能简介程序初始化完成后,一层上按键按下后,电梯门打开,内部层数按键1、2、3、4分别对应数字1、2、3、4,四层上、三层上、三层下分别对应加法、减法和乘法,首先按下内部两个按键分别对应数学符号前后两个数字,在电梯上部的LED显示屏上显示按下的数字,然后再按下加减乘符号,则在电梯上部的LED显示屏上显示计算结果,若答案在显示范围之内,即在0到7的范围正确显示,如果超出这个范围,则01闪烁。 功能
22、实现过程程序初始化完成后,通过扫描内部按键,获取两个数字作为即将进行数学计算的输入,而这两个数字的输入又靠一个标志位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) n
23、um2=3; i+; IOB=0x3000; dog(); 之后在进行运算法则的选择,分别有加、减、乘三种,在按下运算法则的选择按键后,数码管显示最终的答案,如果运算结果没有超出显示范围的话那么就正常显示答案,如若超出了正常的显示范围,那么这个时候出现01闪烁以提示超出了运算范围。代码详见附录六 问题的解决及收获计算器是我们比较有特色的一个程序,程序在实现上虽然比较简单,但是让我们对系统输入和输出的理解更加深刻,尤其是在帮助我们理解如何完成按键的实时扫描、并且记录相关数据这两点上起到非常重要的作用,比如说对外部案件的处理上,人手动按下外部按键的时间要比CPU扫过整个程序的时间来说长得多,这样如
24、果没有延时函数作用而且又使用数组记录输入数据的情况下,可能会导致数组的溢出,从而达不到每次记录一个数据输入的目的。 密码锁程序流程图Figure 11 密码锁流程图功能简介程序初始化完成后,若电梯门没有关上则电梯门关闭,等待外部按键输入,若密码输入正确则开门。实现功能过程在这一部分我们引入了两个数组对密码是否相同进行判断,一个是程序初始化完成后的正确密码,另外一个就是我们输入的密码,这个密码是通过当程序运行后,扫描外部按键的情况,对外部按键进行顺序记录,最终对外部按键输入的密码与真实密码进行逐位比对,若每一位均相同,那么执行开门动作,如果不相同,则不开门。代码详见附录七问题的解决及收获密码锁程
25、序的代码编写过程中我们使用了数组进行数据的采集和记录,所以这样我们又遇到了之前在编写计算器程序中遇到的问题,在按下按键之后数组溢出不能满足之前预定的要求,因而我们加入的延时函数以改进之前的程序,但是在这个过程中由于延时时间不是很好控制,所以也做了很多次尝试之后才最终确定了一个相对比较合适的时间常数,基本上可以满足正常速度的密码输入,从这一点上来说,通过编写密码锁程序让我们对61单片机的了解更加深入细致,以前总会遇到编译通过但是运行之后总会出现很多问题而且我们总是感觉无从下手的这种情况,但是完成密码锁程序之后,随着我们对单片机的了解更加深入,在程序运行之后,我们经过简单地调试一般就可以找到在那些
26、环节的判断或者逻辑是存在不合理之处,使得我们的效率提高了很多。逐层停自动开关门循环程序流程图Figure 12 逐层停自动开关门循环main函数Figure 13 逐层停自动开关门循环AtAndTo函数Figure 14 逐层停自动开关门循环OpenAndClose函数功能简介程序初始化完成后,电梯自动完成上下行以及开关门动作,不断循环。实现功能过程在这个程序中我们引入了一个指示上下行的变量shangxia,一层到位之后令该变量为1,指示电梯之后的运行状态为上行;当四层到位之后令该变量为0,指示电梯之后的运行状态为下行。这样电梯在二、三层进行上下行的判断时,只需判断现在指示电梯运行状态的sha
27、ngxia则可以保证电梯的正常运行。代码详见附录八问题的解决及收获逐层停自动开关门程序在前面诸多程序的铺垫下相对比较容易,不同点在于在这个程序中定义了一个指示电梯先前运动状态的变量,从而控制电梯现在时刻的上下行,这为之后的电梯完整程序打下了一定的基础。 可记录顺序逐层停自动开关门程序流程图Figure 15 可记录顺序逐层停自动开关门功能简介在程序初始化完成后,首先连续输入目标层数,点击确定按键之后,电梯按照之前按键设定的顺序自动运行,完成上下行和相应的开关门功能。实现功能过程代码详见附录九问题的解决及收获这个程序在实现的过程中我们借鉴了密码锁的相关经验,不同之处在与之前的密码锁是有确定个数的
28、输入的,而现在的可记录顺序的逐层停开关门的输入是不确定个数的,同时它还具备了清零和确定的选项,但是它是把之前的密码匹配部分改为了电梯的上下行和到达目标层之后自动开关门的功能,所以可记录顺序的逐层停自动开关门程序是继承了密码锁程序的一些特点的基础上,在功能上又有所拓展和创新。 外部按键电梯 主程序程序流程图Figure 16 外部按键电梯主函数流程图功能过程在程序初始化完成后,进入AtAndTo函数,判断当前层数和目标层,之后进入UpAndDown函数通过对at与to的大小比较,判断电梯的上下行,并将电梯送至目标层,进入OpenAndClose函数后进行开关门操作。(代码详见附录十) 开关门模块
29、程序流程图Figure 17 外部按键电梯开关门函数流程图功能过程当从主函数进入开关门模块后,电梯自动开门,开门到位后,如果按下内部关门按键,电梯关门。实现功能过程当从主函数进入开关门模块后,首先判断at和to的值,如果二者相等且DoorEnable允许开门即为1,此时执行开门动作,当开门到位且内部关门按键按下后,电梯关门。 上下行模块程序流程图Figure 18 外部按键电梯上下行函数流程图功能过程程序初始化完成后,若外部按键按下后,电梯运行到目标层。实现功能过程这个函数定义了一个指示当前所在层的变量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_Clea
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1