计算机常用的编程语言程序设计是为解决某个问题而用计算机所能接.ppt_第1页
计算机常用的编程语言程序设计是为解决某个问题而用计算机所能接.ppt_第2页
计算机常用的编程语言程序设计是为解决某个问题而用计算机所能接.ppt_第3页
计算机常用的编程语言程序设计是为解决某个问题而用计算机所能接.ppt_第4页
计算机常用的编程语言程序设计是为解决某个问题而用计算机所能接.ppt_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

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

文档简介

计算机常用的编程语言 程序设计是为解决某个问题而用计算机所能接受的语言描述其操作过程的语句序列。除了汇编语言外,单片机程序设计语言还有两类:机器语言和高级语言。 机器语言(Machine Language)是指直接用机器码编写程序、能够为计算机直接执行的机器级语言。机器码是一串由二进制代码“0”和“1”组成的二进制数据,其执行速度快,但是可读性极差。机器语言一般只在简单的开发装置中使用,程序的设计、输入、修改和调试都很麻烦,在实训实验中直接固化或输入的程序都是机器语言程序。,第4章 汇编语言程序设计 4.1 概 述,汇编语言(Assembly Language)是指用指令助记符代替机器码的编程语言。汇编语言程序结构简单,执行速度快,程序易优化,编译后占用存储空间小,是单片机应用系统开发中最常用的程序设计语言。 汇编语言的缺点是可读性比较差,只有熟悉单片机的指令系统,并具有一定的程序设计经验,才能研制出功能复杂的应用程序。 高级语言(High-Level Language)是在汇编语言的基础上用自然语言的语句来编写程序,例如PL/M-51、Franklin C51、MBASIC 51等,程序可读性强,通用性好,适用于不熟悉单片机指令系统的的用户。 高级语言编写程序的缺点是实时性不高,结构不紧凑,编译后占用存储空间比较大,这一点在存储器有限的单片机应用系统中没有优势。,汇编语言程序的伪指令,伪指令:控制汇编程序的指令,但不是控制单片机操作的指令,没有机器码。 1. 定位伪指令ORG 格式: ORG XXXX 或 标号地址。 作用:说明下面紧接的程序段或数据段存放的起始地址。 例如:ORG 1000H;指示后面的程序或数据块以 1000H为起始地址连续存放。 若省略ORG伪指令,则该程序段从ROM中0000H单元开始存放。 在一个源程序中,可以多次使用ORG伪指令,但地址值由小到大依序排列,不允许空间重叠。,汇编语言程序的伪指令,2. 字节数据定义伪指令 DB 格式:标号: DB 字节数据表。 作用:从标号指定的地址单元开始,在ROM中存放8位字节数据。 将字节数据根据从左到右的顺序依次存放在指定的存储单元中,一个数据占一个存储单元。 字节数据表可以是字符、十进制、十六进制、二进制等。该伪指令常用于存放数据表格。,汇编语言程序的伪指令,3. 字数据定义伪指令 DW 格式为:标号: DW 字数据表。 作用:从标号指定的地址单元开始,在ROM中定义字数据。 将数据根据从左到右的顺序依次存放在指定的存储单元中。 应特别注意:16位的二进制数,高8位存放在低地址单元,低8位存放在高地址单元。,汇编语言程序的伪指令,例如: ORG 1000H SEG1: DB 53H,78H , “2” SEG2: 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码 如果操作数为数值,其取值范围应为00HFFH; 若为字符串,其长度应限制在80个字符内。,汇编语言程序的伪指令,4. 数据地址赋值伪指令 DATA 格式为:符号名 DATA 数或表达式 DATA伪指令与EQU类似。但有些差别: (1) 用DATA定义的标识符可以先使用后定义, 而EQU定义的必须先定义后使用。 (2) 用EQU可以把一个汇编符号赋给字符名, 而DATA只能把数据赋给字符名。 (3) DATA可以把一个可求值表达式赋给字符名。 【例】 MAIN DATA 2000H 汇编后MAIN的值为2000H。,汇编语言程序的伪指令,5. 赋值伪指令 EQU 格式为:符号名 EQU 表达式。 作用:将表达式的值或特定的某个汇编符号定义为一个指定的符号名。 【例】 SG EQU R0 ;SG与R0等值 DE EQU 40H ;DE与40H等值 MOV A, SG ;(A)(R0) MOV R7, #DE ;(R7)40H,汇编语言程序的伪指令,6. 位地址符号定义伪指令 BIT 格式为:符号名 BIT 位地址表达式 作用:将位地址赋给指定的符号名。 其中,位地址表达式可以是绝对地址,也可以是符号地址。 【例】 MN BIT P1.7 G5 BIT 02H 汇编后,位地址P1.7、02H分别赋给变量MN和G5。,汇编语言程序的伪指令,7. 汇编结束伪指令 END 格式:END。 作用:结束汇编。 汇编程序遇到END伪指令后即结束汇编。 处于END之后的程序,汇编程序软件将不处理。,4.2 程序设计步骤与方法 目前,大多数用户仍然使用汇编语言进行单片机应用系统的软件设计,本章将介绍MCS-51单片机汇编语言的程序设计方法。 单片机汇编语言程序设计的基本步骤如下: (1) 分析问题抽象出描述问题的数学模型。熟悉并了解汇编语言指令的基本格式和主要特点,明确被控对象对软件的要求,设计出算法等。 (2) 确定解决问题的算法。算法是进行程序设计的依据,它决定程序的正确性和程序的质量。 同一数学模型,可以有不同的算法。,(3) 画出程序流程图。编写较复杂的程序,画出程序流程图是十分必要的。程序流程图也称为程序框图,是根据控制流程设计的,它可以使程序清晰,结构合理,便于调试 (4) 分配内存工作区及有关端口地址。分配内存工作区,要根据程序区、数据区、暂存区、堆栈区等预计所占空间大小,对片内外存储区进行合理分配并确定每个区域的首地址,便于编程使用。 (5) 编制汇编源程序。 (6) 仿真、调试程序。 (7) 固化程序。,4.2.1 程序设计步骤与方法,汇编语言源程序设计通常采用结构化设计方法, 任何复杂的程序都可分解为: 顺序结构部分 分支结构部分 循环结构部分 子程序部分,4.2.2 顺序程序设计,【例】【功能】求变量X()的平方。 【入口参数】X值存放在片内RAM的30H单元 【出口参数】X2值存放在片内RAM的31H单元 程序框图如图4.1所示。 ORG 1000H START:MOV DPTR,#2000H MOV A,30H MOVC A,A+DPTR MOV 31H,A SJMP $ ORG 2000H TABLE:DB 00,01,04,09,16,25 END 特点:从第一条指令开始顺序执行,直到最后一条指令,图4.1 顺序程序流程图,4.2.3 分支程序设计,分支:根据某种标志改变程序执行的顺序。 一般分为单分支、多分支。 分支流程图如图4.2所示。,(a) 单分支 (b)多分支 图4.2 分支程序流程图,4.2.3 分支程序设计,1. 单分支 【例】 【功能】某装置有自动/手动控制按键,按键状态由P1.0口输入;高电平为自动控制,低电平为手动控制 【入口参数】P1.0 CY: JB P1.0,AUTO HC: LJMP CY AUTO: LJMP CY,4.2.3 分支程序设计,2. 多分支 包括一般多分支和散转多分支。 1) 一般多分支 【例】 【功能】x、y均为8位二进制数,求解: 【入口参数】(R0)=x。 【出口参数】(R1)=y。,4.2.3 分支程序设计,START: CJNE R0, #00H, SUL1 ;判断R0是否为0,为0转SUL1 MOV R1, #00H SJMP SUL2 SUL1: JC NEG ;小于0转NEG MOV R1, #01H SJMP SUL2 NEG : MOV R1, #0FFH SUL2: RET,4.2.3 分支程序设计,2) 散转多分支程序 根据某种输入或运算的结果转向各个处理程序称为散转多分支,即散转程序。 (1) 利用转移指令表实现转移 将转移到不同程序的转移指令列成表格,判断条件后查表,执行表中的转移指令。 【例】 【功能】某菜单有9项。根据输入数码转去执行相应的子程序。即输入“1”,执行子程序1;输入“2”,执行子程序2;依次类推。,4.2.3 分支程序设计,【分析】用直接转移指令组成一个转移表,然后把菜单号读入累加器(A),转移表首地址放入DPTR中,利用JMP A+DPTR实现散转。 【入口参数】(R3)=存输入键盘码19。 【出口参数】转移到相应的子程序入口。 ORG 0030H KEY_JMP:MOV DPTR, #TAB1;子程序入口首地址送DPTR MOV A, R3;把键盘输入缓冲区内容送累加器(A) DEC A ;由于输入数码为19,因此需减1 MOV B, #03H,4.2.3 分支程序设计,MUL AB ;由于长跳转指令LJMP占用3B, ;各子程序入口地址相距3B JMP A+DPTR ;根据输入码,执行相应的子程序 ORG 2000H ;程序入口地址表 TAB1: LJMP NO1 LJMP NO2 LJMP NO3 LJMP NO4 LJMP NO5 LJMP NO6 LJMP NO7 LJMP NO8 LJMP NO9 END,4.2.3 分支程序设计,(2) 利用转向地址表实现转移 这种方法将转移地址列成表格,将表格的内容作为转移的目标地址。 【例】 【功能】根据R3(0n)的内容转向对应的程序;处理程序的入口符号地址分别为PR0PRn(n256) 【分析】 将PR0 PRn入口地址列在表格中,每一项占两个单元; PRn在表中的偏移量为2n,因此将R3的内容乘“2”即得PRn在表中的偏移地址; 从偏移地址2n和2n+1两个单元分别取出PRn的高8位地址和低8位地址送DPTR寄存器,用JMP A+DPTR指令(A先清零)即转移到PRn入口执行。,4.2.3 分支程序设计,【入口参数】(R3)=0n 转移。 【出口参数】转移到相应的子程序入口。 PR0 EQU 0110H PR1 EQU 0220H PR2 EQU 0330H ORG 0030H KEY_JMP: MOV DPTR, #TAB MOV A,R3 ADD A,R3 ;(A)(R3)*2 JNC NADD INC DPH ;(R3*2)256,4.2.3 分支程序设计,NADD: MOV R3,A MOVC A, A+DPTR XCH A, R3 ;转移地址高8位 INC A MOVC A, A+DPTR MOV DPL,A ;转移地址低8位 MOV DPH, R3 CLR A JMP A+DPTR TAB: DW PR0,PR1,PR2, PRn PR0: 处理程序0 PR1: 处理程序1 PRn: 处理程序n END,4.2.3 分支程序设计,(3) 利用地址偏移量表实现散转 这种方法将转移目标地址与表首地址差列表,作为转移目标地址。 【例】 【功能】有5个按键 0,1,2,3,4,根据按下的键转向不同的处理程序,分别为PR0,PR1,PR2,PR3,PR4。 【分析】汇编时,利用了伪指令的数学计算功能,标首地址加上处理程序与标首地址差转到处理程序。 【入口参数】(B)=转向程序号(键盘编码)。 【出口参数】转移到相应的子程序入口。,4.2.3 分支程序设计,ORG 0030H KEY_JMP: MOV A, B MOV DPTR, #TAB MOVC A,A+DPTR JMP A+DPTR TAB: DB PR0-TAB DB PR1-TAB DB PR2-TAB DB PR3-TAB DB PR4-TAB PR0: 处理程序0 PR1: 处理程序1 PR2: 处理程序2 PR3: 处理程序3 PR4: 处理程序4 END,在单片机汇编语言程序设计中,查表程序的应用非常广泛,在LED显示程序和键盘接口程序设计中都用到了查表程序段。 【例】 在程序中定义一个09的平方表,利用查表指令找出累加器A=05H的平方值。 (1) 题意分析。 所谓表格是指在程序中定义的一串有序的常数,如平方表、字型码表、键码表等。因为程序一般都是固化在程序存储器(通常是只读存储器ROM类型)中,因此可以说表格是预先定义在程序的数据区中,然后和程序一起固化在ROM中的一串常数。,4.2.4 查表程序,查表程序的关键是表格的定义和如何实现查表。 (2) 汇编语言源程序。 ORG 0000H MOV DPTR,#TABLE ;表首地址DPTR(数据指针) MOV A,#05 ;05A MOVC A,A+DPTR ;查表指令,25A,A=19H SJMP $ ;程序暂停 TABLE: DB 0,1,4,9,16,25,36,49,64,81;定义09平方表 END,(3) 程序说明。 从程序存储器中读数据时,只能先读到累加器A中,然后再送到题目要求的地方。单片机提供了两条专门用于查表操作的查表指令: MOVC A,A+DPTR ;(A+DPTR)A MOVC A,A+PC ;PC+1PC,(A+PC)A DPTR为数据指针,一般用于存放表首地址。 用指令MOVC A,A+PC 实现查找平方表的源程序如下:,ORG 0000H MOV A,#05 ;05A ADD A,#02 ;修正累加器A的值,修正值为查表指令距离表格首地址 MOVC A,A+PC;25A SJMP $ TABLE: DB 0,1,4,9,16,25,36,49,64,81;定 ;义09平方表 END,4.2.5 循环程序设计,需要重复执行某一程序时可使用循环程序结构。 循环程序分为先循环后判断和先判断后循环两种循环体方式。 循环程序一般包含以下4部分。 (1) 设置循环初值:设置用于循环过程工作寄存器单元的初值。 (2) 循环体:循环程序功能部分。 (3) 循环记录:记录循环过程,监控循环完成情况,为循环判断准备。 (4) 循环控制:判断循环完成情况,满足条件作相应的处理。不满足继续执行。,4.2.5 循环程序设计,图4.3 循环程序流程图,4.2.5 循环程序设计,【例】 【功能】n个单字节数相加,和为双字节,存放在(R3、R4)中。 【入口参数】单字节数Xi存放在从40H开始的RAM单元中,n放在R2中。(R2作为控制变量,R0作为变址单元 ) 【出口参数】和存放在(R3、R4)中。 ADD1: MOV R3, #00H MOV R4, #00H MOV R2, #n MOV R0, #40H LOOP: MOV A, R4 ;取部分和低位 ADD A, R0 ;与Xi相加 MOV R4, A INC R0 ;地址加1 CLR A ADDC A, R3 ;低位字节向高位字节进位 MOV R3, A DJNZ R2, LOOP ;未加完继续重复,4.2.5 循环程序设计,【例】 【功能】设计一个延时10ms的程序。 【分析】延时程序的延时主要与所用晶振和延时程序中的循环次数 有关。已知AT89C51单片机使用的晶振为12MHz,则可知一个机器周期为1。 【入口参数】(R0)=毫秒数,(R1)=1ms延时预定值。 【出口参数】定时到,退出程序。 ORG 2000H 指令机器周期数 1 MOV R0 , #0AH ;毫秒数R0 1 2 DL2: MOV R1 , #MT ;1ms延时值R1 1 3 DL1: NOP 1 4 NOP 1 5 DJNZ R1 , DL1 ;1ms延时循环 2 6 DJNZ R0 , DL2 ;10ms延时循环 2,4.2.5 循环程序设计,该延时程序是一个双重循环程序,内循环1ms延时的预定值MT需计算: (1+1+2)1MT=1000() MT=250=0FAH 用0FAH代替程序中的MT,则该程序执行后,能实现10ms的延时。 若考虑第1、2、6行延时参数配置指令的时间因素,则该段延时程序的精确延时时间计算式为: 11+(1+2)110+(1+1+2)125010=10.031ms,4.2.6 逻辑操作程序设计,计算所的智能作用体现在它具有判断能力,逻辑判断的实质是对逻辑关系进行程序模拟。MCS-51单片机具有丰富的逻辑操作和位操作指令,为程序来 模拟原来由硬件所能实现的逻辑功能提供了方便。 【例】设P1口的P1.0P1.3为准备就绪信号输入端,当该4位全为1时,说明各项工作已准备好,单片机可顺序执行主程序,否则循环等待。试编写程序。 程序如下: ORG 2000H LOOP: MOV A,P1 ;P1内容送A ANL A,#0FH ; 屏蔽高4位 CJNE A,#0FH,LOOP ;低4位不全为1,等待循环 MAIN: .,4.2.7 子程序设计,按功能分为中断子程序和功能子程序。 调用子程序时要注意: (1)中断子程序调用由单片机自身产生,执行RETI指令 返回;功能子程序调用由主程序执行LCALL或ACALL 指令产生,执行RET指令返回。 (2)在子程序中,应包含有现场保护和现场恢复两部分。 (3)主程序和子程序约定好交换数据的地址单元或存储 器,其为主、子程序共有部分。 (4)子程序可以对另外的子程序调用,称为子程序嵌套。,4.2.7 子程序设计,1. 运算类子程序 【例】 【功能】多字节无符号数的加法。 【分析】多字节运算一般是按从低字节到高字节的顺序依次执行的。 【入口参数】DATA1=被加数的低位地址。 DATA2=加数的低位地址。 N字节相加。 【出口参数】DATA2=和数低位地址。,4.2.7 子程序设计,MADD: MOV R0,#DATA1 ;置被加数 MOV R1, #DATA2 ;置加数 MOV R7,#N ;置字节数 CLR C ;清进位位 LOOP: MOV A,R0 ADDC A,R1 ;求和 MOV R1,A ;存结果 INC R0 ;修改指针 INC R1 DJNZ R7,LOOP ;循环判断 RET,4.2.7 子程序设计,【例】 【功能】多字节无符号数的减法。 【入口参数】DATA1=被减数的低位地址, DATA2=减数的低位地址,N字节相减。 【出口参数】DATA2=差数低位地址。,4.2.7 子程序设计,MSUB:MOV R0,#DATA1 ;置被减数 MOV R1,#DATA2 ;置减数 MOV R7,#N ;置字节数 CLR C ;清进位位 LOOP:MOV A,R0 SUBB A,R1 ;求差 MOV R1,A ;存结果 INC R0 ;修改指针 INC R1 DJNZ R7,LOOP ;循环判断 RET,4.2.7 子程序设计,【例】 【功能】双字节无符号数的乘法。 【分析】8051指令系统中只有单字节乘法指令,因此,双字节相乘需分解为4次单字节相乘。设双字节的无符号被乘数存放在R3、R2中,乘数存放在R5、R4中,R0指向积的高位。 【入口参数】R3(高)R2(低),被乘数; R5(高)R4(低),乘数。 【出口参数】(R0)积的高位字节地址指针。,4.2.7 子程序设计,图4.4 双字节无符号乘法算法与流程图,4.2.7 子程序设计,MULTB: MOV R7, #04 ;结果单元清0 LOOP : MOV R0,#00H DJNZ R7,LOOP MOV A, R2 ;取被乘数低位字节 MOV B, R4 ;取乘数低位字节R4 MUL AB ;R4R2 ACALL RADD ;调用乘积相加子程序 MOV A, R2 ;取被乘数低位字节 R2 MOV B, R5 ;取乘数高位字节R5 MUL AB ;R5R2 DEC R0 ;积字节指针减1 ACALL RADD ;调用乘积相加子程序 MOV A,R4 MOV B,R3 MUL AB ;R4R3 DEC R0 DEC R0 ACALL RADD MOV A,R5,4.2.7 子程序设计,MOV B,R3 MUL AB ;R5R3 DEC R0 ACALL RADD DEC R0 RET RADD:ADD A,R0 ;累加子程序 MOV R0,A MOV A,B INC R0 ADDC A,R0 MOV R0,A INC R0 MOV A,R0 ADDC A,#00H ;加进位 MOV R0,A RET,4.2.7 子程序设计,2. 码型转换程序 单片机能识别和处理的是二进制码,而输入/输出设备(如LED显示器、微型打印机等)则常使用ASCII码或BCD码。为此,在单片机应用系统中经常需要通过程序进行二进制码与BCD码或ASCII码的相互转换 。,4.2.7 子程序设计,【例】 【功能】将1位十六进制数(即4位二进制数)转换成相 应的ASCII码。 【分析】由ASCII编码表可知转换方法为: 1位十六进制数小于10,则加上30H, 若大于10(或等于10),则加上37H。 【入口参数】(R0)=1位十六进制数。 【出口参数】(

温馨提示

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

评论

0/150

提交评论