《电子工程师项目教学与训练》课件第1章_第1页
《电子工程师项目教学与训练》课件第1章_第2页
《电子工程师项目教学与训练》课件第1章_第3页
《电子工程师项目教学与训练》课件第1章_第4页
《电子工程师项目教学与训练》课件第1章_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第1章自动升降旗控制器设计

1.1引言1.2自动升降旗控制器设计任务书 1.3设计方案

1.4硬件电路设计

1.5软件设计1.6程序清单

1.1引言国旗是一个国家的标志,升降国旗的仪式要求规范庄严,在升国旗的过程中要演奏国歌,并且要求国旗的升起过程要与国歌的演奏过程同步,而在实际的升国旗过程中由于升旗手训练的程度及熟练的程度不同,使得有些升旗过程出现瑕疵,不完美,影响了升旗仪式的庄严。自动升降旗控制器是模拟实际的升降旗过程实现升降旗过程自动化控制的装置,可以解决升降旗过程中的相关问题。本项目主要训练单片机及其I/O接口的设计、步进电机驱动、软件编程能力、电子电路制作及调试等方面的知识与技能。1.2自动升降旗控制器设计任务书

1.设计任务设计一个自动升降旗控制系统,该系统能够自动控制升旗和降旗。升旗时,国旗在旗杆的最高端自动停止;降旗时,在最低端自动停止。自动升降旗控制系统的机械模型如图1-1所示。旗帜的升降由电机驱动,系统设置两个控制按键,一个是升旗键,另一个是降旗键,系统中的其他功能键由设计者定义。图1-1自动升降旗控制系统的机械模型

2.设计要求

(1)按下升旗键后,国旗匀速上升,同时流畅地演奏国歌;上升到最高端时自动停止上升,国歌停奏;按下降旗键后,国旗匀速下降,降旗的时间不演奏国歌,下降到最低端时自动停止。

(2)为避免误动作,国旗在最高端时,按升旗键不起作用;国旗在最低端时,按降旗键不起作用。

(3)升降旗的时间均为43s,与国歌的演奏时间相等,同时,旗从旗杆的最下端上升到顶端。降旗时不演奏国歌,同时,旗从旗杆的最上端下降到底端。

(4)数字即时显示旗帜所在的高度,以“cm”为单位,误差不大于2cm。

(5)使升降旗控制器具有升半旗和降半旗的功能。根据《国旗法》,升旗时,按升旗键,奏国歌,国旗从最底端上升到最高端之后,国歌停奏,然后自动下降到总高度的2/3处停止;降旗时,按降旗键,国旗先从2/3高度处上升到最高端,再自动从最高端下降到底端之后自动停止。

(6)不论旗帜是在顶端还是在底端,关断电源之后重新合上电源,旗帜所在的高度数据显示不变。

(7)要求升降旗的速度可调整,在旗杆高度不变的情况下,升降旗时间的调整范围为30~120s,步进为1s。说明:旗帜用大于100g的重物代替。1.3设计方案自动升降旗控制器要求实现升降旗过程的全自动控制,那么首当其冲要考虑的就是采用什么样的控制芯片实现相关的控制,在控制器的选择中主要应考虑控制器连接的外设情况及处理器的速度是否能够满足相应的设计要求。在本设计中处理器主要连接的外部设备有键盘、数码显示器、电机驱动电路等。处理器的主要任务是对键盘的扫描、显示器的管理及对电机的控制,这里最重要的任务是对电机速度的控制。图1-2所示为自动升降旗控制器的结构框图。图1-2自动升降旗控制器的结构框图由分析设计要求可知,在该系统中电机的控制无疑是最重要的,即通过电机的控制来实现升降旗过程中旗帜运行速度和位置的控制。选择普通的8位单片机完全可以满足设计的要求,这里综合考虑各方面的因素最终选择MCS-51系列的单片机作为主控制器来组成基本的控制系统。MCS-51单片机具有灵活的I/O口接口方式,通过I/O接口可以很方便地实现键盘与显示器的连接与管理,也可以较方便地实现直流电机、步进电机的控制,因此系统的整体硬件设计方案确定为以单片机为主控制器,通过接口电路连接键盘、显示器及电机驱动电路等,从而实现自动控制。1.4硬件电路设计1.4.1I/O接口的整体设计思路

