单片机控制技术与应用(刘靖)课件4_第1页
单片机控制技术与应用(刘靖)课件4_第2页
单片机控制技术与应用(刘靖)课件4_第3页
单片机控制技术与应用(刘靖)课件4_第4页
单片机控制技术与应用(刘靖)课件4_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

1、4.1汇编语言程序设计概述(1)汇编语言的特点 助记符指令和机器指令一一对应,所以用汇编语言编写的程序效率高,占用存储空间小,运行速度快,因此汇编语言能编写出最优化的程序。 使用汇编语言编程比使用高级语言困难,因为汇编语言是面向计算机的,汇编语言的程序设计人员必须对计算机硬件有相当深入的了解。 汇编语言能直接访问存储器及接口电路,也能处理中断,因此汇编语言程序能够直接管理和控制硬件设备。 汇编语言缺乏通用性,程序不易移植,各种计算机都有自己的汇编语言,不同计算机的汇编语言之间不能通用;但是掌握了一种计算机系统的汇编语言后,学习其他的汇编语言就不太困难了。(2)汇编语言的语句格式:;(3)汇编语

2、言程序设计的步骤 建立数学模型。 确定算法。 制定程序流程图。 确定数据结构。 写出源程序。 上机调试程序。4.2伪指令伪指令是程序员发给汇编程序的命令,也称为汇编命令或汇编程序控制指令。Cygnal常见汇编语言程序中常用的伪指令如下。(1)ORG (ORiGin)汇编起始地址命令 在汇编语言源程序的开始,通常都用一条ORG伪指令来实现规定程序的起始地址。在十字路口交通灯控制中,用ORG 0000H来开始程序。(2)END (END of assembly) 汇编终止命令 汇编语言源程序的结束标志,用于终止源程序的汇编工作。在整个源程序中只能有一条END命令,且位于程序的最后。在十字路口交通灯

3、控制中,用END来结束的程序。(3)EQU (EQUate) 赋值命令 (4)DB (Define Byte) 定义字节命令 (5)DW (Define Word) 定义数据字命令 (6)DS (Define Stonage ) 定义存储区命令 (7)BIT位定义命令 (8)DATA数据地址赋值命令 4.3单片机汇编语言程序的基本结构形式(1)顺序程序【例4-1】三字节无符号数相加,其中被加数在内部RAM的50H、51H和52H单元中,加数在内部RAM的53H、5414和55H单元中,要求把相加之和存放在50H、51H和52H单元中,进位存放在位寻址区的00H位中。 其中: 在十字路口交通灯控

4、制中,用到MOVR0,#0FFH,MOVA,#01H等。【例4-2】从50个字节的无序表中查找一个关键字“40H”。(2)分支程序 单分支程序【例4-3】变量X存放在VAR单元内,函数值Y存放在FUNC单元中,试按下式的要求给Y赋值:Y= 本题的程序流程见图4-1(a)。参考程序: 图4-1例4-3的分支流程图这个程序的特征是先比较判断,然后按比较结果赋值,这实际是三分支归一的流程图,因此,至少要用两个转移指令。初学者很容易犯的一个错误是:漏掉了其中的SJMP DONE语句,因为流程图中没有明显的转移痕迹。这个程序也可以按图4-1(b)的流程图来编写,其特征是先赋值,后比较判断,然后修改赋值并

5、结束。参考程序: 多分支程序参见图4-2。(3)循环程序循环程序一般由4部分组成:图4-2多分支程序转移 置循环初值,即确立循环开始时的状态; 循环体(工作部分),要求重复执行的部分; 循环修改,循环程序必须在一定条件下结束,否则就要变成死循环; 循环控制部分,根据循环结束条件,判断是否结束循环。以上4个部分可以有两种组织方式。【例4-4】从BLOCK单元开始存放一组无符号数,一般称为一个数据块。数据块长度放在LEN单元,编写一个求和程序,将和存入SUM单元,假设和为不超过8位二进制数。在置初值时,将数据块长度置入一个工作寄存器,将数据块首地址送入另一个工作寄存器,一般称它为数据块地址指针。每

6、做一次加法之后,修改地址指针,以便取出下一个数来相加,并且使计数器减1。到计数器减到0时,求和结束,把和存入SUM即可。 参考程序(各单元的地址是任意的):以上程序在计数器初值不为零时是没有问题的,但若是数据块的长度有可能为零,则将出现问题。当R2初值为零,减1之后将为FFH,故要做256次加法之后才会停止,显然和题意不符。若考虑到这种情况,则可按下面的方式来编写程序,在做加法之前,先判断一次R2的初值是否为零。整个程序仍基本套用原来的形式。其中: CLRbit;清“0”bit位。在十字路口交通灯控制中,用到CLR P2.4来熄灭灯。 将源操作数(Rn或direct)减1,结果回送到Rn寄存器

7、或direct中去。如果结果不为0,则转移到标号为rel的子程序中去。允许程序员把寄存器Rn或内部RAM的direct单元用作程序循环计数器。主要用于控制程序循环。以减1后是否为“0”作为转移条件,即可实现按次数控制循环。最常见的多重循环是由DJNZ指令构成的软件延时程序,它是常用的程序之一。例如:50ms延时程序。延时程序与Cygnal指令执行时间有很大的关系。在使用12MHz晶振时,一个机器周期为1s,执行一条DJNZ指令的时间为2/3,用双重循环方法写出下面的延时50ms的程序:以上延时程序不太精确,它没有考虑到除“DJNZR6,DEL2”指令外的其他指令的执行时间。如把其他指令的执行时

8、间计算在内,它的延时时间为:(250+1+2)200+1=50.301ms如果要求比较精确的延时,可按如下修改:实际延迟时间为50.001ms。注意 软件延时程序不允许有中断,否则将严重影响定时的准确性。在十字路口交通灯控制中用DjnzR7,loop9DjnzR6,loop8Djnz R5,loop7来实现延时。(4) 子程序的设计 子程序设计原则子程序是一种能完成某一特定任务的程序段,其资源要为所有调用程序共享。因此,子程序在结构上应具有独立性和通用性。在编写子程序时应注意以下问题。子程序的第一条指令的地址称为子程序的入口地址,该指令前必须有标号。主程序调用子程序有两条:绝对调用指令ACAL

9、L addr11长调用指令LCALL addr16注意设置堆栈指针和现场保护。最后一条指令必须是RET指令。子程序可以嵌套,即子程序可以调用子程序。在子程序调用时,要注意参数传递的问题。 子程序的基本结构 4.4Cygnal单片机汇编语言程序设计举例(1)算术运算程序【例4-5】假定R2、R3和R4、R5分别存放两个16位的带符号二进制数,其中R2和R4的最高位为两数的符号位。请编写带符号双字节二进制数的加减法运算程序,以BSUB为减法程序入口,以BADD为加法程序入口,以R6、R7保存运算结果。参考程序:(2)数制转换程序【例4-6】在内部RAM的hex单元中存有两位十六进制数,试将其转换为

10、ASCII码,并存放于asc和asc+1两个单元中。主程序(MAIN):子程序(HASC):其中,RET为子程序的返回指令在十字路口交通灯控制中用RET来实现子程序的返回。(3)定时程序有多个定时需要,可以先设计一个基本的延时程序,使其延迟时间为各定时时间的最大公约数,然后就以此基本程序作为子程序,通过调用的方法实现所需要的不同定时。例如要求的定时时间分别为5s 、10s和20s并设计一个1s延时子程序DELAY,则不同定时的调用情况表示如下:其中:长调用指令LCALL addr16在十字路口交通灯控制中用Lcalldelay1来调用延时。(4)查表程序假定有44键盘,键扫描后把被按键的键码放在累加器A中,键码与处理子程序入口地址的对应关系为:并假定处理子程序在ROM 64KB的范围内分布。要求

温馨提示

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

评论

0/150

提交评论