《基于任务驱动的单片机应用教程》课件第5章_第1页
《基于任务驱动的单片机应用教程》课件第5章_第2页
《基于任务驱动的单片机应用教程》课件第5章_第3页
《基于任务驱动的单片机应用教程》课件第5章_第4页
《基于任务驱动的单片机应用教程》课件第5章_第5页
已阅读5页,还剩38页未读, 继续免费阅读

下载本文档

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

文档简介

任务5运料小车控制5.1任务内容与分析

5.2任务实施5.3任务相关知识

5.1任务内容与分析

1.任务内容

在生产现场中会经常使用电机拖动小车运送物料,本任务以运料小车控制为例,介绍子程序的应用。

2.任务分析图5-1运料小车控制电路示意图

图5-1为运料小车控制电路示意图,按钮S0启动小车开始运行,小车在限位开关S1处装料,25s后装料结束开始右行,碰到限位开关S2后小车停下来卸料,2s后左行,碰到限位开关S1后又停下来装料。这样不停地循环工作,直到小车运料达到20车时停止工作。选P1.0、P1.1和P1.2三位口线作按钮和限位开关状态信号的输入端,选P2.0和P2.1作为控制小车右行和左行拖动电动机的输出信号。图5-1运料小车控制电路示意图任务中,小车装料需要25s,卸料需要2s,可采用软件延时实现时间控制,分别编写一个25s的延时子程序和一个2s的延时子程序,则装料的时候调用25s的延时子程序,卸料的时候调用2s的延时子程序。

5.2任务实施

下面一起实现运料小车控制吧!在这部分重点应学习子程序的调用,进一步熟悉转移类、循环类指令及分支结构程序的应用。

步骤1:设计硬件电路,如图5-2所示。图5-2运料小车控制电路原理图步骤2:分析任务内容,绘制程序流程图。用位操作指令检测限位开关的状态,用累加器A统计运料小车车数。累加器A初值为00H,每当限位开关S2动作一次,则对累加器A加1操作一次。这样当累加器A的内容为20时,表示已运料20车。程序流程如图5-3所示。图5-3运料小车控制程序流程图步骤3:根据流程图编写源程序。具体如下:

;************运料小车控制程序**************

;程序名:运料小车控制程序SHIPCART.A

;程序功能:电机拖动小车运送物料

S0BITP1.0

S1BITP1.1

S2BITP1.2

LEFTBITP2.0

RIGHTBITP2.1

ORG0000H

AJMPMAIN ;跳转到主程序

ORG0030H

MAIN:CLRA ;卸料车数赋初值0

CLRLEFT ;关闭小车左右行

CLRRIGHT

SKEY0: JBS0,L1 ;判断S0是否按下

LCALLD10MS ;延时10ms去抖动

JBS0,SKEY0 ;再确认S0是否按下

SKEY1: JBS1,$ ; S1动作否?

LCALLD25S

SETBRIGHT ;小车右行

JBS2,$ ; S2动作否?

LCALLD2S

INCA ;卸料车数加1

CJNEA,#20,LOOP ;是否卸料20车?

AJMPSKEY0;是,停下来,等待启动按钮S0

LOOP: CLRRIGHT ;不是,小车左行

SETBLEFT

AJMPSKEY1

;***************10ms延时子程序*****************

D10MS: MOVR7,#40

D10MS1:MOVR6,#123

NOP

DJNZR6,$

DJNZR7,D10MS1

RET

;*********2s延时子程序*****************

D2S: MOVR5,#40

D2S0: MOVR4,#200

D2S1: MOVR3,#123

NOP

DJNZR3,$

DJNZR4,D2S1

DJNZR5,D2S0

RET

;**********25s延时子程序*******************

D25S: MOVR5,#250

D25S0: MOVR4,#200

D25S1: MOVR3,#248

NOP

DJNZR3,$

DJNZR4,D25S1

DJNZR5,D25S0

RET

END

5.3任务相关知识

5.3.1空操作指令

NOP ;PC→(PC)+1

这条指令除了使PC加1,消耗一个机器周期外,没有执行任何操作。一般用作短时间的延时。5.3.2基本程序结构4——子程序及其调用

1.子程序

在任务1闪烁灯中,我们已用到过子程序(ACALLDELAY_50MS),只是并没有明确地介绍。子程序是干什么用的?为什么要用子程序技术呢?举个例子,数学老师布置了10道算术题,经过观察每一道题中都包含一(3×5+2)×3

的运算,我们能有两种选择。第一种选择是每做一道题,都把这个算式算一遍;第二种选择是,我们先把这个结果算出来(结果为51)放在一边,然后要用到这个算式时就将51代进去。这两种办法哪种更好呢?不必多言。其实,设计程序时也是这样,有时一个功能会在程序的不同地方反复使用,我们就把这个功能做成一段程序,每次需要用到这个功能时就“调用”一下。

2.调用与返回