MCS-51系列单片机的I/O接口线共有32根,在其端口上连接外部设备可以通过直接I/O的方式进行连接,也可以通过总线接口进行连接,一般的原则是应考虑到外部设备端口的多少以及要求控制的灵活性。在外部设备端口较少、占用I/O口线不多的情况下应尽量采用直接I/O的方式连接设备,这样可以使接口电路结构简单,硬件成本较低,控制灵活;相反,如果需要扩展的设备端口数目较多,采用直接I/O口线的数目不能满足需求,则应采用总线扩展实现I/O设备的连接。根据设计的要求是在升降旗的过程中实时显示旗帜的实际高度,旗杆的高度为180cm,要求显示的高度以“cm”为单位,因此该控制器中应至少设置3位LED显示器用于高度的显示。其次,该控制器中设置了用于操作的键盘,键盘接口可以通过独立式键盘或矩阵式键盘来实现,通常在按键不是很多的情况下采用独立式键盘接口,反之,则应该采用矩阵式键盘接口。最后电机驱动电路的连接也需要使用I/O口线,因此在该电路设计中控制器的I/O口线并不十分充足,加之在设计时要留有一定的设计余量,这里对于键盘接口和显示器接口均采用了总线扩展的形式来实现。1.4.2主控制器部分电路设计根据上面的分析,设计中最终选用了AT89C51芯片作为主处理器,为了实现总线扩展,在单片机的外部通过锁存器74LS373锁存P0送出的低8位地址,形成低8位地址总线,P2口作为专用的高8位地址线,图1-3是主控制器的部分电路。由图可以看出,通过P0、P2口形成了地址总线A[7..0]、A[15..8]和数据总线AD[7..0]。1.4.3显示器接口设计该系统采用LED数码管作为显示器件,显示接口电路如图1-4所示。图1-3主控制器部分电路图1-4显示接口电路在该设计中显示器主要用于旗帜实际高度的显示,旗帜高度的范围为0~180cm,需要3位LED数码管。除此之外在进行升旗时间调整时还可以用显示器显示设置的时间值,按照设计的要求,该时间的范围为30~120s。因此,如果仅从满足设计要求的角度出发采用3位的LED显示器,设置相应的显示接口就可以了。但是这里考虑到控制器运行于不同的状态时能够进行明确的区分以及在调试过程中用于测试等因素,硬件中设置了6位的LED显示器。该显示接口电路采用6片74LS273作为静态显示的锁存器,当要送给显示器显示数据时,通过相应的I/O选通信号和总线写信号实现锁存器的写入同步控制。这里LED数码管每位占用一个I/O地址端口,共需要6个I/O端口,除此之外,键盘接口也要占用两个I/O端口,因此在该系统中共需要8个I/O端口来连接显示器和键盘,以及通过一片74LS138实现译码,产生8个I/O端口选通信号。图1-5为I/O端口地址译码电路。由该电路可以看出这里采用的译码方式为部分译码,由该译码电路可以进一步推出各个I/O端口的地址映像,具体推导情况及地址对应关系如表1-1所示。表中X表示其取值为无关项,由此可知显示器端口对应的I/O地址为8000H~8005H,K_OUT与K_IN为键盘接口的名称,其对应的映像地址分别为8006H和8007H。图1-5I/O端口地址译码电路表1-1I/O端口地址映像表1.4.4键盘接口电路设计这里通过总线实现了2×8的矩阵式键盘扩展,这种扩展方式可以满足大规模的键盘扩展要求。在该系统中扩展了16个按键,实际上是留有很大余量的,便于系统的调试与功能扩展。图1-6为键盘接口电路图。图1-6键盘接口电路1.4.5电机驱动电路及其接口设计根据设计要求,电机需要提升的旗帜重量等价于100g的重物,因此这里对电机的转矩要求并不高,很小的电机就可以满足设计要求。可以选择微型直流电机,也可以选择步进电机,这里考虑到控制的难易程度,选择微型步进电机作为驱动电机使用。这里需要解释为什么没有选择普通的直流电机。如果用普通的直流电机来实现驱动,必须认真考虑的问题就是如何使电机的速度保持要求的值,而且速度要随升旗时间的设置不同而变化。这个问题的本质是微型直流电机的调速问题,要解决这样的问题,电路设计中必须引入闭环控制,需要设置电机运行速度及位置的检测电路,并且在软件设计上采用适当的控制算法,因此电路的复杂程度及控制难度都会增加。选用步进电机可以较好地避开上述问题。由于步进电机可以通过运行的步数精确控制电机转过的位移,通过控制步进电机运行一步的时间就可以控制电机运行的速度,改变步进电机的步进时间就可以改变电机的运行速度。采用步进电机实现控制实际上是进行开环控制,因此简化了软硬件的设计。设计中选用的步进电机型号为35BY48H10。步进电机的驱动采用了驱动模块SMD-401。驱动模块与处理器之间的接口简单,采用单片机的P1.0、P1.1、P1.2分别作为驱动模块的输入信号CP、DIR、HOLD。单片机与步进电机驱动器之间的接口电路如图1-7所示。图1-7单片机与步进电机驱动器之间的接口电路1.5软件设计1.5.1概述软件设计是该系统设计的重要组成部分,合理的软件设计可以更好地发挥硬件的功能,甚至可以通过软件设计补偿硬件设计的不足,因此在涉及到单片机应用的系统中,应该认真考虑软件的设计,充分发挥系统的性能。好的软件设计应该具有好的人机交互界面,即用户可以方便地对设备进行操作,输入操作命令,而设备也通过友好、清晰的方式把相关的信息输出给用户。从使用的功能上看,好的软件应该在系统硬件的基础上很好地实现设备设计的各项功能,达到相关的性能指标。从软件的内部结构来看,好的软件设计应该具有清晰的层次、合理的结构,采用结构化、模块化的程序设计理念不仅可以提高编程的效率,而且也便于程序的维护修改及交流。1.5.2总程序结构分析对升降旗控制器的功能进行分析,可以总结出该控制器主要应实现如下三方面的功能:第一,通过人机交互界面设定系统的状态及时间。系统上电缺省的情况为升国旗,因此升降过程的时间设定为43s,但是如果升降的不是国旗,则可以通过键盘设定新的升降旗时间;系统缺省的状态为正常升旗或降旗,但也可以通过键盘设定为升半旗或降半旗状态。第二,实现按照设定的时间升旗帜的功能。自动升降旗控制器就是要实现升旗过程的自动化控制,因此该功能是该控制器要实现的最重要的功能,要实现该功能,就要控制好电机的速度及电机提升的高度。第三,实现按照设定的时间降旗的功能。降旗与升旗的过程同样也是该控制器要重点控制的过程。不管是在升旗操作中还是在降旗操作中都要区分是进行正常的升降旗操作还是进行半旗状态下的升降旗操作,并分别予以控制。根据系统要实现的功能给出系统软件的程序结构框图,如图1-8所示。从框图可以看出,该系统的主程序结构是以键盘扫描及键盘功能处理为主线进行设计的,整体上是一个循环程序结构。即通过键盘扫描程序用户可以输入操作命令,通过键功能处理程序对输入的命令进行判断,进行任务分发,具体的任务由各个程序块来实现,而各个程序功能块的实现又可以进行任务分解,由底层的子程序来实现。通过这样的层次划分就可以使程序具有较好的结构化效果,编制程序思路就会更清晰,效率就会更高,因此我们在开始写程序之前必须足够重视程序的结构设计。图1-8系统程序结构框图1.5.3键盘扫描程序设计键盘扫描程序是需要反复使用的重要程序,该设计中键盘是通过总线扩展而来的矩阵式键盘,其扫描方法与普通的矩阵式键盘扫描的一般原理基本相同。不过,为了提高程序的健壮性,对于键盘扫描所得的键值采用了更完全的编码方式,即当键盘阵列中有键按下时,扫描后给出对应的键值编码,当键盘扫描后无键按下时则带回一个特定的编码值0FFH,这样对键功能的处理就更加完善与灵活。键盘扫描子程序具体见程序清单。1.5.4显示程序设计显示程序也是系统中重复使用的功能程序,因此该部分程序也设置为子程序的形式,供需要使用的地方调用。该设计中需要显示的信息有:升降旗过程中的高度、升降旗时间及必要的状态信息。该系统通过总线扩展的方式扩展了6位LED数码管,采用的显示方案为:用3位LED显示高度和时间,用1位LED显示控制器的状态,剩余的2位LED用于格式装饰。当系统上电后进入默认的状态,在该状态下可以进行正常的升降旗控制,此时用于状态显示的数码管显示为“1”,其显示格式示意图见图1-9。在升降旗的过程中低3位用于显示旗帜的高度。图1-9正常升降旗信息显示当设定为半旗状态时最高位显示为“2”,在该状态下可以进行升半旗及降半旗的操作,其显示格式如图1-10所示。当设定为时间调整方式时最高位显示为“3”,在该状态下可以进行升降旗操作时间的调整,此时的显示格式如图1-11所示。显示子程序的功能只负责把显示单元的内容转换为显示代码并送相应的I/O映像地址进行显示,而具体显示的内容与显示子程序本身无关,显示子程序具体见程序清单。图1-10半旗状态下的信息显示图1-11时间设定状态下的信息显示1.5.5电机控制程序设计旗杆的总高度为180cm,通过测试程序可以测出在步进电机的驱动下旗帜从旗杆的底部上升到旗杆的顶部,步进电动机走过的总步数为14400,由此可以折算出旗帜的高度每升高或降低1cm,步进电机应该正转或反转80步。因此在升降旗的过程中,步进电机每转过80步,旗帜的高度增加或降低1cm。在升旗时升起的高度从0cm达到180cm,升旗过程结束;当降旗时旗帜的高度从180cm降到0cm,降旗过程结束。对于半旗状态下升旗及降旗的控制过程可以分步来进行。升半旗时,在电机的驱动下旗帜的高度先从0cm上升到180cm,随后电机反转高度从180cm降到120cm,升半旗过程结束;降半旗时,先使旗帜从高度为120cm处上升到180cm处,再从180cm处降旗到0cm,降旗过程结束。步进电机驱动的速度是通过控制步进电机运行一步所需的时间来进行控制的,这里步进电机的驱动器采用了集成的控制模块,其控制较简单,要使其走过一步只需向控制模块的CP端发送一个脉冲即可,而脉冲的周期就决定了步进电机运行这一步所需要的时间,因此脉冲的周期决定了步进电机的速度,步进电机运行的步数决定了电机转过的距离。通过上面的分析可知,只要改变步进电机驱动脉冲的周期就可以控制步进电机运行的速度。当进行升降旗操作时,根据设定的升降旗时间可以计算出对应的升降旗过程中步进电机每个驱动脉冲的周期及一个周期中高低电平的时间宽度,不过这里的计算工作并不是由单片机来完成,而是通过查表的方法得到的,升降旗的时间设定范围为30~120s,因此可以通过计算得到对应设定时间的驱动脉冲定时值,并把每一个时间值对应的脉冲定时值存入一个表中,单片机在升降旗时根据设定的时间值查表得到相应的驱动脉冲的定时值,从而控制驱动脉冲的宽度,最终实现速度的控制。步进电机的驱动脉冲CP为正方波,即脉冲的一个周期内高低电平持续的时间相同,为产生这样的脉冲信号使用单片机的定时/计数器1,并使该定时/计数器工作在方式1——中断模式。在每次升旗或降旗时,通过初始化程序设定定时/计数器1的工作模式,设定步进电机需要运行的总步数,通过查表程序得到对应设定时间值的定时器初值,并启动定时/计数器1,在定时/计数器1的中断服务程序中完成CP脉冲定时值的重新装入,计算当前的升旗或降旗高度,计算步进电机走过的总步数以确定是否完成了升降旗的操作,当设定的步数值减到了0时,定时/计数器1停止运行并设置相关的状态标志。有关升降旗控制的详细程序见程序清单。1.5.6其他功能当系统上电后系统默认的状态为正常升降旗状态,在此状态下可以进行正常的升降旗操作。但是系统上电后旗帜的初始位置可能并不符合要求,当旗帜的位置并不在要求的初始位置时,应该进行调整。为了实现这一功能,系统设置了两个功能键,一个为上升键,一个为下降键,当上升键或下降键第一次按下时旗帜上升或下降,再次按下上升键或下降键则旗帜停止运动,可以通过这两个按键反复调整旗帜的初始位置直到符合要求为止。上电后用户可能进行的操作有正常的升降旗操作及半旗状态下的升降旗操作,因此上电后必须告诉控制器旗帜的当前位置在什么地方,这样后面的相关操作才可能正常进行。告诉控制器旗帜的位置也就等于确定了旗帜当前的高度,因此在该设计中增加了两个键来确定旗帜的缺省位置:一个为初始位置状态切换键,一个为确认键。具体操作方法为:当第一次按下初始位置切换键时数码管显示“4--000”,表示旗帜的当前位置在旗杆的底部,高度为0cm,此时如果按下确认键,则控制器设置当前高度为0cm,设置相关的内部标志,并退回到正常升降旗状态;如果旗帜的当前位置处在旗杆的顶部,则在第一次按下初始位置切换键后,再次按下该键,此时数码管显示“4--180”,表示旗帜的位置在旗杆的顶部,旗帜高度为180cm,按下确认键后控制系统把旗帜的当前高度设置为180cm,设置相关的内部标志,并返回到正常的升降旗状态;如果当前旗帜的位置为半旗状态的升起状态,即旗帜的高度为120cm,可以连按3次初始位置设置键,则显示为“4--120”,表示当前旗帜高度为120cm,再按确认键,控制器内部设置旗帜的当前高度为120cm,设置相关的状态标志并返回到半旗状态。1.6程序清单

;;;;;;;;;;定义变量;;;;;;;;;;;;;;;;;;;;

DIR BIT P1.1 ;电极方向控制

CP BIT P1.0 ;电机驱动脉冲输出

HOLD BIT P1.2 ;电机锁定控制信号

STOP BIT 00H ;电机停转标志

DOWN_FLAG BIT 01H ;旗帜位置在旗杆的底部时的标志

UP_FLAG

BIT 02H ;旗帜位置在旗杆的顶部时的标志

T_FLAG

BIT 03H

MID_FLAG BIT 04H ;半旗状态标志

LED1 EQU 31H ;数码管最低位显示缓冲

LED2 EQU 32H

LED3 EQU 33H

LED4 EQU 34H

LED5 EQU 35H

LED6 EQU 36H ;数码管最高位显示缓冲

NUM_H EQU 37H ;电机运行步数计数

NUM_L EQU 38H

HIGE EQU 39H ;旗帜的当前高度

COUNT EQU 3AH

HANG EQU 3BH

LIE EQU 3CH

KEY EQU 3DH ;键盘扫描带回的键值

TIME EQU 3EH ;升降旗时间设定值

T_L EQU 3FH ;步进电机运行控制脉冲的定时值

T_H EQU 40H

;-------------------------------------------

;;;;;;;;;;程序开始;;;;;;;;;;;;;;;;;;;;;;;;;; ORG 0000H SJMP MAIN ORG 000BH LJMP INT_T0

ORG 001BH LJMP INT_T1 ORG 0050H

MAIN: NOP MOV IE,#00H MOV IP,#00H MOV SP,#60H CLR DIR ;电机正转

CLR CP CLR HOLD ;电机锁定

CLR STOP ; MOV LED1,#00H ;显示计数单元清零

MOV LED2,#00H MOV LED3,#00H MOV LED4,#10H MOV LED5,#10H MOV LED6,#01H LCALL DISPLAY ;显示

;

MOV COUNT,#81 MOV TIME,#42 MOV HIGE,#00H CLR UP_FLAG SETB DOWN_FLAG CLR MID_FLAG ;

K_LOOP: LCALL KEY_SCAN MOV A,KEY CJNE A,#0FFH,KEY_0 LJMP K_LOOP

KEY_0: CJNE A,#00H,KEY_1 LJMP SHENGQI

KEY_1: CJNE A,#01H,KEY_2 LJMP JIANGQI

KEY_2: CJNE A,#02H,KEY_3 LJMP BANQI

KEY_3: CJNE A,#03H,KEY_4 LJMP TIME_SET

KEY_4: CJNE A,#06H,KEY_5 LJMP RUN_UP

KEY_5: CJNE A,#07H,KEY_6 LJMP RUN_DOWN

KEY_6: CJNE A,#08H,KEY_7 LJMP INIT_SET

KEY_7: LJMP FUWEI

FUWEI: LJMP K_LOOP

;;;;;;;;;;旗帜初始位置设置;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

INIT_SET: NOP ;PUSH LED6 MOV LED6,#04H MOV LED3,#00H MOV LED2,#00H MOV LED1,#00H LCALL DISPLAY ;

IK1: LCALL KEY_SCAN MOV A,KEY CJNE A,#08H,NEXT_1 ;用08H号键实现初始状态切换

MOV LED3,#01H MOV LED2,#08H MOV LED1,#00H LCALL DISPLAY LJMP NEXT_2 ;

NEXT_1: CJNE A,#09H,IK1 ;设置旗帜的高度为0cm MOV HIGE,#00H CLR UP_FLAG SETB DOWN_FLAG

;POP LED6

MOV LED6,#01H

LCALL DISPLAY

LJMP K_LOOP ;

NEXT_2:

LCALL KEY_SCAN

MOV A,KEY

CJNE A,#08H,NEXT_3

MOV LED3,#01H

MOV LED2,#02H

MOV LED1,#00H

LCALL DISPLAY

LJMP NEXT_4

;

NEXT_3:

CJNE A,#09H,NEXT_2

MOV HIGE,#180

SETB UP_FLAG

CLR DOWN_FLAG

MOV LED6,#01H

;POP LED6

LCALL DISPLAY

LJMP K_LOOP

;

NEXT_4:

LCALL KEY_SCAN

MOV A,KEY

CJNE A,#08H,NEXT_5

LJMP INIT_SET

NEXT_5:

CJNE A,#09H,NEXT_4

MOV HIGE,#120

SETB UP_FLAG

CLR DOWN_FLAG

SETB MID_FLAG

;POP LED6

MOV LED6,#02H

LCALL DISPLAY

LJMP K_LOOP

;---------------------------------------------------------

;;;;;;;;;;旗帜位置调整程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;

RUN_UP:

NOP

MOV TMOD,#10H ; T1设定为工作方式1,定时功能

CLR DIR ;电机正转,旗帜上升

LJMP COM_PRO

;

RUN_DOWN:

NOP

MOV TMOD,#10H

SETB DIR

LJMP COM_PRO

COM_PRO:

MOV DPTR,#T_TAB

MOV A,#42

CLR C

SUBB A,#30

RL A

MOV R3,A

MOVC A,@A+DPTR

MOV TH1,A ;修改定时时间,用于速度控制

MOV T_H,A MOV A,R3 INC A MOVC A,@A+DPTR MOV TL1,A MOV T_L,A CLR TF1 SETB TR1 CLR CP CLR STOP SETB HOLD ;电机松开

W_KEY: LCALL KEY_SCAN MOV A,KEY CJNE A,#06H,W_UP CLR TR1 SETB STOP CLR DIR CLR HOLD ;电机锁死

LJMP K_LOOP

W_UP: JNB TF1,W_KEY CLR TF1 CPL CP MOV TL1,T_L MOV TH1,T_H SJMP W_KEY

;--------------------------------------------

;;;;;;;;;;;;;升旗操作;;;;;;;;;;;;;;;;;;;;;;;;

SHENGQI:NOP

JB UP_FLAG,NO_OPR

JB MID_FLAG,SQ_MID

LCALL SQ_OPR

LJMP K_LOOP

SQ_MID: LCALL SQ_OPR_M

NO_OPR:LJMP K_LOOP

;;;

SQ_OPR:NOP

CLR DIR

CLR STOP

SETB HOLD

MOV NUM_H,#38H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#40H

LCALL INIT_T1

AGA1: JNB STOP,AGA1

CLR CP

CLR HOLD

CLR TR1

CLR DOWN_FLAG

SETB UP_FLAG

RET

;;;

SQ_OPR_M: NOP

CLR DIR

CLR STOP

SETB HOLD

MOV NUM_H,#38H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#40H

LCALL INIT_T1

AGA1_B: JNB STOP,AGA1_B

CLR CP

CLR HOLD

CLR TR1

LCALL DELAY

SETB DIR

SETB HOLD

CLR STOP

SETB TR1

MOV NUM_H,#12H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#0C0H

AGA2_B: JNB STOP,AGA2_B

CLR CP

CLR HOLD

CLR TR1

CLR DOWN_FLAG

SETB UP_FLAG

RET

;-------------------------------------------

;;;;;;;;;;;;;降旗操作;;;;;;;;;;;;;;;;;;;;;;;

JIANGQI: NOP

JB DOWN_FLAG,NO_OPR1

JB MID_FLAG,J_MID

LCALL J_OPR

LJMP K_LOOP

J_MID:

LCALL J_OPR_M

NO_OPR1: LJMP K_LOOP

;;;

J_OPR: NOP

SETB DIR

CLR STOP

SETB HOLD

MOV NUM_H,#38H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#40H

LCALL INIT_T1

AGA2: JNB STOP,AGA2

CLR CP

CLR HOLD

CLR TR1

SETB DOWN_FLAG

CLR UP_FLAG

RET

;;;

J_OPR_M: NOP

CLR DIR

CLR STOP

SETB HOLD

MOV NUM_H,#12H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#0C0H

LCALL INIT_T1

AG1_B:

JNB STOP,AG1_B

CLR CP

CLR HOLD

CLR TR1

LCALL DELAY

SETB DIR

CLR STOP

SETB HOLD

MOV NUM_H,#38H ;升旗高度控制,等效高度1.8m

MOV NUM_L,#40H

LCALL INIT_T1

AG2_B: JNB STOP,AG2_B

CLR CP

CLR HOLD

CLR TR1

SETB DOWN_FLAG

CLR UP_FLAG

RET

;-------------------------------------------

;;;;;;;;;;;;;半旗状态设置;;;;;;;;;;;;;;;;;;;

BANQI: NOP

CPL MID_FLAG

JNB MID_FLAG,NNO_P

MOV LED6,#02H ;表示半旗状态

LCALL DISPLAY

LJMP K_LOOP

NNO_P: MOV LED6,#01H ;表示缺省状态

LCALL DISPLAY

LJMP K_LOOP

;-------------------------------------------

;;;;;;;;;;;;;升旗时间设定;;;;;;;;;;;;;;;;;;;

TIME_SET:NOP

SETB T_FLAG

PUSH LED6

LCALL TIME_DIS

T_KEY: LCALL KEY_SCAN

;

MOV A,KEY

CJNE A,#03H,T_UP

LJMP SET_END

T_UP: CJNE A,#04H,T_DOWN

LCALL TIME_UP

SJMP T_KEY

T_DOWN: CJNE A,#05H,T_KEY

LCALL TIME_DOWN

SJMP T_KEY

SET_END:POP LED6

CLR T_FLAG

LCALL DEFAULT

LJMP K_LOOP

;

TIME_DIS: MOV LED6,#03H ;03H表示调整时间

MOV LED5,#10H

MOV LED4,#10H

MOV A,TIME

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

LCALL DISPLAY

RET

DEFAULT: NOP

MOV LED5,#10H

MOV LED4,#10H

MOV A,HIGE

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

LCALL DISPLAY

RET

;-------------------------------------------

;;;;;;;;;;;;;升旗时间增加;;;;;;;;;;;;;;;;;;;

TIME_UP:NOP

JB T_FLAG,UP_OPR

RET

UP_OPR:INC TIME

MOV A,TIME

CJNE A,#120,DY120

DY120: JC T_T

MOV TIME,#120

T_T: MOV A,TIME

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

LCALL DISPLAY

RET

;-------------------------------------------

;;;;;;;;;;;;;升旗时间减小;;;;;;;;;;;;;;;;;;;

TIME_DOWN: NOP

JB T_FLAG,DOWN_OPR

RET

DOWN_OPR: MOV A,TIME

DEC A

MOV TIME,A

CJNE A,#1EH,XY30

XY30: JC SET30

JMP TX_TIME

SET30:

MOV TIME,#30

TX_TIME: MOV A,TIME

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

LCALL DISPLAY

RET

;-------------------------------------------

L_LOOP: NOP

AGAIN: ;LCALL ONE_STEP ;LCALL JIAN1 JNB STOP,AGAIN ;;;; CLR CP CLR HOLD LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY SETB DIR

CLR STOP

MOV NUM_H,#38H MOV NUM_L,#40H SETB HOLD

AGAIN_F: ;LCALL ONE_STEP ;LCALL JIAN1 JNB STOP,AGAIN_F ; CLR CP CLR HOLD LCALL DELAY LCALL DELAY LCALL DELAY LCALL DELAY

LCALL DELAY LCALL DELAY CLR DIR CLR STOP MOV NUM_H,#38H MOV NUM_L,#40H SETB HOLD LJMP L_LOOP

;;;;;;;;;;步进电机运行步数控制减一控制;;;;;;;

JIAN1: NOP CLR C MOV A,NUM_L SUBB A,#01H MOV NUM_L,A JC HSUBB LJMP PAN_L

HSUBB: MOV NUM_L,#0FFH CLR C MOV A,NUM_H SUBB A,#01H MOV NUM_H,A

PAN_L: NOP MOV A,NUM_L

CJNE A,#00H,J_END MOV A,NUM_H CJNE A,#00H,J_END SETB STOP

J_END: RET

;-------------------------------------------

;;;;;;;;;;升旗高度cm数加一程序;;;;;;;;;;;;;;

JIA_1: INC HIGE

MOV A,HIGE

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

RET

;-------------------------------------------

;;;;;;;;;;降旗高度cm数减一程序;;;;;;;;;;;;;;

JIAN_1: MOV A,HIGE

CLR C

SUBB A,#01H

MOV HIGE,A

JC H_0

JMP H_1

H_0: MOV HIGE,#00H

H_1: MOV A,HIGE

MOV B,#100

DIV AB

MOV LED3,A

MOV A,B

MOV B,#10

DIV AB

MOV LED2,A

MOV LED1,B

RET

;--------------------------------------------

