程序设计是为解决某个问题而用计算机所能接受的语言描述其操作过程的句子序列。不仅汇编语言外,单片机程序设计语言还有两类:机器语言和中级语言。机器语言(MachineLanguage)是指直接用机器码编撰程序、能够为计算机直接执行的机器级语言。机器码是一串由二补码代码“0”和“1”组成的二补码数据,其执行速率快,而且可读性极差。机器语言通常只在简单的开发装置中使用,程序的设计、输入、修改和调试都很麻烦,在实训实验中直接固化或输入的程序都是机器语言程序。汇编语言(AssemblyLanguage)是指用指令助记符取代机器码的编程语言。汇编语言程序结构简单,执行速率快,程序易优化,编译后占用储存空间小,是单片机应用系统开发中最常用的程序设计语言。汇编语言的缺点是可读性比较差,只有熟悉单片机的指令系统,并具有一定的程序设计经验,能够研发出功能复杂的应用程序。中级语言(High-LevelLanguage)是在汇编语言的基础上用自然语言的句子来编撰程序,比如PL/M-51、FranklinC51、MBASIC51等,程序可读性强,通用性好,适用于不熟悉单片机指令系统的的用户。中级语言编撰程序的缺点是实时性不高,结构不紧凑,编译后占用储存空间比较大,这一点在储存器有限的单片机应用系统中没有优势。
伪指令:控制汇编程序的指令,但不是控制单片机操作的指令,没有机器码。格式:ORGXXXX诸如:ORG10001000H;指示前面的程序或数据块以1000H为起始地址连续储存。若省略ORG伪指令,则该程序段从ROM中0000H单元开始储存。在一个源程序中,可以多次使用ORG伪指令,但地址值由小到大依序排列,不容许空间重叠。字节数据定义伪指令DB格式:[标号:]DB字节数据表。作用:从标号指定的地址单元开始,在ROM中储存8位字节数据。将字节数据按照从左到右的次序依次储存在指定的储存单元中,一个数据占一个储存单元。字节数据表可以是字符、十补码、十六补码、二补码等。该伪指令常用于储存数据表格。字数据定义伪指令DW格式为:[标号:]DW字数据表。作用:从标号指定的地址单元开始,在ROM中定义字数据。将数据按照从左到右的次序依次储存在指定的储存单元中。应非常注意:16位的二补码数,高8位储存在低地址单元,低8位储存在高地址单元。诸如:ORG1000HSEGHSEG1:DB5353H,78HSEGHSEG2:DB„DAY‟END(1000H)=53H(1001H)=78H(1002H)=32H;32H为“2”的ASCII码(1003H)=44H;44H为“D”的ASCII码(1004H)=41H;41H为“A”的ASCII码(1005H)=59H;59H为“Y”的ASCII码数据地址形参伪指令DATA格式为:符号名DATA数或表达式用DATA定义的标示符可以先使用后定义,而EQU定义的必须先定义后使用。
用EQU可以把一个汇编符号赋给字符名,而DATA只能把数据赋给字符名。MAINDATA20002000H汇编后MAIN的值为2000H。形参伪指令EQU格式为:符号名EQU表达式。作用:将表达式的值或特定的某个汇编符号定义为一个指定的符号名。SGEQUR0R0等值DEEQU4040HH404040H等值MOV(A)(R0)MOVR7,#DE位地址符号定义伪指令BIT格式为:符号名BIT位地址表达式其中,位地址表达式可以是绝对地址,也可以是符号地址。MNBITP1.7G5BIT02H汇编后,位地址P1.7、02H分宫词给变量MN和G5。10汇编结束伪指令END114.2目前,大多数用户依然使用汇编语言进行单片机应用系统的软件设计,本章将介绍MCS-51单片机汇编语言的程序设计方式。单片机汇编语言程序设计的基本步骤如下:剖析问题具象出描述问题的物理模型。熟悉并了解汇编语言指令的基本格式和主要特征,明晰被控对象对软件的要求,设计出算法等。确定解决问题的算法。算法是进行程序设计的根据,它决定程序的正确性和程序的质量。同一物理模型,可以有不同的算法。12画出程序流程图。编撰较复杂的程序,画出程序流程图是非常必要的。
程序流程图统称为程序框图,是按照控制流程设计的,它可以使程序清晰,结构合理,以便调试分配显存工作区及有关端口地址。分配显存工作区,要按照程序区、数据区、暂存区、堆栈区等预计所占空间大小,对片内外储存区进行合理分配并确定每位区域的首地址,易于编程使用。固化程序。134.2.1汇编语言源程序设计一般采用结构化设计方式,任何复杂的程序都可分解为:子程序部份144.2.2【例】【功能】求变量X()的平方。【入口参数】X值储存在片内RAM的30H单元【出口参数】X2值储存在片内RAM的31H单元程序框图如图4.1所示。ORG1000HSTART:MOVDPTR,#2000HMOVA,30HMOVCA,@A+DPTRMOV31H,ASJMPORG2000HTABLE:DB00,01,04,09,16,25END特性:从第一条指令开始次序执行,直至最后一条指令图4.1次序程序流程图154.2.3单分支(b)多分支图4.2分支程序流程图164.2.3【功能】某装置有手动/自动控制按钮,按钮状态由P1.0口输入;高电平为手动控制,低电平为自动控制JBP1.0,AUTOLJMPCYLJMPCY174.2.3多分支包括通常多分支和散转多分支。
【功能】x、y均为8位二补码数,求解:【入口参数】(R0)=x。【出口参数】(R1)=y。184.2.3START:CJNER0,#00H,SUL1;判定R0是否为0,为0转SUL1MOVR1,#00HSJMPSUL2SUL1:JCNEG;大于0转NEGMOVR1,#01HSJMPSUL2NEGMOVR1,#0FFHSUL2:RET194.2.3散转多分支程序按照某种输入或运算的结果转向各个处理程序称为散转多分支,即散转程序。借助转移指令表实现转移将转移到不同程序的转移指令列成表格,判定条件后查表,执行表中的转移指令。【功能】某菜单有9项。依据输入数码转去执行相应的子程序。即输入“1”,执行子程序1;输入“2”,执行子程序2;依次类推。204.2.3【分析】用直接转移指令组成一个转移表,之后把菜单号读入累加器(A),转移表首地址装入DPTR中,借助JMP@A+DPTR实现散转。【入口参数】(R3)=存输入按键码1~9。【出口参数】转移到相应的子程序入口。ORG0030HKEY_JMP:MOVDPTR,#TAB1;子程序入口首地址送DPTRMOVR3;把按键输入缓冲区内容送累加器(A)DEC;因为输入数码为1~9,因而需减1MOV#03H214.2.3MULAB;因为长跳转指令LJMP占用3B,;各子程序入口地址相距3BJMP@A+DPTR;依据输入码,执行相应的子程序ORG2000H;程序入口地址表TAB1:LJMPNO1LJMPNO2LJMPNO3LJMPNO4LJMPNO5LJMPNO6LJMPNO7LJMPNO8LJMPNO9