主程序调用了子程序,子程序执行完之后必须再回到主程序继续执行,不能“一去不回头”,那么应回到什么地方呢?答案是:回到调用子程序的下面一条指令继续执行。以闪烁灯中子程序ACALLDELAY_50MS为例,子程序调用与返回过程如图5-4所示。子程序只需书写一次,主程序可以反复调用它。图5-4子程序调用与返回以下是4条与子程序调用有关的指令。

ACALLaddr11 ;短调用指令

LCALLaddr11 ;长调用指令

RET ;返回指令

RETI ;中断返回指令

3.现场保护与恢复

主程序常要使用寄存器,而子程序运行时也常要使用寄存器。这就产生了问题——主程序和子程序都使用相同组的寄存器。假如主程序调用子程序时,不对其所使用的寄存器内容加以保护,那么从子程序返回主程序时,就无法将它们恢复到主程序调用子程序前的状态,故也就无法保证主程序能在原有的基础上继续执行下去。通常,把主程序调用子程序时各个寄存器的状态称为主程序的现场。很明显,在主程序调用子程序时,必须对主程序的现场进行保护。在子程序执行完毕返回主程序之前,必须对主程序的现场加以恢复。这就是采用子程序结构时的“现场保护”和“现场恢复”问题。现场保护的原则是:除了用来存放输出参数的寄存器外,凡是子程序需要使用的寄存器,在进入时都应该加以保护。

(1)在主程序中实现,其特点是结构灵活。示例如下:

PUSHPSW ;保护现场

PUSHACC

PUSHB

ACALLaddr11 ;子程序调用

POPB ;恢复现场

POPACC

POPPSW

(2)在子程序中实现,其特点是程序规范、清晰。示例如下:

SUB1: PUSHPSW ;保护现场

PUSHACC

PUSHB

POPB

;恢复现场

POPACC

POPPSW

RET

;子程序返回

4.堆栈指令PUSH和POP

PUSHdirect ;SP←(SP)+1,(SP)←(direct)

POPdirect ;direct←((SP)),SP←(SP)-1

堆栈是内部RAM中按“先进后出”的规则组织的一片存储区。此区的一端固定,称为栈底;另一端是活动的,称为栈顶。栈顶的位置(地址)由栈指针SP指示(即SP的内容是栈顶的地址)。在8051中,堆栈的生长方向是向上的(地址增大)。入栈操作(PUSHdirect)时,先将SP的内容加1,然后将direct单元的内容存入SP指向的单元;出栈操作(POPdirect)时,先将SP指向的单元内容传送到direct单元,然后将SP的内容减1。系统复位时,SP的内容为07H,这样单片机初始化的堆栈区域同第1组工作寄存器区重合。也就是说,当把堆栈栈底设在07H处时,就不能使用第1组工作寄存器。如果堆栈存入数据量比较大的话,甚至第2组和第3组工作寄存器也不能使用了。因此,通常总是把堆栈区的位置设在用户RAM区。例如:

MOVSP,#60H

;将堆栈栈底设在内部RAM的60H处

PUSHPSW ;保护现场

PUSHACC

PUSHB

ACALLaddr11 ;子程序调用

POPB ;恢复现场

POPACC

POPPSW

【例5-1】若(SP)=40H,(A)=88H,(PSW)=99H,请说明顺序执行以下指令时,相关寄存器及SP指针的变化情况。

PUSHA

PUSHPSW

POPPSW

POPA解

5.参数传递

主程序与子程序间一个主要问题是参数传递。入口参数是指主程序调用子程序时提供给子程序的参数。出口参数是指子程序执行结束返回给主程序的参数。

参数的具体内容包括:①传数值,即传送数据本身;②传地址,即传送数据的主存地址。常用的参数传递方法包括:利用累加器或寄存器、利用存储器和利用堆栈。当然,有些子程序无需参数传递,这类子程序中所需要的参数是子程序赋予的,不需要主程序给出,如前面所用的DELAY_50MS子程序。

(1)利用累加器或寄存器。该方法最简单,比较常用,但由于通用寄存器个数有限,这种方法对少量数据可以直接传递数值,而对大量数据只能传递地址。

【例5-2】将片内RAM从30H开始的10个存储单元的内容清0。

实现程序:

MAIN:… ;主程序

MOVR0,#30H

MOVR7,#0AH

ACALLSUBRT

…

SUBRT: MOVA,#00H;子程序

LOOP: MOV@R0,A

INCR0

DJNZR7,LOOP

RET

(2)利用存储器。传送的数据量比较大时,可以利用存储器实现参数的传递。先建立一个参数表,用指针指示参数表所在位置。

①参数表建立在内部RAM时,用R0或R1作指针。

②参数表建立在外部RAM时,用DPTR作指针。

【例5-3】将R0和R1指向的内部RAM中两个3B无符号整数相加,结果送到由R0指向的内部RAM中。入口参数:R0和R1分别指向加数和被加数的低位字节。出口参数:R0指向结果的高位字节。低字节在高地址,高字节在低地址。

实现程序(子程序名NADD):

NADD:MOVR7,#3;三字节加法

温馨提示

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

评论

0/150

提交评论