精品文档 你我共享
第3-1讲 第
3章 单片机汇编语言程序设计
【课 题】MCS-51汇编语言编程
【授课方法】在专业教室讲授,举例说明汇编语言编程应用。 【目的要求】了解本课程汇编语言编程的基础知识;
理解MCS-51汇编语言编程方法;
掌握MCS-51汇编语言编程相关规定和硬件知识。
【重点难点】灵活运用与编程有关的规定。
【教学过程】1、复习 2、程序设计的重要性 3、程序设计方法
汇编语言程序设计
微型机应用离不开应用程序的设计。单片机程序设计多采用汇编语言编写。本章介绍MCS51系统汇编语言程序编写的一般知识:有关规定、习惯用法、常见程序结构和编程方法。要学会编写程序应掌握编程的一般知识,还要分析一些经典程序,从修改现有程序入手,先简后难,循序渐进,最后达到自已设计应用系统和编写程序的目的。
3.1 单片机汇编程序设计方法与流程 3.1.1 汇编语言程序设计步骤
用汇编语言编制程序的过程,称为汇编语言程序设计。通常,汇编语言程序设计的步骤如下:整个汇编程序设计的流程图见图3.1,当然、短小程序可能不要这么复杂。
. 设 设计课题 计规划模型算法绘流程图编 制程序汇编 仿真调试试运行完成修改程序修改流程 修改规划算法图3.1汇编语言程序设计流程图1、设计规划,建立数学模型
设计前对项目作评估和规划,程序功能、运算精度、执行速度、各硬件特点、掌握设计的重点和难点。
2、选择适当的算法
对于同一个任务,往往可用不同的程序实现。此时应结合所用机器的指令系统,对不同的算法进行分析比较,经各方面综合考虑选择一种最佳算法,使程序精简,且执行速度快。
3、程序结构的设计
程序结构设计是把所采用的算法转化为汇编语言程序的准备阶段,特别是对于情况复杂的大型课题,必须进行程序结构设计。它可以分为模块化程序设计、结构程序设计及自顶向下设计等。
腹有诗书气自华
精品文档 你我共享
4、编制汇编语言程序
根据确定的算法及所选用的程序结构就可以绘制流程图,根据流程图并结合所选用的指令系统就可写出相应的汇编语言源程序。
5、汇编语言程序的调试
汇编语言程序编好后必须进行调试,因为所编制的程序难免有错误,且程序需要优化。
3.1.2编制程序的流程图
1、程序流程图的作用
采用流程图表示法,可以直观形象地表示各部分的逻辑关系及程序结构。方便地发现和分析程序算法存在的错误,便于掌握和进行交流。所以,流程图是程序设计的重要工具。
2、程序流程图的组成
程序流程图是用几何图形配以文字说明来描述程序的。它不但形象地描述程序执行的过程而且清楚地表达程序结构的内在联系。流程图中所采用的各种常用符号如下: (1)端点图
它是一个圆形框(如图3.2 中开始和结束)表示程序的起止等相应的文字 (2)流程线
流程线如图3.2线条所示,它表示程序执行的流向。 (3)处理框
处理框如图3.2所示,该框表示一种处理功能或者程序执行的过程。框内用文字简要说明一段程序的功能或处理过程。 (4)判断框
判断框如图3.2所示,该框用于指示一个判定点,从这点产生分支。在框内应注明测试条件,而测试结果则注明在各分支流程线上。 (5))子程序框
子程序框如图3.2所示,该框表示调用子程序,在该框内填入相应的子程序名称或入口地址。
开始、起点处理框1判断框1处理框2流程线子程序框图 3.2 流程图中常用符号判断框2结束如果要解决的问题较为复杂,通常设计“粗细”不同的程序流程图。首先设计粗图框,力求反映编程者的总体设计思想及总体结构并侧重于模块之间的相互联系;然后设计详细框图,此时应侧重各个模块的具体实现。当然、一个简单的程序也可直接写出,但要成为一个优秀的设计人员,开始就要养成良好的习惯,掌握大量的设计素材,学习他人经验。
3.1.3 单片机程序结构
1 伪指令
用汇编语言编写的程序通常需经过微机汇编变成机器码才能被执行。为了对源程序汇编,在源程序中必须使用一些“伪指令”。伪指令是便于程序阅读和编写的指令,它即不控制机器的操作也不能被汇编成机器代码,只为汇编程序所识别的常用符号,并指导汇编如何进行,故称为伪指令。已是大家公认的习惯用法,MCS-51系列单片机的常用伪指令如下:
1)、起始地址伪指令ORG
腹有诗书气自华
精品文档 你我共享
起始地址伪指令ORG是用来规定目标程序段或数据块的起始地址。 通常,在汇编语言程序开始处均用ORG伪指令指定程序存放的起始地址。
2)、汇编结束伪指令END
汇编结束伪指令END是用来告诉汇编程序,此源程序到此结束。在一个程序中,只允许出一条END语句,而且必须安排在源程序的末尾。否则,汇编程序对END语句后的所有语句都不进行汇编,
3)、赋值伪指令EQU
赋值伪指令EQU用于告诉汇编程序,将该伪指令右面的值赋给左面用户定义的符号,其格式如例题。
由EQU赋值的字符名称在源程序中可以作为数值使用,也可以作为数据地址、代码地址或位地址。由EQU伪指令所定义的符号必须先定义后使用。故该语句通常放在程序开头处。
例3.1
BUFFER EQU 58H ;BUFFER的值是58H
BLOCK EQU ADDER ;将标号ADDER赋值给字符名称BLOCK ORG 4000H ;该语句下面的程序从4000H开始
4000H E5F0 START:MOV A,B 4002H 30E7 JNB ACC.7,DONE 4004H F4 CPL A
4005H F5FO DONE:MOV B,A 4007H F558 MOV BUFFER,A END 4)、定义字节伪指令DB
定义字节伪指令DB是用于告诉汇编程序从指定的地址单元开始定义若干个字节存储单元的内容。其格式见练习二。
5)、定义字伪指令DW
定义字伪指令DW是用来告诉汇编程序从指定的地址单元开始,定义若干个16位数据。其格式如DB用法相同,只是一次定义16位数。
由于一个字长为16位,故要占两个存储单元。在MCS-51单片机系统中,16位的高8位存入低地址单元,低8位存入高地址单元。。
6)、数据地址赋值指令DATA
数据地址赋值伪指令DATA是用于告诉汇编程序,把由表达式指定的数据地址或代码地址赋予规定的字符名称.
DATA伪指令的功能是和EQU指令相似,但DATA伪指令所定义的符号可先使用后定义。在程序中它常用来定义数据地址,该语句一般放在程序的开头或末尾。 7)、位地址赋值伪指令BIT
位地址赋值伪指令BIT是用于告诉汇编程序,把位地址赋予规定的字符名称,常用于位处理的程序中,
机器汇编通常是在PC机上用软件MedWin/QTH-8052F/EDIT等编辑,用编程器将程序固化在芯片内,供单片机运行。
3.1.4 汇编语言源程序人工汇编 1、汇编程序的汇编过程
腹有诗书气自华
精品文档 你我共享
用汇编语言编写的源程序必须通过汇编程序的汇编,才能使源程序转换成相应的由机器码指令组成的目标程序。较长的程序一般采用微机汇编,短小程序或练习程序也用手工汇编。
2、人工汇编
在单片机配套的计算机系统上,一般都配备汇编程序,其它微机需另外安装相应的软件,对于简单的实验程序可进行人工汇编,还会有一定好处,学生根据指令表一条条地将汇编语言程序的语句翻译成机器码指令,放到相应的地址,最后得到可运算的目标程序。练习一二次后可掌握基本方法,本书中的练习有的给了机器码,有的没给,大家可参考、练习汇编。
3-2 单片机汇编语言程序设计
【课 题】MCS-51汇编语言程序设计初步 【授课方法】在专业教室讲授
【目的要求】了解本课程汇编语言编程的基础知识;
理解MCS-51汇编语言编程方法;
掌握MCS-51汇编语言顺序、分支、循环、子程序结构
【重点难点】编程相关的技巧很多、全面掌握难度较大。 【教学过程】复习、单片机汇编语言编程初步、顺序、分支程序 【教学内容】
3.2 单片机汇编语言程序设计初步
前面我们已学习了几个小程序,对程序有了初步了解,知道汇编语言是面向机器语言。单片机汇编语言程序设计与所使用的机器的内部结构都有密切的关系。必须充分了解所使用机器的“硬件环境”,才能着手进行汇编语言程序设计。特别是在编制I/O接口程序时还需了解I/O接口电路、机器及外设的外特性。
为了设计一个高质量的程序,必须掌握程序设计的一般方法。在汇编语言程序设计中,普遍采用结构化程序设计方法。采用这种设计方法的主要依据是任何复杂的程序都可由顺序结构、分支结构及循环结构程序等构成。每种结构只有一个入口和出口,整个程序也只有一个入口和出口。结构程序设计的特点是程序的结构清晰、易于读写、易于验证、可靠性高。下面主要介绍结构化程序设计的基本的程序设计方法。
3.2.1、顺序程序设计
1、顺序结构
顺序结构是程序结构中最简单一种。用程序流程图表示时,是一个处理框紧接着一个处理框。在执行程序时从第一条指令开始顺序执行直到最后一条指令为止。
例3.2 设有16位二进制数存放在8031单片机内部RAM的50H及51H单元中,要求将其算术左移一位(即原数各位均向左移1位,最低位移入0)后仍存放在原单元。试编制相应的程序。(5672H=01010110 01110010→10101100 11100100=ACE4H)
分析: 由于MCS-51系列单片机的指令系统只有8位二进制数的算术移位指令,而无
腹有诗书气自华
精品文档 你我共享
16位二进制数的算术移位指令。因此,要实现16位数的算术左移1位,只能分两次进行。开始时将进位标志C清0,先进行低8位带进位循环左移,将低8位中的原最高位移至C,而C原来的0移至最低位。然后进行高8位带进位循环左移,原低8位中最高位经C移至高8位中的最低位。这样就实现了16位二进制数算术左移一位。
程序如下:
4000 ORG 4000H 4000 C3 BIHROL: CLR C ;C清0
4000 E551 MOV A,51H;低8位左环移一位 4003 33 RLC A 4004 F551 MOV 51H,A
4006 E550 MOV A,50H, ;高8位左环移一位 4008 33 RLC A 4009 F550 MOV 50H,A 400B END
本程序共有7条指令占用11个字节的程序存储空间。
例3.3 设在8031单片机内部RAM的40H单元中存放一个8位二进制数,请将其转换成相应的BCD码并由高位到低位顺序存入内部RAM以60H为首址的3个连续单元中。试编写相应的程序。注:单片机指令默认的数是十六进制,大家日常用十进制。
分析: 要求是:80H=128D→01/02/08或0F3H=243D→02、04、03
由于51系列单片机的指令系统中有除法指令,故它的转换可用运算实现。先将此数除以100,其商即为百位数;再将余数除以10,其商即为十位数,而此时的余数即为个位数。
程序如下:
ORG 4000H
BINBCD: MOV RO, #60H ;设置存数地址指针R0初值 MOV A,40H ;取被转换的二进制数 MOV B,#100 ;置除数为100或64H DIV AB ;除以100,求百位数 MOV @RO,A ;将百位数指定单元 INC RO ;修改指针 MOV A,#10 ;置除数为10 XCH A,B
DIV AB ;除以10,求十位数 MOV @RO,A ;将十位数指定单元 INC RO ;再次修改指针 XCH A,B ;A中为个位数 MOV @RO,A ;送个位数 END ;结束
例3.4 设在8031单片机的外部RAM的60H单元存有1字节代码,要求将其分解成两个4位字段。高4位存入原单元的低4位,其低4位存入61H单元的低4位且要求这两单元的高4位均为0。试编制相应的程序。把一个字节数这样做以便送到两个数码管显示。
分析:本题的实质是进行字节分解,可用ANL和SWAP A指令来实现。 源程序如下:
ORG 4000H
腹有诗书气自华
相关推荐: