片机汇编语言程序设计_第1页
片机汇编语言程序设计_第2页
片机汇编语言程序设计_第3页
片机汇编语言程序设计_第4页
片机汇编语言程序设计_第5页
已阅读5页,还剩75页未读, 继续免费阅读

下载本文档

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

文档简介

1、第12章单片机汇编语言编程,本章内容,单片机汇编语言编程的开发和调试过程,掌握汇编语言编程的一般步骤,了解程序的开发和调试过程,掌握简单程序、分支程序、循环程序、查表程序、子程序和中断系统程序的基本设计方法和技巧,学习目的,12.1概述,12.1.1单片机汇编语言程序设计步骤,1分析问题, 确定算法2绘制程序流程图3分配工作区和相关端口地址4编译汇编语言源程序5调试程序,汇编语言源程序是由汇编指令和伪指令组成的文件,其扩展名为“ASM”。 单片机没有自行开发的功能,所以需要模拟器或仿真软件进行仿真和调试。与硬件相关的调试程序也依赖于仿真开发工具,并与硬件相连。12.1.2程序开发和调试过程,1

2、编辑源程序,2汇编,3调试,4程序固化,以及程序开发和调试过程。简单程序是指程序中不使用转移指令的程序段,程序按照指令的顺序逐一执行。这种程序是最简单的程序结构,其中没有分支,没有循环,也没有子程序,所以它也被称为顺序程序或无分支程序。12.2简单程序设计,示例12.1请用MCS-51汇编指令编写一个程序,并将片内随机存取存储器101、102和103单元中的内容分别传送到片外数据存储器101H、102H和103H单元。分析:应注意片内和片外寻址指令的差异,程序如下: MOV R0,#101 MOV A,R0;片内随机存储器101的单元内容被发送到DPTR移动通信公司、DPTR移动通信公司;片外

3、数据存储器单元101H中的INC R0 MOV A,R0;片内RAM102的单位内容发送至DPTR DPTR移动通信有限公司;片外数据存储器单元102H中的INC R0 MOV A、R0;片内RAM103的单位内容发送至DPTR DPTR移动通信有限公司;发送到片外数据存储器103H单元,12.3分支程序设计,其特征在于分支程序包含转移指令。根据分支出口的不同,可分为单分支程序和多分支程序。1.单分支程序,分析:只要比较两个数,就很容易把比较的结果作为分支转移的条件,找出大的数。众所周知,片外数据存储器20H的前三个单元中的前两个单元各自存储一个8位无符号二进制数,因此需要找出该大数并将其存储

4、在第三个单元中。例12.2,程序如下: MOV DPTR,# 20h设置数据指针MOVX A,dptr就拿第一号MOVR1来说吧;第一个号码存储在r1inc dptr中;DPTR指着第二个号码地址,DPTR;取第二个数字CLR C;清除携带SUBB甲,R1;第二个数字减去第一个数字jcbig1有一个借入头寸,第一个数字很大,转到BIG1 MOVX A,dptr第二个数字大,拿大数字去SJMP大2大1: XCH一个,R1一个;最初在R1是一个很大的数字,在a,a中被交换为big 2:Inc dptr mov xdptr;比第三个单位SJMP省2美元。多分支程序,(1)使用多条CJNE指令实现多分

5、支程序转移,解决方案:程序如下:CJNE A,# 5AH,Loop1#5AH表示90ljmp主回路1:jnc jwcjne a,# 32h,回路2;#32H表示50LJMP主回路2:JC SW LJMP主回路。分析:首先根据问题的含义计算x2,然后根据X值的范围确定Y值。示例12.4让片内随机存取存储器30H单元有一个无符号数x,请根据以下等式编程计算,结果y存储在31H单元中。流程图,解决方案:源程序如下:MOV A,30hX MOV B,A MUL AB MOV R0,A;X2在R0临时存放L1 MOV A、30H CJNE A、# 0AHx与10 L1相比:jcl2X10,转L2 CJN

