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

下载本文档

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

文档简介

内容概要汇编语言:直接控制单片机硬件的编程语言。因此,要求程序设计者要“软、硬结合”。本章介绍汇编语言程序设计的基本知识,以及一些基本的程序设计。4.1汇编语言程序设计概述程序是指令的有序集合。单片机运行就是执行指令序列的过程。编写这一指令序列的过程称为程序设计。14.1.1单片机编程语言常用的编程语言是汇编语言和高级语言。1.汇编语言汇编语言:用助记符表示的指令。汇编语言源程序:用汇编语言编写的程序。“汇编”:汇编语言源程序需转换(翻译)成为二进制代码表示的机器语言程序,才能识别和执行。经汇编软件“汇编”得到的以二进制形式表示的机器语言称为目标程序。2优点:用汇编语言编写程序效率高,占用存储空间小,运行速度快,能编写出最优化的程序,缺点:可读性差,离不开具体的硬件,是面向“硬件”的语言通用性差。2.高级语言不受具体“硬件”的限制,优点:通用性强,直观、易懂、易学,可读性好。目前多数的51单片机用户使用C语言(C51)来进行程序设计,已公认为高级语言中高效简洁而又贴近51单片机硬件的编程语言。将C语言向单片机上移植,始于20世纪80年代的中后期。34.1.2汇编语言语句和格式两种基本语句:指令语句和伪指令语句。(1)指令语句每一指令语句在汇编时都产生一个指令代码(机器代码),执行该指令代码对应着机器的一种操作。(2)伪指令语句是控制汇编(翻译)过程的控制命令。没有对应的机器代码。4汇编语言语句是符合典型的汇编语言的四分段格式:〔标号:〕〔操作码〕〔操作数〕;〔注释〕双操作数之间用逗号相隔;任何语句都必须有操作码字段,其余各段为任选项。5标号字段(LABLE)操作码字段(OPCODE)操作数字段(OPRAND)注释字段(COMMENT)【例4-1】下面是一段程序的四分段书写格式。标号字段操作码字段操作数字段注释字段START:MOV A,#00H ;0→A

MOV R1,#10 ;10→R1 MOV R2,#00000011B ;03H→R2LOOP:ADD A,R2 ;(A)+(R2)→A DJNZ R1,LOOP;R1减1不为零,则跳LOOP处 NOPHERE:SJMP HERE61.标号字段 语句所在地址的标志符号,才能被访问。如标号“START”和“LOOP”等。有关标号规定如下:(1)标号后必须跟冒号“:”。(2)由1~8个ASCII码字符组成,第一个字符必须是字母.(3)同标号在一个程序中只定义一次,不能重复定义。(4)不能将指令助记符、伪指令以及寄存器的符号名称等作为标号。(5)若某条语句将被本程序其他语句访问,则可用标号,否则不需标号。72.操作码字段必不可少。3.操作数字段指令的操作数或操作数地址。通常有1个、2个、3个或没有。如果是多操作数,则操作数之间要以逗号隔开。8操作数若多个操作数,之间用逗号分开。操作数包括的内容有:(1)工作寄存器:由PSW.3和PSW.4规定的当前工作寄存器区中的R0~R7。(2)特殊功能寄存器:21个SFR的名字。(3)标号名:赋值标号—由汇编指令EQU等赋值的标号;指令标号—指令标号指示的指令的第一字节地址是该标号的值。(4)常数:可用二进制(B)、十进制、十六进制(H),若常数以字符开头,前面加0。(5)$:用来表示程序计数器的当前值。(6)表达式:汇编时,计算出表达式的值填入目标码。94.注释字段 用于解释指令或程序的含义,对可读性非常有用。 使用时须以分号开头,长度不限,一行写不下可换行书写,但注意也要以分号开头。汇编时,遇到“;”就停止“翻译”。因此,注释字段不会产生机器代码。104.1.3伪指令ORG汇编起始命令格式:ORG16位地址功能:规定该伪指令后面程序的汇编地址,即汇编后生成目标程序存放的起始地址。例如:

ORG2000HSTART:MOVA,#64H┇规定了START的地址是2000H,又规定了汇编后的第一条指令码从2000H开始存放。地址必须由小到大排列,且不能交叉.伪指令不是真正的指令,无对应的机器码,在汇编时不产生目标程序,只是用来对汇编过程进行某种控制。ORG 2000H……ORG 2500H……ORG 3000H……这种顺序是正确的。若按下面顺序的排列则是错误的,因为地址出现了交叉。ORG 2500H……ORG 2000H……ORG 3000H……1213END

汇编结束指令格式:END功能:通知汇编程序结束汇编。在END之后所有的汇编指令均不予以处理。DB(DefineByte)定义数据字节命令用于从指定的地址开始,在程序存储器连续单元中定义字节数据。例如: ORG 2000HDB 30H,40H,24,"C","B"汇编后(2000H)=30H(2001H)=40H(2002H)=18H(十进制数24)(2003H)=43H(字符“C”的ASCII码)(2004H)=42H(字符“B”的ASCII码)14编程的步骤一、分析问题二、确定算法三、画程序流程图四、编写程序15一、分析问题对需要解决的问题进行分析,以求对问题有正确的理解。如:解决问题的任务是什么?工作过程?现有的条件,已知数据,对运算的精度和速度方面的要求?设计的硬件结构是否方便编程?16二、确定算法算法是如何将实际问题转化成程序模块来处理。在编程以前,先要对几种不同的算法进行分析、比较,找出最适宜的算法17三、画程序流程图程序流程图是使用各种图形、符号、有向线段等来说明程序设计过程的一种直观的表示。流程图步骤分得越细致,编写程序是也越方便。画流程图是程序结构设计采用的一种重要手段。一个系统软件有总的流程图(主程序框图)和局部的流程图。流程图常采用的图形和符号。18椭圆框或桶形框:表示程序的开始或结束。矩形框:表示要进行的工作。菱形框:表示要判断的事情,菱形框内的表达式表示要判断的内容。圆圈:表示连接点指向线:表示程序的流向编程的方法和技巧一、模块化的程序设计方法二、编程技巧20一、模块化的程序设计方法1、程序功能模块化的优点单个模块结构的程序功能单一,易于编写、调试和修改。便于分工,从而可使多个程序员同时进行程序的编写和调试工作,加快软件研制进度。程序可读性好,便于功能扩充和版本升级。对程序的修改可局部进行,其它部分可以保持不变。对于使用频繁的子程序可以建立子程序库,便于多个模块调用。212、划分模块的原则每个模块应具有独立的功能,能产生一个明确的结果,即单模块的功能高内聚性。模块之间的控制耦合应尽量简单,数据耦合应尽量少,即模块间的低耦合性。控制耦合是指模块进入和退出的条件及方式,数据耦合是指模块间的信息交换方式、交换量的多少及交换频繁程度。模块长度适中。20条~100条的范围较合适。22二、编程技巧1、尽量采用循环结构和子程序。2、尽量少用无条件转移指令。3、对于通用的子程序,考虑到其通用性,除了用于存放子程序入口参数的寄存器外,子程序中用到的其他寄存器的内容应压入堆栈(返回前再弹出),即保护现场。4、在中断处理程序中,除了要保护处理程序中用到的寄存器外,还要保护标志寄存器。5、用累加器传递入口参数或返回参数比较方便,在子程序中,一般不必把累加器内容压入堆栈。23分为无条件转移和有条件转移。只讨论有条件分支转移程序,又分为单分支选择结构和多分支选择结构。1.单分支选择结构两者选一。一般根据运算结果的状态标志,用条件判跳指令来选择并转移。244.3.6分支转移程序设计25图4-4单分支选择结构1

图4-5单分支选择结构2【例4-9】

求单字节有符号数的二进制补码正数补码是其本身,负数补码是其反码加1。因此,应首先判被转换数的符号,负数进行转换,正数本身即为补码。设二进制数放在A中,其补码放回到A中

26参考程序如下:CMPT:JNBAcc.7,RETURN ;(A)>0,不需转换 MOVC,Acc.7 ;符号位保存 CPLA ;(A)求反,加1 ADDA,#1 MOVAcc.7,C ;符号位存在A的最高位RETURN:RET272.多分支选择结构当程序的判别部分有两个以上的出口时,为多分支选择结构。有两种形式。28

图4-6

多分支选择结构1图4-7

多分支选择结构2指令系统提供了非常有用的两种多分支选择指令:间接转移指令

JMP@A+DPTR比较转移指令

CJNEA,direct,rel

CJNEA,#data,rel CJNERn,#data,rel CJNE@Ri,#data,rel间接转移指令“JMP@A+DPTR”由数据指针DPTR决定多分支转移程序的首地址,由A的内容选择对应分支。CJNE能对两个欲比较的单元内容进行比较,当不相等时,程序实现相对转移;若两者相等,则顺序往下执行。29简单的分支转移程序的设计,常采用逐次比较法,就是把所有不同的情况一个一个地进行比较,发现符合就转向对应的处理程序。缺点是程序太长,有n种可能的情况,就需有n个判断和转移。【例4-10】

求符号函数的值。符号函数定义如下:X存放在40H单元,Y存放在41H单元。30Y=1X

>0X

<0X

=00-1程序如下:SIGNFUC: MOV A,40H CJNE A,#00H,NZEAR AJMP NEGTNZEAR:JB Acc.7,

POSI MOV A,#01H AJMP NEGTPOSI:

MOV A,#FFH

MOV 41H,

A END 31NEGT:实际中,经常遇到图4-7的分支转移程序设计,典型例子就是当单片机系统中的键盘按下时,就会得到一个键值,根据不同的键值,跳向不同的键处理程序入口。此时,可用直接转移指令(LJMP或AJMP指令)组成一个转移表,然后把该单元的内容读入累加器A,转移表首地址放入DPTR中,再利用间接转移指令实现分支转移。【例4-11】

根据寄存器R2的内容,转向各个处理程序PRGX(X=0~n)。

(R2)=0,转PRG0 (R2)=1,转PRG1 …… (R2)=n,转PRGn32程序如下:JMP6:

MOV DPTR,#TAB5;转移表首地址送DPTR MOV A,R2 ;分支转移参量送A MOV B,#03H ;乘数3送B MUL AB ;分支转移参量乘3 MOV R6,

A ;乘积的低8位暂存R6 MOV A,B ;乘积的高8位送A ADD A,DPH ;乘积的高8位加到DPH中 MOV DPH,

A MOV A,

R6 JMP @A+DPTR ;多分支转移选择

……33TAB5: LJMP PRG0 ;多分支转移表 LJMP PRG1

…… LJMP PRGnR2乘3是由于长跳转指令LJMP要占3个单元。4.3.7循环程序设计程序中含有可以反复执行的程序段,称循环体。例如,求100个数的累加和,那么可用一条加法指令使其循环执行100次。因此可缩短程序长度和程序所占的内存单元数量更少,使程序结构紧凑。341.循环程序的结构主要由以下四部分组成。(1)循环初始化完成循环前的准备工作。循环控制计数初值、地址指针的起始地址的设置、为变量预置初值等。(2)循环处理反复循环执行的部分,故又称循环体。(3)循环控制不断修改循环控制变量,符合结束条件,就结束循环程序的执行。循环结束控制方法分为循环计数控制法和条件控制法。35(4)循环结束这部分是对循环程序执行的结果进行分析、处理和存放。2.循环结构的控制分为循环计数控制结构和条件控制结构。3637图4-8计数循环控制结构图4-9条件控制结构(1)计数循环控制结构依据计数器的值来决定循环次数,一般为减1计数器,计数器减到“0”时,结束循环。计数器初值在初始化设定。DJNZRn,rel

;以工作寄存器作控制计数器DJNZdirect,rel

;以直接寻址单元作控制计数器38公式要改写为用程序实现的形式,用下式表示39图4-10

求数据和的程序框图例如,计算n个数据的和,计算公式为图4-10

求数据和的程序框图【例4-12】求n个单字节无符号数xi的和,xi放在片内部RAM50H开始的单元中,n放在R2中,结果(双字节)放在R3R4中。40ADD1:

MOV R2,#n ;加法次数n送R2 MOVR3,#0 ;R3存放和的高8位,初始值为0 MOVR4,#0 ;R4存放和的低8位,初始值为0 MOVR0,#50H

MOVA,R4 ADD A,@R0 MOVR4,A CLR A

ADDCA,R3 MOVR3,AINC R0 DJNZR2,LOOP;判加法循环次数是否已到?

ENDLOOP:计数控制只有在循环次数已知的情况下才适用。当循环次数未知,不能用循环次数来控制,往往需要某种条件来判断是否应该终止循环。41(2)条件控制结构结构见图4-9。循环控制中,设置一个条件,判是否满足该条件,如满足,则循环结束。如不满足该条件则循环继续。

MOV R4,#0FFH ;长度计数器初值送R4 MOVR1,#2FH ;字符串指针初值送R1

INC R4 INC R1 CJNE@R1,#0AH,NEXT;比较,不等则再比较

END42【例4-13】一串字符,放在内部RAM30H单元开始的连续单元中,字符串以0AH为结束标志,测试字符串长度。采用逐个字符依次与“0AH”比较的方法。设置一个累计字符串长度的计数器和一个指定字符串的指针。如果与“0AH”不等,则长度计数器和字符串指针都加1;如果比较相等,则表示该字符为“0AH”,字符串结束,计数器值就是字符串的长度。NEXT:上面两例都为单循环程序。如果一个循环程序中包含了其他循环程序,则称为多重循环程序。最常见的多重循环是软件延时程序,是常用程序之一。43【例4-14】50ms延时程序。用12MHz晶振时,一个机器周期为1µs,执行一条DJNZ指令的时间为2µs。可用双重循环方

温馨提示

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

评论

0/150

提交评论