;;;;;;;;;;键盘扫描子程序;;;;;;;;;;;;;;;;;;;;;;;

KEY_SCAN:NOP

ST: ACALL KEY_ON JNZ DELAY1 AJMP ST_END

DELAY1: ACALL KDL10MS ;去抖动延迟

ACALL KEY_ON JNZ KEY_NUM AJMP ST_END

KEY_NUM:ACALL KEY_LIE

KEY_OFF: ACALL KEY_ON ;等待键释放

JNZ KEY_OFF AJMP ST_OUT

ST_END: MOV KEY,#0FFH ;无键按下时以0FFH作为带回的键值

ST_OUT: RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

KEY_ON: MOV A,#00H MOV DPTR,#8006H;键盘输出端口地址为8006H MOVX @DPTR,A NOP NOP NOP NOP NOP NOP INC DPTR ;键盘输入端口地址为8007H MOVX A,@DPTR CPL A ;判断是否有键按下

RET

KDL10MS:MOV R7,#20H

KL1: MOV R6,#0FFH DJNZ R6,$ DJNZ R7,KL1 RET ;10ms延时,去抖动

KEY_LIE: MOV LIE,#02H ;开始列扫描

MOV DPTR,#8006H;键盘输出端口地址为8006H MOV A,LIE MOVX @DPTR,A NOP NOP NOP NOP NOP NOP

INC DPTR ;键盘输入端口地址为8007H MOVX A,@DPTR MOV HANG,A CPL A JZ NEXT ;若第一列无键按下,则扫描下一列

AJMP KEY_HANG

NEXT: MOV LIE,#01H ;开始第二列扫描

MOV DPTR,#8006H MOV A,LIE MOVX @DPTR,A NOP NOP NOP NOP

NOP

NOP

INC DPTR

MOVX A,@DPTR

MOV HANG,A

CPL A

JZ ERROR ;若无键输入,则输出错误,程序返回

KEY_HANG: DJNZ LIE,NEXT2

MOV LIE,#08H

AJMP NEXT3

NEXT2:

MOV LIE,#00H

NEXT3:

MOV A,HANG

JB ACC.0,LONE

MOV A,#00H

ADD A,LIE

MOV KEY,A

RET

LONE: MOV A,HANG JB ACC.1,LTWO MOV A,#01H ADD A,LIE MOV KEY,A RET

LTWO: MOV A,HANG JB ACC.2,LTHREE MOV A,#02H ADD A,LIE MOV KEY,A RET

LTHREE: MOV A,HANG JB ACC.3,LFOUR MOV A,#03H ADD A,LIE MOV KEY,A RET

LFOUR: MOV A,HANG JB ACC.4,LFIVE MOV A,#04H ADD A,LIE MOV KEY,A RET

LFIVE: MOV A,HANG JB ACC.5,LSIX MOV A,#05H ADD A,LIE MOV KEY,A RET

LSIX: MOV A,HANG JB ACC.6,LSEVEN MOV A,#06H ADD A,LIE MOV KEY,A RET

LSEVEN: MOV A,#07H ADD A,LIE MOV KEY,A RET

ERROR: MOV A,#0FFH ;键盘扫描错误,带回键值0FFH MOV KEY,A RET

;----------------------------------------------

;;;;;;;;;;T0初始化为计数功能,工作方式2;;;;;;;;

INIT_T0: NOP NOP MOV TMOD,#06H MOV TH0,#0FFH MOV TL0,#0FFH SETB ET0 SETB EA SETB TR0 RET

;---------------------------------------------

;;;;;;;;;;T0中断服务程序;;;;;;;;;;;;;;;;;;;;;;

INT_T0: RETI PUSH ACC PUSH PSW LCALL JIA_1 LCALL DISPLAY POP PSW POP ACC RETI

;--------------------------------------------

;;;;;;;;;;T1中断的初始化程序;;;;;;;;;;;;;;;;;

INIT_T1: NOP MOV A,TMOD ORL A,#10H ;T1设定为工作方式1,定时功能

MOV TMOD,A ; MOV DPTR,#T_TAB MOV A,TIME CLR C SUBB A,#30 RL A MOV R3,A MOVC A,@A+DPTR MOV TH1,A ;修改定时时间,用于速度控制

MOV T_H,A MOV A,R3 INC A MOVC A,@A+DPTR MOV TL1,A

MOV T_L,A

; CLR TF1 SETB ET1 SETB EA SETB TR1 RET

;-----------------------------

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论