6、E A,#10H,l3l 3:JCL 31;X16,转向L31 MOVR0,# 00hsjmpl4l31: mova,R0;X2decr0被取;计算x2-1 smpl 4 L2:mova,r0。X2incr0被取走;X21l4: mov31h,r0;保存结果,SJMP$ END,(2)使用JMP指令实现多分支程序转移,这是通过分散转移指令JMP A DPTR和无条件转移指令AJMP或LJMP实现的。1)使AJMP或LJMP指令进入分支程序转移表,并将该表的第一个地址放入DPTR;2)将调整后的录入参数,即查询表偏移量,输入到A中;3)执行JMPDPTR转向相应的分支程序。键盘上的每个命令键都有

7、相应的命令键处理程序。当按下某个键时,程序应该立即转到相应的键处理程序执行。因此,16个键有16个分支。每次按键都有相应的按键号码。如果16个命令键的键号是00H0FH,那么键盘处理器将根据键号找到相应的命令键处理器。示例12.5用16个命令键编写一个键盘处理程序。分析:已知的键号存储在累加器A中,16个命令键的无条件转移指令依次存储在转移表中,然后转移到相应的键处理程序中。传输表由LJMP指令组成,每个LJMP指令占用3个字节,因此输入的键号应该乘以3以获得表查找偏移量。解决方案:程序如下:键:MOVDPTR,# kprg传送表的第一个地址被输入到DPTR MOVB # 03h mulab;

8、获取查找表偏移量jmpadptr查找该表,并将其传输到相应的命令键处理程序KPR:ljmpkrg 0;命令键处理程序传输表ljmkprg1 jmpkprg 15 kprg 0:0号密钥处理程序kprg1:1号密钥处理程序kprg 15:15键处理程序,如果转移表中的转移指令被改为AJMP,上述程序应如何修改?AJMP指令的传输范围不超过其2KB字节范围。如果每个短程序太长,不能完全容纳在2KB字节内,那么将如何修改上述程序?思维,12.4循环编程,1)循环初始化设置循环的初始状态,它位于循环程序的开始。2)循环主体循环程序的主要部分,即程序中需要重复执行的部分。3)循环结束条件用于判断循环程序

9、是否结束。循环程序由三部分组成:第一部分,编写程序找出最小值。假设10个无符号数存储在60h片内随机存取存储器中,最小值被找到并发送到片内随机存取存储器的最小单位。在例12.6中,当循环数已知时,循环控制采用计数法。有很多方法可以找到最小值。最基本的方法是轮流比较和交换,即先比较第一个数字和第二个数字,以第一个数字为基准。如果比较结果很小,那么就不要交换,然后取下一个数进行比较;如果比较结果的参考编号很大,则用较小的编号替换原始参考编号,即进行交换,然后将参考编号与下一个编号进行比较。总之,到目前为止,为了保持参考编号为最小编号,参考编号是比较结束时的最小编号。分析和解决方案:程序如下:ORG

10、 1000H MOVR0,# 60h数据区的第一个地址被发送到R0 MOVA和R0;将第一个号码发送给移动电话1,# 09h将比较时间发送到计数器R1 loop:incr 0;修改地址指针以指向下一个地址单元MOV30H,r0;要计算的数字;ared暂时存储为30H CJNEA,30H,comp两个数字的比较比较:jcloop1一个小,然后转移MOVA,r0;如果A较大,将较小的数字发送到A循环1: djnzr1,循环;计数器减1,这不是零。继续MOVMIN,a;在比较之后,存储的结果SJMP$被提供有字符串,该字符串从片上随机存取存储器30H单元开始顺序地存储在连续单元中。字符串以0AH作为

11、结束符号,所以试着写一个程序来计算字符串的长度(假设字符串长度本身不包括0AH符号)。例12.7,对于未知循环次数的问题,采用条件控制结构。解决方案:程序如下:MOV R0,# 0ffh将长度计数器的初始值发送到R0 MOV R1,# 2fh将字符串指针的初始值发送到r1next: INCR0INCR1CJNER1,#0AH,next比较,如果不相等,进行下一个;字符比较sjmp $;程序结束,统计结果;在R0中,1)单循环程序不再包含其他循环程序。2)多循环程序的循环程序也包含其他循环程序,也称为循环嵌套。1.用硬件电路实现2。定时器3的实现。软件延迟。计时(或延迟)方法:延迟程序,软件延迟

12、:使用示例12.8:编写一个延迟为50毫秒的程序。如果8051单片机系统采用12M晶振,Tcy1us,内周期时间:1982=396s,外周期时间:125(1 1 396 2)s=50ms,总延时时间:0.001 50 0.002=50.003ms,延时系统由软件实现,不允许中断,否则会严重影响计时精度。对于较长的时间延迟,可以使用更多的重周期,例如,对于1延迟,可以使用三重周期。延迟程序通常被设计为频繁调用的子程序。数据排序是将一批数字从小到大(升序)或从大到小(降序)排序,冒泡排序是最常用的方法。排序时,前后比较两个相邻的数字。如果数据的大小顺序与要求的顺序不一致,这两个数字将互换;否则,它

13、们不会互换。当按升序排序时,大数字通过相邻数字的交换向后移动;一旦相邻的号码从前到后交换(冒泡),最大的号码将被更改为最后一个;如果你再次冒泡,你可以在倒数第二的位置排列下一个最大的数字。依此类推,完成从小到大的排序。在示例12.9中,编写了一个无符号数字排序程序。假设10个无符号数字存储在片内随机存取存储器中10个连续的单元中,起始地址为30H,因此尝试按升序排序。解决方案:程序如下:START: MOV R0,# 30h将数据区的第一个地址发送到R1 MOV R0,# 09h为每个气泡比较时间发送r1clr00h清除交换标志(将其放入位地址00H)循环: MOV A,R0 MOV 3BH,

14、A;前一个号码暂时存储在INC R0 MOV 3AH中,R0以3BH为单位;后一个号码暂时存储在CLR C SUBB A中,r0存储在3AH单元中;比较两个数字jcnext如果前一个数字小于后一个数字,它将被转移(不可互换),MOV R0,3bh前一个数大于后一个数,这两个数交换为DEC R0 MOV R0和3ah setb00h下一步设置交换标志:incr0。向地址指针添加1,为下一次DJNZ R1和循环比较做准备;如果这一轮比较没有完成,进行下一轮比较JB 00H,开始;这一轮有一个交换,这意味着订单没有完成;设计下一轮泡泡排序SJMP $ 12.5的查表程序。查表是将预先计算或测量的数据

15、按一定的顺序编译成一个表并存储在内存中,然后根据输入的数据从表中找出所需的结果。众所周知,要显示的四个十六进制数(高四位全是零)依次存储在片内随机存取存储器40H43H单元中。尝试用查表法将这四个数据编程转换成普通阴极发光二极管数码管的七段代码,并存储在片内随机存储器50 H 53 H中.示例12.10,解决方案:程序如下:dissd:movr0,#40H MOVR1,#50H MOVR2,#4 MOVDPTR,#TAB D1:MOVA,R0 MOVCA,A DPTR MOVR1,A INCR0 INCR1 DJNZR2,D1 SJMP $ TAB 3360 DB 3FH,06H,5BH,4F

16、H,66H,6DH,7DH,07H DB 7FH,6FH,77H0F的七个部分显示了代码表。在片内随机存储器的EGA单元中有一个大写的英文字母。需要将该字母在英语字母表中的位置发送到片内计数单元。如果EGA单位中的字母是I,数字9应该被发送到计数单位。例如,如果将26个英文字母按顺序编成一个表,用查表法得到的一个字母与EGA单位的字母进行比较,如果不相等,则再次检查并记录查表次数。检查后,将记录的时间发送到计数单元。分析,组织1000hega equ 50h计数equ 60h mov计数,#00H MOV A,# 16;调整地址循环:推一个MOVC,一台电脑;查找表CJNE A,EGA,新罕布

17、什尔州;将搜索到的信件与SJMP EGA的信件进行比较;如果相等,转到最后一个。调整地址INC COUNT将计数值加上1个SJMP循环;继续检查最后: INC计数;在计数值上增加1 SJMP元;等待alpt:dba,b,y,z,找到y=n!(n=0,1,9),已知n的值在片上随机存取存储器的NUM单元中,并且获得的y值由BCD码表示并存储在GETY在片上开始的单元中。例如,分析:函数值可以列在表中,y=n可以通过查表得到!当n=9,y=362880H时,需要三个单位来存储结果。假设对应于N的每个Y值存储在三个单元中,表中Y值的第一个地址的计算公式为:Y地址=函数表n*3的第一个地址,参照程序org 1000h Numequ 50h getyequ 60 hmovr 1,#03H MOV R0,#GETY MOV

温馨提示

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

评论

0/150

提交评论