80C51单片机存储器结构片内数据存储器(RAM)的三个存储区域是如何划分的?

这样的个自扩展的ROM是单片机上自带的吗?还是自己另需,80c51单片机〖扩展〗自片外ROM_编程_探探数码问答网
这样的个自扩展的ROM是单片机上自带的吗?还是自己另需,80c51单片机〖扩展〗自片外ROM
编辑: 探探数码问答网 &&&来源:用户发布&&&发布时间:&&&查看次数:27
由这样的个扩展的ROM是单片机上自带的吗?还是自己另需购买的?80c51单片机由〖扩展〗片外ROM
【探讨解答】
80c51单片机的片内,片外存储器如何选择
80c51单片机的片内、片外存储器的选择:80C51单片机的EA’引脚为访问内部和外部程序存储器的选择端。程序存储器ROM:其内部容量4KB,指令可直接访问;当容量不足时,可扩展到片外ROM,此时容量可达到64KB,但此时要注意设置EA’=0;相反,当选择片...
80C51单片机,ROM问题,
80C51的存储器有片内RAM、片外RAM 和 ROM 三个空间。 片内RAM: 地址范围是00H到7FH 也就是128(52系列延伸到FFH)也就是256。 其中00H到1FH,共32字节,分成四个工作寄存器区,每区有寄存器 R0~R7。 对此区域,可以使用 R0~R7 来操作,但是,当...
MCS51片外扩展存储器时,ROM和RAM的最大容量分别是...
MCS51是指由INTEL生产的一系列单片机的总称,这一系列单片机包括了好些品种,如****,8752等,不知道你问的是哪个机型,51单片机rom和ram最大是64kb吧
画出在51单片机上同时扩展RAM(8K)芯片6264和ROM...
给出扩展芯片的地址范围,并给出将RAM和ROM存储器内容清零的keil51程序,...
更多相关内容
本站内容来自网友发布,本站无法保证其部分内容的正确性,请用户一定仔细辨别。
[] &&[联系QQ:885&971&98] &
沪ICP备号&当前位置: >>
80c51单片机第四章
概述 ?4.2 顺序结构程序 ?4.3 分支结构程序 ?4.4 循环结构程序 ?4.5 子程序结构 ?4.6 综合程序举例 ?4.7 本章小节 ?4.8 思考与练习题?4.1 第四章汇编语言程序设计主要内容:本章从程序结构和实用角度出发,通过典型的应用实例介绍汇编语言程序的基本结构及模块 化程序设计,使学生进一步理解和掌握51系列单片机的 指令系统,并掌握汇编语言程序设计的基本语言和技巧。 要求: 1、熟练运用指令系统,掌握循环程序、分支程序 和搜索程序的设计方法; 2、熟练运用指令系统,掌握基本的运算程序设计 方法; 第四章汇编语言程序设计3、熟练运用指令系统,掌握数制和码制转换程序的设计方法; 4、熟练掌握子程序结构,实现模块化程序设计; 5、深刻理解软件、硬件的相互作用,不断提高实 际问题处理程序编写能力。 4.1 概述?4.1 概述 程序设计:为了解决某一个问题,将所设计应用 系统(单片机类型)的指令按一定顺序组合在一起。即 用计算机所能接受的语言把解决问题的步骤描述出来。 单片机汇编程序结构与通用微机汇编程序结构略 有不同,原因是:1、一般没有可以直接利用的监控程序,所有程序均要自己编写。 4.1 概述2、没有像X86汇编语言程序那样,可直接调用系统提供的中断功能(如:BIOS中断、DOS中断)或 Windows的API函数完成特定操作,即所有子程序(如键 盘监控子程序、显示驱动程序、中断服务程序等)均需 要自己编写。 4.1 概述一、汇编语言伪指令伪指令 汇编程序某些指令在汇编时并不产生目标代码, 不影响程序的执行,不是CPU能执行的指令,只提供一 些汇编控制信息的指令。 常用的伪指令: (1)设Z起始地址ORG 格式: ORG nn 1、ORG:表明为后续源程序经汇编后的目标程序 安排存放位Z,nn则给出了存放的起始地址值; 4.1 概述2、ORG总是出现在每段源程序或数据块的开始;3、在一个源程序中,可以多次使用ORG规定不同 程序段的起始位Z,但定义的地址顺序应从小到大, 且不能重叠; 4、若不用ORG,则汇编将从0000H单元开始存放目 标程序; 例4.1 ORG 3000H ;表示后续的目标程序代码从 3000H单元开始存放。 MOV A,30H 4.1 概述(2)定义字节DB格式: 标号:DB 字节数据项表 1、标号区段可有可无,项表指中间用逗号分开的 字节、数、字符串或用引号括起来的ASCⅡ码字符串 (一个字符用ASCⅡ码表示,就相当于一个字节)。 2、功能:把项表的数据存入从标号开始的连续单 元中。 例4.2 ORG 2000H SEG1:DB 35H,78H 4.1 概述SEG2:DB ‘DAY’END则 (2000H)=35H,(2001H)=78H,(2002H)=44H, (2003H)=41H,(2004H)=59H注意:项表中若为数值,其取值范围应为00H~ FFH,若为字符串,其长度应限制在80个字符内。 (3)定义字DW 格式: 标号:DW 字节数据项表DW的基本含义与DB相同,不同的是DW定义16位数 据,常用来建立地址表。存放时一个字需两个单元, 高8位先存放,低8位后存放。 4.1 概述例4.3 ORG 8000H HETAB:DW 7234H,8AH,10 汇编后:(8000H)=72H,(8001H)=34H, (8002H)=00H,(8003H)=8AH,(8004H)=00H, (8005H)=0AH (4)数据地址赋值DATA 格式为: 字符名称 DATA 数据或表达式 把数据地址或代码地址赋予字符名称。常用于定义数据地址,它可以先使用后定义(因为DATA定义的字 符名称作为标号登记在符号表中,而EQU没定义),这 点与EQU不同。表达式应是可求值的。 4.1 概述例4.4ORG8000HINDEXJ DATA LJMP INDEXJ END 等价于 ORG LJMP END H8096H 4.1 概述(5)赋值(等值)EQU格式: 标号 EQU 项或表达式 功能:将语句操作数的值赋于本语句的标号,用EQU 赋过值的标号名可以用作数据地址、代码地址、位地址 或是一个立即数,它可以是8位、也可以是16位。注意: 1、在同一程序中,用EQU伪指令对标号赋值后,该 标号的值在整个程序中不能再改变; 2、用EQU定义的字符须先定义后使用。 4.1 概述例4.5ORG 8000H AA EQU R6 ;AA与R6等值 MOV A,AA ;(R6)的值送入A中 (6)位地址符号命令BIT 格式: 字符名称 BIT 位地址 功能:给一个可位寻址的位单元起一个名字。用 BIT定义过的位单元可用名字使用。 注意:名字必须是以字母开头的字母数字串,它 必须是事先未定义过的。 4.1 概述例4.6A1BITP1.0A2 BIT 02H (7)源程序结束END 格式:标号:END 表达式 1、标号和表达式是可有可无的。 2、END是一个结束标志,在一个程序中只允许出 现一个END语句,而且它必须放在整个程序的最后面。 (8)定义存储空间DS 格式: 标号:DS 表达式 1、由标号指定单元开始,定义一个存储区,以备 源程序使用。 4.1 概述2、存储区内预留的存储单元数由数据或字符表达式的值决定。 例4.7 ORG 8000H TEMP:DS 08H DB 30H,8AH 即8000H~8007H单元保留备用,(8008H)=30H, (8009H)=8AH。 二、汇编语言程序设计的基本步骤 1、分析问题(调研),确定方案和计算方法 目的:对需要解决的问题进行分析,以求对问题有 正确的理解。 4.1 概述2、了解应用系统的硬件配Z、性能指标。 3、建立系统数学模型,确定控制算法和操作步骤。 4、编制说明要解决问题的程序框图。 画程序框图:用各种图形、符号、指向线等来说明 程序设计的过程。框图步骤写得越细致,编程时也就越 方便。 目的:把具有一定功能的各个部分有机地联系起来,可以使人们抓住程序的基本线索,对全局有完整的了解。 4.1 概述好处:(1)容易发现设计思想上的错误和矛盾,便于找出解 决问题的途径。 (2)便于把较大的程序分成若干个模块,从而分头进 行设计,最后合在一起联调。 5、按所使用计算机的指令系统,依据框图写出汇编语言 程序。 编程的三个原则:尽可能的节省数据存储单元;缩 短程序长度;减少执行时间。 4.1 概述①.合理分配存储器单元和了解I/O接口地址。②.按功能设计程序,明确各程序之间的相互关系。 ③.用注释行说明程序,便于阅读、调试和修改。 6、上机调试程序,直至完成预定功能。MCS-51 程序总体结构 MCS-51汇编语言源程序一般由主程序、完成特定操作的子程序(可能不止一个)及相应功能的中断服务程序 等部分组成。 结构如下: 4.1 概述---- 程序头( 即定义变量和等值符号)----SCL BIT P1.2 ;定义SCL位变量 SDA BIT P1.3 ;定义SDA位变量 ByteCon DATA 30H ;定义字节变量ByteCon …… ORG nnnn ;CPU复位后,第一指令机器码存放 单元地址,具体值由CPU类型决定。 例4.8 在51系列中,复位后PC=0000,因此在51系 列中,第一条指令存放在ROM的0000H单元中,即nnnn 为?0000H”。 4.1 概述LJMP Main ;一般第一条指令是跳转指令,跳到主程序入口地址,其中?Main”是主程序入口地址标号。 主程序不能直接存放在复位后PC指向的存储单元,原 因是这一区域往往是中断服务程序的入口地址,不能 覆盖,否则不能使用相应的中断功能。 例4.9 在51系列中,外部中断0的入口地址为 0003H,显然只有0000H、0001H和0002H三个单元,刚 好可以存放一条长跳转指令的机器码。 4.1 概述----- 主程序 -----ORG yyyy ;其中yyyy就是主程序代码存放区的 首地址,如0100H Main: MOV SP,#5FH ;初始化有关寄存器,如设 ZSP、选择工作寄存器组。 ;初始化中断控制寄存器等 …… ;主程序实体,具体指令由程序功能决定 LCALL SUB1 ;调用子程序1 ,其中SUB1为子程序名 …… ; 4.1 概述------- 子程序结构 --------ORG zzzz ;其中zzzz就是子程序代码存放区的 首地址,可以不用ORG指令,直接将子程序存放主程序后。 SUB1:PUSH PSW PUSH Acc ;通过PUSH指令保护子程序中用到的 有关寄存器,如Acc、PSW 等,即保护现场 …… ;子程序实体,具体指令由程序功能决定 POP Acc POP PSW ;恢复现场 RET ;子程序最后一条指令,使子程序指令运行 结束后,返回主程序断点。 4.1 概述--------- 中断服务程序结构 ----------ORG kkkk ;其中kkkk就是中断程序代码存放区的 首地址 PUSH PSW PUSH Acc ;通过PUSH指令保护中断服务程序中用 到的有关寄存器,如 Acc、PSW等,即保护现场 …… ;中断服务程序实体,具体指令由程序功能 决定 POP Acc POP PSW ;恢复现场 4.1 概述CLR TI ;清除中断标志(在51系列中,对于电平触发的外中断INT0和 INT1、串行接收及发送中断 RI、TI 等,不自动清除,需要在中断服务结束前,通过CLR指令 清除。 RETI ;中断服务程序最后一条指令,返回主程序断 点。 为了确保子程序、中断服务程序运行结束后,能够 正确返回,从断点处继续执行主程序,必须注意在子程 序以及中断服务程序中堆栈操作指令的匹配问题,否则 将无法返回。 4.1 概述例4.10 在上述子程序结构中,假设SUB1子程序入口地址为2000H,即主程序内?LCALL SUB1”指令等效于 ?LCALL 2000”。假设该指令机器码首地址为1000H,且 指令执行前,SP=5FH,则?LCALL 2000” 指令执行过程 中PC和SP内容如下: (1) PC←PC+3 ,即PC=1003H( 即断点地址 ); (2) SP←SP+1,即SP=60H,并把PC低8位压入堆栈, 于是(60H)=03; (3) SP←SP+1,即SP=61H,并把PC高8位压入堆 栈, 于是(61H)=10; 4.1 概述(4) 把 SUB1入口地址装入PC,即 PC=2000H。可见,?LCALL 2000”指令执行后,PC=2000H,已指 向子程序SUB1第一条指令所在的存储单元地址;SP=61H。 在子程序中 PUSH Acc ;执行后,SP=62H,(62H)就是Acc的当前 值,假设为XX PUSH PSW ;执行后,SP=63H,(63H)就是PSW的当 前值,假设为YY 返回前 POP PSW ;执行后,PSW←(SP),即将(63H)单元 4.1 概述中原来的PSW返回给PSW;SP←SP-1,即SP=62HPOP Acc ;执行后,ACC←(SP),即将(62H)单元中 原来的Acc返回给Acc ;SP←SP-1,即SP=61H RET ;执行后,PC高8位←(SP),即将(61H)单元内 容10H传给PC高8位,SP←SP-1,即SP=60H;PC低8位 ←(SP),即将(60H)单元内容03H传给PC;低8位,SP←SP -1,即SP=5FH 结果PC=1003H(重新装入主程序断点地址) 4.1 概述汇编语言程序按其结构可分为以下四类:(1)顺序结构; (2)分支结构; (3)循环结构; (4)子程序结构。 4.2 顺序结构程序?4.2顺序结构程序最简单的一种结构,又称简单程序。 特点: 按照程序编写的顺序依次执行,不发生任何分支 或转移。(程序走向只有一条路径。)例4.11 将两个半字节数组合成一个字节数。设内部RAM中40H、41H单元分别存放着8位二进制数, 要求将两个单元中的低半字节合并成一个字节后,存入 42H单元。 4.2 顺序结构程序分析:首先要取数送A(传送指令),分离出低4位(逻辑与 0FH),用A半字节交换送到高4位,地址加1,取另一个数 低4位数(逻辑与0FH),用或合成一个字节。 解: START:MOV R1,#40H MOV A,@R1 ANL A,#0FH ;取第一个半字节 SWAP A ;移至高4位 4.2 顺序结构程序INC R1 XCH A,@R1 ANL A,#0FH ORL A,@R1 INC R1 MOV @R1,A RET ;取第二个字节 ;取第二个半字节 ;拼字 ;存放结果例4.12 将20H单元的两个BCD码拆开并变成ASCⅡ码,存 入21H、22H单元。注意:ASCⅡ码0~9为30H~39H。 分析: 4.2 顺序结构程序&方法一&把BCD数除以10,商A余B,刚好把两个BCD码分别移到A、B的低4位,然后再各自与30H相?或?, 即变成ASCⅡ码。其程序框图如图4-1所示。 &方法二& 采用先把20H中低4位BCD码交换出来加以 转换、存放,然后再把高4位BCD码交换至低4位加以转换、 存放。其程序框图如图4-2所示。 4.2 顺序结构程序图4-1 BCD码转换为ASCII码方法一流程图解动画演示 4.2 顺序结构程序&方法一&编程:ORG MOV MOV DIV ORL MOV ORL MOV END2000H A,20H B,#0AH ;用0AH作除数 AB B,#30H ;低4位BCD码变成ASCⅡ码 22H,B A,#30H ;高4位BCD码变成ASCⅡ码 21H,A 4.2 顺序结构程序图4-2 BCD码转换为ASCII码方法二流程图解 动画演示 4.2 顺序结构程序&方法二&编程:ORG 2000H MOV R0,#22H MOV @R0,#00H MOV A,20H XCHD A,@R0 ORL 22H,#30H SWAP A ORL A,#30H MOV 21H,A END 4.3 分支结构程序?4.3分支结构程序一、分支程序设计综述 分支结构程序:根据程序要求无条件或有条件改变 程序执行的顺序,选择程序的流向。 特点:程序中含有转移类指令。 关键:正确选用转移指令。 单重分支程序:一个判断决策框,程序有两条出路。 4.3 分支结构程序影响条件影响条件 Y条件满足? N条件满足? NY处理段处理段2 处理段1 4.3 分支结构程序转移指令有3种: 1、无条件转移 程序转移方向是设计者事先安排的,与已执行程序 的结果无关,使用时只需给出正确的转移目标地址或偏 移量即可。(LJMP、AJMP 、SJMP) 2、条件转移 根据已执行程序对标志位或A或对内部RAM某位的影 响结果,决定程序的走向,形成各种分支。(JZ/JNZ、 CJNE、DJNZ、位控制转移类指令) 在编写有条件转移语句时要特别注意以下两点: (1)在使用条件转移指令形成分支前,一定要安排可 供条件转移指令进行判别的条件。 4.3 分支结构程序例如,若采用?JC rel”指令,在执行此指令前必须使用影响Cy标志的指令;若采用?CJNE A,#data,rel” 指令,在执行此指令前必须使用改变A内容的指令,以便 为测试做准备。 (2)要正确选定所用的转移条件和转移目标地址。 3、散转 它是根据某种已输入的?或?运算的结果,使程序 转向各个处理程序中去。 操作:把16位DPTR的内容与?或?运算的结果与在A 中的8位无符号数相加,形成地址,装入PC,即散转的目 的地址。其操作结果不影响A和DPTR。(JMP) 4.3 分支结构程序二、无条件/条件转移程序分支程序中最常见的一类。其中,条件转移类程序 编写较容易出错,编写时需要确定转移条件。 例4.13 两个无符号数比较大小。 解 设外部RAM存储单元ST1和ST2中存放两个不带符 号的二进制数,找出其中的大数存入ST3单元中。 4.3 分支结构程序图4-3 两个无符号数比较大小程序框图动画演示 4.3 分支结构程序解:ORG 8000H ST1 EQU 8040H START:CLR C ;进位位清0 MOV DPTR,#ST1 ;读数据指针 MOVX A,@DPTR ;取第一个数 MOV R2,A ;暂存R2 INC DPTR MOVX A,@DPTR ;取第二个数 SUBB A,R2 ;两数比较 JNC BIG1 ;若Cy=0,则转BIG1(第二个数大) 4.3 分支结构程序XCH A,R2 ;第一个数大BIG0:INC DPTR MOVX @DPTR,A ;存大数 RET BIG1:MOVX A,@DPTR ;第二个数大 SJMP BIG0 END 上面程序中,应用带借位的减法指令SUBB比较两数 的大小。执行指令前,应先把进位位清?0”。执行JNC指 令后形成分支,BIG1为标号地址,表示rel。注意:这里 假设存放数据的地址是连续的,如果不连续,如何编程? 4.3 分支结构程序例4.14 设5AH单元中有一变量X,请编写计算下列函数式 的程序,结果存入5BH单元。 4.3 分支结构程序图4-4 例4.6程序流程图动画演示 4.3 分支结构程序解:根据题意,首先计算X2(使用乘法)并暂存于R1中,因为X2最大值为225,可只用一个寄存器,然后根据 X值的范围,决定Y的值。R0作中间寄存器。 编程: ORG 2000H MOV A,5AH MOV B,A MUL AB ;A←X2 MOV R1,A MOV A,5AH ;重新把X装入A CJNE A,#10,L1 4.3 分支结构程序L1:JC L2;C=1,X<10转L2MOV R0,#41 ;先假设X>15 CJNE A,#10H,L3 ;与16比较 L3:JNC L4 ; C=0,X>15转L4 MOV A,R1 ADD A,#8 ;10≤X≤15,Y=X2+8 MOV R0,A SJMP L4 L2:MOV A,R1 CLR C SUBB A,#01 ;X<10,Y=X2-1 4.3 分支结构程序MOV R0,A L4:MOV 5BH,R0 ;存结果 SJMP $ END 由于本题的具体情况,在判别(A)<10和(A)>15时 采用的是?CJNE”和?JC”以及?CJNE”和?JNC”两条指令 相结合的方法。 条件分支程序与简单程序的区别在于:分支程序存 在两个或两个以上的结果。要根据给定的条件进行判断, 以得到某一个结果。这样,就要用到比较命令、测试指 令以及无条件/条件转移指令。条件分支程序设计 的技 巧,就在于正确而巧妙地使用这些命令。 4.3 分支结构程序例题:求符号函数的值。已知片内RAM的40H单元内有一 自变量X,编制程序按如下条件求函数Y的值,并将其存 入片内RAM的41H单元中。 1 X&0 Y= 0 X=0 -1 X&0解:此题有三个条件,所以有三个分支程 序。这是一个三分支归一的条件转移问题。 X是有符号数,判断符号位是0还是1可 利用JB或JNB指令。判断X是否等于0,则 直接可以使用A的判0指令。 程序流程图如右图所示。 4.3 分支结构程序ORG START: MOV JZ1000H A, 40H COMP ; 将X送入A中 ; 若A为0,转至COMP处JNB ACC.7, POST ; 若A第7位不为1(X为正数),则程序 转到POST处,否则(X为负数)程序往下执行 MOV SJMP POST: MOV COMP: MOV SJMP END A, #0FFH COMP A, #01H 41H, A $ ; 将?1(补码)送入A中 ; 程序转到COMP处 ; 将+1送入A中 ; 结果存入Y ; 程序执行完,?原地踏步? 4.3 分支结构程序三、散转程序设计散转程序:一种并行分支程序(多分支程序),它是 根据某种输入或运算结果,分别转向各个处理程序。转 移的地址最多为256个。其结构如图下所示。 4.3 分支结构程序散转程序设计采用下面两种方法:(JMP @A+DPTR)(1)DPTR固定,根据A的内容,程序转入相应的分支 程序中去。 (2)A清?0”,根据DPTR的值,决定程序转向目的地 址。DPTR的值可用查表或其他方法获得。 1、采用转移指令表 在许多应用中,需要根据某标志单元的内容(输入 或运算结果)0,1,2,…,n,分别转向操作程序0、操 作程序1、操作程序2、…、操作程序n。 4.3 分支结构程序解决步骤:(1)可先用?AJMP”或?LJMP”指令按序组成一个转移表; (2)将转移表首地址装入DPTR中;(3)将标志单元的内容装入A经运算后作为变址值; (4)执行?JMP @A+DPTR”指令实现散转。 例4.15 128种分支转移程序。根据入口条件转移到128个 目的地址。 4.3 分支结构程序图4-5 分支转移程序框图动画演示 4.3 分支结构程序解:入口:(R3)=转移目的地址的序号00H~7FH。 出口:转移到相对子程序入口。 编程: JMP-128:MOV A,R3 RL A ;A←(A)×2 MOV DPTR,#JMPTAB JMP @A+DPTR JMPTAB:AJMP ROUT00 ;128个子程序首址 ┆ ┆ ┆ ┆ AJMP ROUT7F 4.3 分支结构程序此程序要求128个转移目的地址(ROUT00~ROUT7F)必须驻留在与绝对转移指令AJMP同一个2KB存储区内。RL指 令对变址部分乘以2,是由于每条AJMP指令占用2个字节。 例4.16 根据R6R7中数(小于4FFFH)转向对应的操作 程序。 分析:偏移量R6R7占两个字节,因此转移表中的转 移指令用LJMP,它为3字节指令,变址时要高、低字节均 要乘3,低8位可能会有进位,高8位没有。然后将偏移量 的对应字节分别DPL、DPH相加。 4.3 分支结构程序解:CLR CMOV MOV MOV MUL ADD MOV MOV MOV MUL XCHDPTR,#JPTAB2 ;跳转表首地址送数据指针 A,R6 ;取散转点高8位 B,#03H AB ;A←(R6)×3(积不大于255) A,DPH DPH,A ;DPH←(R6)×3+(DPH) A,R7 ;取散转点低8位 B,#03H AB ;BA←(R7)×3 A,B 4.3 分支结构程序ADDC A,DPL;(R7)×3高位加到DPH上 ;(R7)×3低位交换至A中 ;散转MOV DPL,A XCH A,B JMP @A+DPTR JPTAB2:LJMP OPR0 LJMP OPR1 ┆ LJMP OPRn 4.3 分支结构程序2、采用地址偏移量表上面介绍的散转程序,首先必须建立转移表,程序 根据散转点执行?JMP @A+DPTR”指令,进入转移表后, 再由双字节?AJMP”指令转入2KB空间范围内的操作入口 或由三字节?LJMP” 指令转入64KB空间范围内的操作入 口。 如果散转点较少,所有操作程序处在同一页(256B) 时,可使用地址偏移量转移表。 例4.17 根据R7的内容转向5个操作程序。 解: JUMP3:MOV A,R7 MOV DPTR,#TAB3 MOVC A,@A+DPTR 4.3 分支结构程序JMP @A+DPTRTAB3: DB OPR0-TAB3DB OPR1-TAB3 DB OPR2-TAB3 DB OPR3-TAB3 DB OPR4-TAB3 OPR0:[操作程序0] OPR1:[操作程序1] OPR2:[操作程序2] OPR3:[操作程序3] OPR4:[操作程序4] 4.3 分支结构程序从本例可以看出,地址偏移量表每项对应一个操作程序的入口,占一个字节,分别表示对应入口地址与表 首的偏移量。 使用这种方法,地址偏移量表的长度加上各操作程 序长度必须在同一页内。当然,最后一个操作程序的长 度不受限制,只要其程序入口与地址偏移量表首的偏移 量在一个字节内(小于256)就可以。显然,各操作程序可 位于64KB ROM中任何地方。 4.3 分支结构程序3、采用转向地址表采用地址偏移量表的方法,其转向范围局限于一页, 使用受限制。若使用转向较大的范围,方法: (1)建立一个转向地址表,即将所要转向的双字节地 址组成一个表; (2)在散转时,先用查表方法获得表中的转向地址; (3)将该地址装入DPTR中,再清A; (4)执行?JMP @A+DPTR”指令,程序转入所要到达 的目的地址中去。 例4.18 根据R7的内容转入各对应的操作程序中去。 解 设转移入口地址为OPR0、OPR1、…、OPRn ,散 转程序及转移表如下: 4.3 分支结构程序JMUP4:MOV DPTR,#TAB4MOV A,R7 ADD A,R7 ;A←(R7)×2 JNC NADD INC DPH ;(R7)×2进位加至DPH NADD:MOV R3,A ;暂存 MOVC A,@A+DPTR ;取地址高8位 XCH A,R3 ;Z转移地址高8位 INC A MOVC A,@A+DPTR ;取地址低8位 4.3 分支结构程序MOV DPL,A;Z转移地址低8位MOV DPH,R3 CLR A JMP @A+DPTR TAB4:DW OPR0 DW OPR1 ┆ DW OPRn 这种散转方法可以达到64KB地址范围内的转移,但 也可看出,散转数n小于256。若要使n大于255,可仿前 面用双字节加法运算的方法修改DPTR。 4.3 分支结构程序[例题]编制程序用单片机实现四则运算。解:在单片机的键盘上设Z?+、-、×、÷”四个 运算按键。其键值存放在寄存器R2中,当(R2)=00H时做 加法运算,当(R2)=01H时做减法运算,当(R2)=02H时 做乘法运算,当(R2)=03H时做除法运算。P1口输入被加数、被减数、被乘数、被除数,输出 商或运算结果的低8位;P3口输入加数、减数、乘数、除数,输出余数或运 算结果的高8位。 4.3 分支结构程序程序简化流程图如下图所示。程序如下:ORG START: MOV1000H P1, #DATA1H ; 给P1口、P3口送入数据DATA1, DATA2, 用于计算 MOV P3, #DATA2H ; 将基址TABLE送DPTR ; Cy清0 ; 将运算键键值送A ; 将键值和04H相减,用于产生Cy标志 ; 若输入按键不合理,程序转ERROR处; 否则,按键合理,程序继续执行 ADD A, #04H ; 还原键值 CLR C ; Cy清0 RL A ; 将A左移,即键值×2, 形成正确的散转偏移量 JMP @A+DPTR ; 程序跳到(A)+(DPTR)形成的新地址 TABLE: AJMP PRG0 ; 程序跳到PRG0处,将要做加法运算 AJMP PRG1 ; 程序跳到PRG1处,将要做减法运算 AJMP PRG2 ; 程序跳到PRG2处,将要做乘法运算 AJMP PRG3 ; 程序跳到PRG3处,将要做除法运算 ERROR:(按键错误的处理程序)(略) MOV DPTR, #TABLE CLR C MOV A, R2 SUBB A, #04H JNC ERROR PRG0: MOV A, P1 ADD A, P3 MOV P1, A CLR A ADDC A, #00H MOV P3, A RET PRG1: MOV A, P1 CLR C SUBB A, P3 MOV P1, A CLR A RLC A MOV P3, A RET; 被加数送A ; 做加法运算,结果送入A,并影响进位C 和的低8位结果送P1 ; A清0 ; 将进位Cy送入A,作为和的高8位 ; 和的高8位结果送P3 ; 返回开始程序 ; 被减数送A ; Cy清0 ; 做减法运算,结果送入A,并影响借位C 差的低8位结果送P1 ; A清0 ; 将借位Cy左移进A,作为差的高8位(负号) ; 差的高8位(负号)结果送P3 ; 返回开始程序 PRG2: MOV A, P1 MOV B, P3 MUL AB MOV P1, A MOV P3, B RET PRG3: MOV A, P1 MOV B, P3 DIV AB MOV P1, A MOV P3, B RET END; 第一个因数送A ; 第二个因数送B ; 做乘法运算,积的低8位送入A, 高8位送入B,影响Cy, OV标志位 ; 积的低8位结果送P1 ; 积的低8位结果送P3 ; 返回开始程序 ; 被除数送A ; 除数送B ; 做除法运算,商送入A,余数送入B ; 商送入P1 ; 余数送入P3 ; 返回主程序 4.4 循环结构程序?4.4循环结构程序循环程序设计:能连续多次重复执行的某段程序。 目的:缩短程序长度,节省存储单元,提高所编写程 序的质量。 一、循环结构程序组成 (1)初始化部分 为循环程序作准备。如设Z循环次数计数器初值,地 址指针Z初值,为其他变量赋初值等。一个重要部分,不 注意容易出错。 (2)处理部分 重复执行的程序段,循环程序的实体。 4.4 循环结构程序(3)循环控制部分每执行一次循环体后,都要为下一次循环作必要的 准备。如修改计数器值;检查循环条件是否符合,以决 定继续循环或退出循环。 (4)结束部分 分析或存放执行结果。 二、循环结构程序两种基本结构 (1)计数循环结构(先处理后控制): 先进入处理部分再控制循环。此结构至少执行一次 循环体;
4.4 循环结构程序(2)条件循环结构(先控制后处理):先控制循环,后进入处理部分。此结构有时不进入循 环体就退出循环,故称之?允许0次循环的循环程序?。 注:循环结构的程序,其关键是控制循环次数。 对循环次数的控制方法有: ⑴循环次数已知,用计数器控制循环; ⑵次数未知,按条件控制循环; ⑶按逻辑尺控制循环。 4.4 循环结构程序三、循环程序分类 单循环程序:结构特点:循环体为顺序结构或分支结构,每循环 一次,执行一次循环体程序。循环体中不包含循环程序。 51所用指令: DJNZ Rn,rel ;以Rn作控制计数器 DJNZ direct,rel ;以direct作控制计数器 多重循环程序(循环嵌套) 结构特点:在循环体中还包含有循环的程序。若把 每重循环的内部看作一个整体,则多重循环结构与单循 环结构是一样的。 4.4 循环结构程序四、使用多重循环程序必须注意的问题⑴循环嵌套必须层次分明,不允许产生内外层交叉; ⑵外循环可以一层层向内循环进入,结束时由里向外一层层退出; ⑶内循环体可以直接转入外循环体,实现一个循 环由多个条件控制的循环结构方式。 4.4 循环结构程序五、举例例4.11 多个单字节数据求和。解 设Xi为单字节数(i=1~n),依次存放在内部RAM中 50H单元开始的连续单元中。 要求n放入R2中,把计算结果存入R3R4中(高位存入 R3,低位存入R4)。 4.4 循环结构程序图4-6 多个单字节数据求和程序框图动画演示 4.4 循环结构程序参考程序 ADD1:MOV R3,#00H MOV R4,#00H MOV R2,#n ;R2为循环次数计数器 MOV R0,#50H ;R0作间址寄存器用它来寻址Xi 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 ;未加完继续重复 RET 练习题[例题] 已知片内RAM 30H~ 3FH单元中存放了16个二进制 无符号数,编制程序求它们的 累加和,并将其和数存放在R4, R5中。 解:每次求和的过程相同, 可以用循环程序实现。16个二进制无符号数求和,循环 程序的循环次数应为16次(存 放在R2中),它们的和放在R4, R5中(R4存高8位,R5存低8 位)。程序流程图如右图所示。 程序如下:START:LOOP:ORG 1000H MOV R0, #30H MOV R2, #10H ; 设Z循环次数(16) MOV R4, #00H ; 和高位单元R4清0 MOV R5, #00H ; 和低位单元R5清0 MOV A, R5 ; 和低8位的内容送A ADD A, @R0; 将@R0与R5的内容相加并产生进位Cy MOV R5, A ; 低8位的结果送R5 CLR A ; A清0 ADDC A, R4 ; 将R4的内容和Cy相加 MOV R4, A ; 高8位的结果送R4 INC R0 ; 地址递增(加1) DJNZ R2, LOOP ;若循环次数减1不为0,则转到 LOOP处循环;否则,循环结束 SJMP $ END [例题] 编制程序将片内RAM的30H~4FH单元中的内容传 送至片外RAM的2000H开始的单元中。 解:每次传送数据的的过程 相同,可用循环程序实现。 30H~4FH共32个单元,循环 次数应为32次(保存在R2中), 为了方便每次传送数据时地 址的修改,送片内RAM数据 区首地址送R0,片外RAM数 据区首地址送DPTR。程序流 程图如右图所示。 程序如下:ORG 1000HSTART: MOV R0, #30HMOV DPTR, #2000H MOV R2, #20H ; 设Z循环次数LOOP: MOV A, @R0MOVX @DPTR, A INC R0; 将片内RAM数据区内容送A; 将A的内容送片外RAM数据区 ; 源地址递增INC DPTRDJNZ R2, LOOP; 目的地址递增; 若R2的不为0,则转到LOOP处 继续循环;否则循环结束SJMP $ END 4.4 循环结构程序例4.12 已知80C51单片机作用的晶振为6MHz,要设计一个软件延时程序,延时时间为10ms。 分析:延时时间主要与两个因素有关: (1)所用晶振; (2)延时程序中的循环次数。现已知晶振为6MHz,则可知一个机器周期为2μs,那么DJNZ指令为2个机器周期,共4μs,采用单重循环要循 环250次,可实现1ms的延时,10ms则再用一循环,循环 10次,可得10ms延时。 4.4 循环结构程序图4-7 延时程序框图动画演示 4.4 循环结构程序解本例采用循环体为两NOP指令,则 (1+1+2)×2μs×MT=1ms,MT=125=7DH ORG 2000H MOV R0,#0AH ;毫秒数→R0 DL2:MOV R1,#MT ;1ms延时的预定值MT→R1 DL1:NOP NOP DJNZ R1,DL1 ;1ms延时循环 DJNZ R0,DL2 ;毫秒数减1,不等于0则继续循 环,等于0结束 END 4.4 循环结构程序若考虑其他指令的执行时间,则该段延时程序的精确延时时间计算如下: 2μs×1+{(1+2)×2μs +(1+1+ 2)×2μs×125 }×10=10062μs 若需要延时更长时间,可采用更多重循环,如1s延 时可用3重循环,而7重循环可延时1年。 注意:在采用软件实现延时功能时,不允许使用中 断,否则将影响定时精度。 [例题] 编制程序设计50ms延时程序。 解:延时程序与51系列指令执行时间(机器周期数)和晶 振频率fOSC有直接的关系。当fOSC=12MHz时,机器周期为 1?s,执行一条DJNZ指令需要2个机器周期,时间为2?s。 50ms÷2?s&255,因此单重循环程序无法实现,可采用双重循环的方法编写50ms延时程序。 程序如下:ORG 1000H DELAY: MOV R7, #200 ; 设Z外循环次数(此条指令需要1个机器周期)DLY1: MOV R6, #123 ; 设Z内循环次数DLY2: DJNZ R6, DLY2 ;(R6)-1=0,则顺序执行,否则转 回DLY2继续循环,延时时间为 2?s×123=246?s NOP DJNZ R7,DLY1 ; 延时时间为1?(R7)-1=0,则顺序执行,否则转 回DLY1继续循环,延时时间为 (246+2+1+1)×200+2+1=50.003ms RET END ; 子程序结束 4.4 循环结构程序练习题:假设晶振频率为12MHz,试编写一延迟时间 为100ms的子程序。 分析:可使用?DJNZ ”指令实现延迟,但当晶振频 率为12MHz,机器周期仅为1μs,即使指定寄存器或存储单元初值为FFH,减到0的延迟时间也只有256×2μs,远 小于所需的延迟时间,因此需要双循环结构。参考程序如下:; ******延迟100 ms子程序********; 子程序名称:Delay100 4.4 循环结构程序Delay100: PUSH PSW CLR RS0SETB RS1MOV R7,#0C7H LOOP1: MOV R6,#0FAHLOOP2: DJNZ R6, LOOP2 ;DJNZ指令执行时间为2个机器周期,;而R6初值为FAH(即250),则R6减到0,需500μs DJNZ R7, LOOP1 ; 重装R6初值指令及?DJNZ R7,LOOP1 ;”执行时间为3μs,则需要进行199次,因此R7初值设为C7H POP PSW RET 4.4 循环结构程序例4.13 将20H单元内的两个BCD数相乘,相乘的结果要求仍为BCD数,乘积存入21H单元。分析:两个BCD数最大的是99,9×9=81。若采用?MUL”指令,则结果为51H,而对乘法没有十进制调整指 令。所以,在此必须采用加法与十进制调整指令重复执 行的方法。 4.4 循环结构程序图4-8 BCD数乘法流程图动画演示 4.4 循环结构程序解ORG 2000H MOV A,20H ANL A,#0FH MOV R0,A MOV A,20H SWAP A ANL A,#0FH MOV R1,A CLR A;把BCD数的低位分离出来;变换BCD数的高低位;把BCD数的高位分离出来;清A 4.4 循环结构程序LP:ADD A,R1DA A DJNZ R0,LP MOV 21H,A LP1:SJMP LP1 END 本程序中,循环体只有ADD、DA、DJNZ 3条指令,这 3条指令的作用是把乘法变为累加。 4.4 循环结构程序例4.14 冒泡程序。设有n个数,分别存放在RAM中LIST地址开始的连续 存储单元中,要求将n个数比较大小之后,按由小到大的 次序排列,再存入原存储区。设n=7,参与比较的数为0, 13,3,90,27,32,11。 分析: 依次将相邻两个单元的内容进行比较。即第一个数 与第二个数进行比较,第二个数与第三个数进行比较, 依此进行,如符合由小到大的顺序,则不改变它们在内 存中的位Z,否则交换它们之间的位Z。如此反复比较, 直到数列排完为止。 4.4 循环结构程序由于在比较过程中,小数向上冒,因此这种排序程序称为?冒泡程序?,比较过程如下: 4.4 循环结构程序第一轮经过6次两两比较,得到一个最大数;第二轮经过5次两两比较,得到一个次大数; 依此类推。每轮比较后得到本轮最大数,该数就不 再参与下一轮的比较,故每轮比较次数减1。为加快排序 速度,程序中设Z一个标志位,只要在比较过程中两数 之间没有发生过交换,就表示数列已按由小到大的顺序 排列好了,就可以结束比较。 4.4 循环结构程序图4-9 冒泡程序流程图动画演示 4.4 循环结构程序设数列首地址存于R0中,R2为外循环次数计数器,R3为内循环次数计数器,R1为交换标志。 解 ORG 50H LIST DB 0,13,3,90,27,32,11 CNT EQU 07H ORG 8000H MOV R2,#CNT-1 ;数列个数减1,这里(R2)=7-1 4.4 循环结构程序LOOP1: MOV A,R2;外循环计数值MOV R3,A ;内循环计数 MOV R1,#01H ;交换标志位 LOOP2:MOV A,@R0 ;取数据 MOV B,A ;暂存B INC R0 CLR C SUBB A,@R0 ;两数比较 JC LESS ;Xi<Xi+1转LESS 4.4 循环结构程序MOV A,B;取大数XCH A,@R0 ;两数交换位Z DEC R0 MOV @R0,A INC R0 ;恢复数据指针 MOV R1,#02H ;Z交换标志位为2 LESS:DJNZ R3,LOOP2 ;内循环计数减1,判一遍查完? DJNZ R2,LOOP3;外循环计数减1,判排序结束? STOP:RET 4.4 循环结构程序LOOP3:DJNZ R1,LOOP1 ;发生交换转移SJMP STOP END 练习题:200名学生参加考试,成绩放在80C51的外部 RAM的一个连续存储单元,95~100分颁发A级证书, 90~94分颁发B级证书,编写程序,统计获A、B级证书 的人数。将结果存入内部RAM的两个单元。注意:地址指针的分配 参考程序: 4.4 循环结构程序ORG 0030H EGX DATA 1000H;存放成绩的外部连续存储单元 起始地址 GA DATA 20H;设Z存放获取A级证书人数的单元 GB DATA 21H;设Z存放获取B级证书人数的单元 MOV GA,#00 MOV DPTR,#EGX ;初始化 MOV R2,#200 ;定义计数器,200名学生数 LOOP: MOVX A,@DPTR CJNE A,#95, LOOP1 4.4 循环结构程序LOOP1:JNC NEXT1;C=0,转至NEXT1CJNE A,#90,LOOP2 LOOP2:JC NEXT INC GB SJMP NEXT NEXT1:INC GA NEXT:INC DPTR DJNZ R2,LOOP SJMP $ END 4.5 子程序结构4.5 子程序结构一、概念 子程序:完成确定任务,并能为其他程序反复调用 的程序段。 要求子程序在结构上具有通用性和独立性。例如: 代码转换,运算程序,任意数的平方等。子程序的调用与返回:主程序调用子程序的过程:在主程序中需要执行这 种操作的地方执行一条调用指令(LCALL或ACALL),转到子 程序,而完成规定的操作后,再在子程序最后应用RET返 回指令返回到主程序断点处,继续执行下去。 4.5 子程序结构⑴子程序的调用 子程序的入口地址:子程序的第一条指令地址,常 用标号表示。 程序调用过程:单片机收到ACALL或LCALL指令后, ⑴将当前的PC值(调用指令的下一条指令的首地址) 压入堆栈保存(低8位先进栈,高8位后进栈); ⑵将子程序的入口地址送入PC,转去执行子程序。 4.5 子程序结构⑵子程序的返回 主程序的断点地址:子程序执行完毕后,返回主程序的地址,它在堆栈中保存。子程序返回过程:子程序执行到RET指令后,将压入 堆栈的断点地址弹回给PC(先弹回PC的高8位,后弹回PC 的低8位),使程序回到原先被中断的主程序地址(断点地 址)去继续执行。 4.5 子程序结构注意:中断服务程序是一种特殊的子程序,它是在 计算机响应中断时,由硬件完成调用而进入相应的中断 服务程序。RETI指令与RET指令相似,区别在于RET是从 子程序返回,RETI是从中断服务程序返回。子程序优点:⑴可多次重复使用,避免重复性工作,缩短整个程 序,简化了程序的逻辑结构;⑵提高编程效率,便于调试;⑶节省存储器的空间。 4.5 子程序结构与子程序调用有关的指令: 两条调用子程序指令: ACALL addr11;LCALL addr16 一条返回主程序指令:RET 二、子程序设计要点 1.第一条语句前必须有标号。标号习惯上以子程序的任务命名。 例如,延时子程序常以DELAY作为标号。 2.子程序最后应以返回指令(RET)结尾。 3.在主程序中设Z堆栈。 凡有子程序的程序,主程序初始化一定要设Z栈底和栈区,以 免造成混乱和错误。 4.子程序内部必须使用相对转移指令,以便子程序可以放在ROM 64KB存储空间的任何子域并能为主程序调用,汇编时生成浮动代码。 4.5 子程序结构4、保护和恢复现场在转入子程序时,特别是进入中断服务子程序时, 要特别注意保护现场的问题。主程序使用的A、DPTR、 PWS、R0~R7等,不应因转入子程序而改变。⑴保护现场 主程序转入子程序后,保护主程序的信息不会在运 行子程序时丢失的过程。 保护现场通常在进入子程序的开始时,由堆栈完成。 如: PUSH PUSH … PSW ACC 4.5 子程序结构4、保护和恢复现场⑵恢复现场从子程序返回时,将保存在堆栈中的主程序的信息 还原的过程。恢复现场通常在从子程序返回之前将堆栈中保存的 内容弹回各自的寄存器。如:… POP POP ACC PSW 4.5 子程序结构5、参数传递参数传递:主程序在调用子程序时传送给子程序的 参数和子程序结束后送回主程序的参数的统称。入口参数:子程序需要的原始参数。主程序在调用 子程序前将入口参数送到约定的存储器单元(或寄存器) 中,然后子程序从约定的存储器单元(或寄存器)中获得 这些入口参数。出口参数:子程序根据入口参数执行程序后获得的 结果参数。子程序在结束前将出口参数送到约定的存储 器单元(或寄存器)中,然后主程序从约定的存储器单元 (或寄存器)中获得这些出口参数。 4.5 子程序结构几种参数传递方法:①用A或寄存器传递;(如:例4.15)优点:程序简单、运算速度较快。缺点:工作寄存 器有限。②用地址指针寄存器(R0、R1、DPTR)传递;(如:例 4.16)优点:能有效节省传递数据的工作量,并可实现可 变长度运算。 ③用堆栈传递参数。(如:例4.17) 优点:简单,能传递的数据量较大,不必为特定的 参数分配存储单元。 ④利用位地址传送子程序参数。 4.5 子程序结构三、子程序的嵌套在实际应用中,子程序中调用子程序的情况。四、举例例4.15 设a、b、c分别存放在内部RAM的40H、41H、 42H单元中,a、b均小于10。试编程计算:分析:用子程序来实现某数的平方,即通过调用子 程序查平方表,结果在主程序中得到。 4.5 子程序结构图4-10 程序框图动画演示 4.5 子程序结构主程序:Main: MOV A,40H ACALL SQR MOV R1,A MOV A,41H ACALL SQR ADD A,R1 MOV 42H,A SJMP $;调查表子程序 ;a2暂存R1中 ;调查表子程序;等待 4.5 子程序结构子程序: SQR: INC A MOVC A,@A+PC RET ;查平方表TAB: DB 0,1,4,9,16 DB 25,36,49,64,81 该程序中子程序的入口条件(A)=待查表的数,出 口条件(A)=待查表数的平方。 4.5 子程序结构例4.16 求两个无符号数据块中的最大值。数据块的首地址分别为60H和70H,每个数据块的第一个字节都存 放数据块长度。结果存入5FH单元。 分析:可采用分别求出两个数据块的最大值,然后 比较其大小的方法。 求最大值的过程可采用子程序。 子程序的入口条件是数据块首地址,返回参数即为 最大值,放在A中。 4.5 子程序结构解:主程序:ORG 2000H MOV R1,#60H ;Z入口条件参数 ACALL QMAX ;调用求最大值子程序 MOV 40H,A ;第一个数据块的最大值暂存40H MOV R1,#70H ;Z入口条件参数 ACALL QMAX ;调求最大值子程序 CJNE A,40H,NEXT ;两个最大值进行比较 NEXT:JNC LP ;A大则转LP MOV A,40H ;A小则把40H单元中的内容送入A LP: MOV 5FH,A ;把两个数据块的最大值送入5FH SJMP $ 4.5 子程序结构子程序: ORG 2200H QMAX:MOV A,@R1 ;取数据块长度 MOV R2,A ;设Z计数值 CLR A ;设0为最大值 LP1:INC R1 ;修改地址指针 CLR C SUBB A,@R1 ;两数相减 JNC LP3 ;原数仍为最大值,转LP3 MOV A,@R1 ;否,用此数代替最大值 SJMP LP4 ;无条件转LP4 LP3: ADD A,@R1 ;恢复原最大值 LP4: DJNZ R2,LP1 ;若没比较完,继续比较 RET ;比较完,返回 4.5 子程序结构例4.17 在50H单元中存放着两个十六进制数字,编程使它们分别转换成ASCⅡ码,并存入51H和52H单元。 解:十六进制数转换成ASCⅡ码的过程可采用子程序。 这里采用堆栈来传递参数。 主程序: ORG 2000H MOV SP,#3FH ;设堆栈指针 PUSH 50H ;把50H单元内的数压入堆栈 ACALL HASC ;调子程序,并把主程序的断点地址 高、低位(PCH、PCL)分别压入41H、42H单元 POP 51H ;把已转换的低半字节的ASCⅡ码弹 入51H单元接下页 4.5 子程序结构MOV A,50HSWAP A ;准备处理高半字节的十六进制数 PUSH A ACALL HASC POP 52H ;把已转换的高半字节的ASCⅡ码弹入52H单元 SJMP $图4-11 堆栈操作示意图动画演示接下页 4.5 子程序结构子程序: ORG 3000H HASC:DEC SP DEC SP POP A ;两次执行?DEC SP?,把堆栈指针修正到40H ;把40H中的原50H单元内的数据弹入到A中 ;屏蔽高4位 ;修正查表位Z ;取表中数至AANL A,#0FH ADD A,#07 MOVC A,@A+PCPUSH A ;将已转换的ASCⅡ码值压入堆栈的40H单元 INC SP ;修改SP指针到断点位Z INC SP ;两次执行?INC SP?,SP变为42H RET ;把原断点内容又送回PC,SP又指向40H TAB:DB ‘0,1,2,3,4,5,6,7’ DB ‘8,9,A,B,C,D,E,F’ 4.5 子程序结构说明:本题也可以不采用堆栈传递参数的办法,此时可以 用ACC既作为入口条件,也作为出口条件来传递参数。在主程序中把?PUSH 50H”改为?MOV A,50H”;把?POP 51H”改为?MOV 51H,A”; 依次类推。 在子程序中把6条有关堆栈的操作指令都去掉; 再把?ADD A,#07”改为?ADD A,#01”即可。 4.5 子程序结构练习题1:M1和M1+1单元存有16位二进制数,试编程将其扩大二倍。 参考答案: CLR C MOV R1,#M1 MOV A,@R1 RLC A MOV @R1,A INC R1 MOV A,@R1 RLC A MOV @R1,A 4.5 子程序结构练习题2:将内部ROM的60H、61H单元中的连续存放着4位BCD码。试编写一段程序将这4位BCD码倒序排列。 参考答案: MOV R0,#60H MOV R1,#61H MOV A,@R0 SWAP A XCH A,@R1 SWAP A MOV @R0,A 4.5 子程序结构练习题3:已知外部RAM的3000H开始放一数据区,缓冲区中以回车符0DH结束。 编程:将正数送入片内RAM以30H开始的正数区,将负 数放入以40H开始的负数区。 参考答案: 4.5 子程序结构解法一:MOV R0,#30H MOV R1,#40H MOV DPTR,#3000H NEXT: MOVX A, @DPTR MOV 10H,A CJNE A,#0DH,END1 ;#0DH与A中内容不相等转 至END1处,(A)&0DH,C=0;(A)&0DH,C=1 SJMP OVER ;相对转移到OVER处 4.5 子程序结构END1: ANL A,#B JZ ZH SJMP NEG ZH: MOV @R0,10H INC R0 INC DPTR SJMP NEXT NEG: MOV @R1,10H INC R1 INC DPTR SJMP NEXT OVER: RET;判断正负数 ;(A)=0,转移到ZH处 ;存放正数程序段;存放负数程序段 4.5 子程序结构解法二:MOV R0,#30H MOV R1,#40HMOV DPTR,#3000H NEXT: MOVX A, @DPTR CJNE A,#0DH,COMP SJMP OVER COMP: JB ACC.7,LOOP ;ACC.7=1程序转移到LOOP MOV @R0,A ;存放正数程序段 INC R0 INC DPTR 4.5 子程序结构SJMP NEXTLOOP: MOV @R1,A INC R1 INC DPTR SJMP NEXTOVER: RET;存放负数程序段 4.6 综合程序举例4.6 综合程序举例 一、查表程序 1、查表程序 查表:根据变量x在表格中查找y,使y=f(x)。函数值y事先根据变量x的取值范围计算出,并按一定规律编 成表格存放在计算机的ROM中。当用户程序中需要用这些 数据时,直接按编排的索引值(或程序号)寻找答案。 主要用于: LED显示器控制、智能化仪表控制、打印机的打印以 及数据计算、复杂函数计算:Y=SIN(X); 数据补偿:传感器补偿、复杂代码转换显示等功能 程序中。 4.6 综合程序举例在51中有两条查表指令: MOVC A,@A+DPTR; MOVC A,@A+PC 1.采用MOVC A, @A+DPTR指令查表程序的设计方法 ⑴在ROM中建立相应的函数表(设自变量为X)。⑵计算出这个表中所有的函数值Y。将这群函数值按 顺序存放在起始(基)地址为TABLE的ROM中。⑶将表格首地址TABLE送入DPTR,X送入A,采用查表 指令MOVC A, @A+DPTR完成查表,就可以得到与X相对应 的Y值于A中。 4.6 综合程序举例2.采用MOVCA, @A+PC指令查表程序的设计方法当使用PC作为基址寄存器时,由于PC本身是一个程序 计数器,与指令的存放地址有关,查表时其操作有所不同。 ⑴在ROM中建立相应的函数表(设自变量为X)。 ⑵计算出这个表中所有的函数值Y。将这群函数值按 顺序存放在起始(基)地址为TABLE的ROM中。 ⑶X送入A,使用ADD A, #data指令对A的内容进行 修正,偏移量data由公式data=函数数据表首地址?PC?1 确定,即data值等于查表指令和函数表之间的字节数。 ⑷采用查表指令MOVC A, @A+PC完成查表。 4.6 综合程序举例[例题]利用查表的方法编写Y=X2(X=0, 1, 2,…, 9)的程序 解:设变量X的值存放在内存30H单元中,求得的Y 的值存放在内存31H单元 中。平方表存放在首地址 为TABLE的ROM中。 方法一:采用MOVC A, @A+DPTR指令实现,查表 过程如下图所示。 程序如下:ORG 1000H START: MOV A, 30H ; 将查表的变量X送入A MOV DPTR, #TABLE ; 将查表的16位基地址TABLE送 DPTR MOVC A, @A+DPTR ; 将查表结果Y送A MOV 31H, A ; Y值最后放入31H中 TABLE: DB 0, 1, 4, 9, 16 DB 25, 36, 49, 64, 81 END方法二:采用MOVC 页图所示。 程序如下:A, @A+PC指令实现,查表过程如下 ORG 1000H START: MOV A, 30H ADD A, #02H MOV 31H, A TABLE: DB 0, 1, 4, 9, 16 DB 25, 36, 49, 64, 81 END ; 将查表的变量X送入A ; 定位修正 ; Y值最后放入31H中MOVC A, @A+PC ; 将查表结果Y送A 4.6 综合程序举例2、查表程序优点程序简单、执行速度快。 3、查表程序有多种结构形式,下面介绍两种常用查表程 序。 例4.18 设计一个将16进制数转换成ASCⅡ码的子程 序。设16进制数存放在R0中的低4位,要求将转换后的 ASCⅡ码送回R0中。 解:已知0~9的ASCⅡ码为30H~39H,A~F的ASCⅡ 码为41H~46H。按题意程序的入口和出口都在R0中,表 中所有的值都是单字节,表格长度为16个字节(0~F)。 4.6 综合程序举例参考程序:ORG 2160H MOV A,R0 ANL A,#0FH ;保留低4位 ADD A,#02H ;变址调整,因为?MOVC A,@A+PC” 指令与表格首址相隔两个字节,故变址调整值为2 MOVC A,@A+PC ;查表得ASCⅡ值 MOV R0,A RET 4.6 综合程序举例TAB:DB 30H,31H,32H DB 33H,34H,35HDB 36H,37H,38H DB 39H,41H,42H DB 43H,44H,45H,46H 4.6 综合程序举例例4.19 某智能化仪器的键盘程序中,根据命令的键值(0,1,2,…, 9),转换成相应的双字节16位命令操作地址,其键入值与对应入口关系 如下:键值 入口 地址 0 6 2 6 4 0 6 0 8 9设键值存放在20H单元中,出口地址值存放在22H,23H单元中。 参考程序: ORG 2200H MOV DPTR,#TAB;指向表首高8位MOV A,20H;取键值 4.6 综合程序举例RL A 查表偏移量;因函数值y为双字节,所以把键值乘2作MOV 20H,A MOVC A,@A+DPTR MOV 22H,A INC DPTR MOV A,20H MOVC A,@A+DPTR MOV 23H,A RET TAB: DB 01,23H DB 01,86H;暂存偏移量 ;取高8位地址 ;暂存高8位地址 ;指向表首低8位 ;取偏移量 ;取低8位地址 ;暂存低8位地址;?0?键入口地址;?1?键入口地址 4.6 综合程序举例DB DB DB DB DB DB DB DB02,34H 03,16H 04,15H 05,20H 06,26H 07,10H 08,18H 09,29H;?2?键入口地址 ;?3?键入口地址 ;?4?键入口地址 ;?5?键入口地址 ;?6?键入口地址 ;?7?键入口地址 ;?8?键入口地址 ;?9?键入口地址 4.6 综合程序举例二、代码转换程序例4.20 将A中0~0FF范围内二进制数转换为BCD码 (0~255)。 分析:BCD码是四位二进制数表示的十进制数。它在 单片机中有两种存放形式: 一种是一个字节放一位BCD码,高半字节取0,适用 于显示和输出; 另一种是一个字节存放两位BCD码,即压缩BCD码, 有利于节省存储空间。本题所转换的最大BCD数是255, 超过了一个字节,因而把十位、个位以压缩BCD码的形式 存放,把百位单独存放。 . 4.6 综合程序举例编程思路:将A中十进制数除以100、10,所得商即为百、十位 数,余数为个位数。结果存放在R0内容为初始地址的单元中。参考 程序: MOV B,#100 DIV AB ;A中为百位数,B内为余数 MOV @R0,A ;存入RAM单元 INC R0 ;修改地址指针 MOV A,#10 XCH A,B DIV AB ;A中为十位数,B中为个位数 SWAP A ;十位数移到高半字节 ADD A,B ;形成十位和个位数的压缩BCD码 MOV @R0,A ;存入RAM单元 RET 4.6 综合程序举例*例4.21 编写多字节二进制数转换为BCD码的程序。分析:若本例采用上例算法,需进行多字节除法运 算,运算速度慢,且程序通用性差。本程序采用图4-12 所示流程图的算法编制。 (a15a14…a1a0)=( …(0×2+a15)×2+a14…)×2+a0, 所以将二进制数从最高位逐次向左移入BCD码的最低位, 并且每次都实现(…)*2+ai的运算。 编程时应注意两点: (1)BCD码数乘2不能用左移指令,只能用ADDC指令对 BCD数自身相加一次且要用十进制调整指令; 4.6 综合程序举例(2)二进制数转换后的压缩BCD码可能要比原来二进制数多占一个字节单元。入口:(BIND)= 二进制数低位字节地址指针;(BCDD)= BCD数个位数地址指针; (BYTES)= 二进制数字节数。 出口:(BCDD)= BCD数个位数地址指针。 4.6 综合程序举例图4-12 二进制数转换为BCD码程序流程图动画演示 4.6 综合程序举例参考程序:ORG 2000H MOV R1,BCDD ;取BCD码数个位地址 MOV R2,BYTES ;取二进制数字节数 INC R2 CLR A BB0:MOV @R1,A ;清BCD单元 INC R1 DJNZ R2,BB0 4.6 综合程序举例MOV A,BYTESMOV MUL MOV BB3: MOV MOV CLR BB1: MOVB,#08H AB R3,A R0,BIND R2,BYTES C A,@R0;存放二进制数位数;取二进制数位数低位地址 ;取二进制数字节数 4.6 综合程序举例RLC AMOV @R0,A INC R0 DJNZ R2,BB1 ;二进制数左移 MOV R2,BYTES INC R2 MOV R1,BCDD BB2: MOV A,@R1 4.6 综合程序举例ADDC A,@R1;BCD码乘2DA A MOV @R1,A INC R1 DJNZ R2,BB2 DJNZ R3,BB3 RET;十进制调整;反复循环 4.6 综合程序举例例4.22 把A中的压缩BCD码转换成二进制数。 解:MOV R2,A ANL A,#0F0H SWAP A MOV B,#10 MUL AB MOV R3,A MOV A,R2 ANL A,#0FH ADD A,R3 RET;暂存 ;屏蔽低4位 ;高、低4位交换;乘法运算,A中高半字节乘10 ;暂存;取原数 ;取BCD个位 ;个位与十位数相加 4.6 综合程序举例例4.23 将R0所指出单元中的ASCⅡ码转换成十六进制数,并把结果存放于原单元。分析:对于不大于9的数,ASCⅡ代码减去30H; 对于大于9的数,ASCⅡ代码减去37H,即得转换后的 十六进制数。 4.6 综合程序举例参考程序:MOV A,@R0 ;取操作数 CLR C SUBB A,#30H ;0~9的转换 MOV @R0,A ;暂存结果 SUBB A,#0AH ;结果是否大于9 JC SB2 ;不大于9则返回 XCH A,@R0 SUBB A,#07H ;大于9,则减37H MOV @R0,A ;存结果 SB2: RET 4.6 综合程序举例*例4.24 将R2中两位16进制数转换成七段代码,并存入R2R3中。 解:七段代码是用七段发光二极管显示一个数,该 数对应的代码为七段代码。 图4-13在七段代码显示器共阳极接法中,相应段加 上?0?电平时,该段亮。 由七段代码表4-1可以看出,七段代码和数字之间没 有什么规律,所以适合用查表的方法进行转换。先把七 段代码按0~F的顺序存入存储器,表首地址TABS。利用 代码首址相加得转换数制的方法,即得到对应代码所在 的存储单元,从中取得需要代码。 4.6 综合程序举例图4-13 七段码显示器(共阳极接法)动画演示 4.6 综合程序举例表4-1 七段代码表 4.6 综合程序举例参考程序: ORG 8000H HESEC: MOV DPTR,#TABS MOV A,R2 ANL A,#0FH ;取低半字节 MOVC A,@A+DPTR ;查表 MOV R3,A ;结果送R3 MOV A,R2 ANL A,#0F0H ;取高半字节 SWAP A MOVC A,@A+DPTR ;查表 MOV R2,A ;结果送R2 RET 4.6 综合程序举例三、运算类程序*例4.25 多字节无符号数加法。 解: 多字节运算一般是按从低字节到高字节的顺序依次 进行。 入口:(R0)=被加数低位字节地址指针 (R1)=加数低位字节地址指针 (R2)=字节数 出口:(R0)=和数高位地址指针 4.6 综合程序举例图4-14 多字节无符号数加法程序流程图动画演示 4.6 综合程序举例参考程序:ADDBIN: CLR C LOOP1: MOV A,@R0 ADDC A,@R1 MOV @R0,A INC R0 INC R1 DJNZ R2,LOOP1 JNZ LOOP2 MOV @R0,#01H RET;取被加数 ;两数相加,带进位;未加完转LOOP ;无进位转LOOP2 4.6 综合程序举例LOOP2: DEC R0RET 说明: (1)要考虑低字节向高字节的进位情况,最低两字节 相加,无低位来的进位,因此,在进入循环之前应对进 位标志清?0?。最高位两字节相加若有进位,则和数将 比加数和被加数多出一个字节; (2)此程序执行后,被加数被冲掉。*例4.26 多字节无符号数减法。解:与加法原理类似。 4.6 综合程序举例图4-15 多字节无符号数减法程序流程图动画演示 4.6 综合程序举例入口:(R0)=被减数低位字节地址指针(R1)=减数低位字节地址指针 (R2)=字节数 出口:(R0)=差的低字节,(R3)=差值字节数,07H为 无符号位。参考程序:SUBBIN: PUSH PSW CLR C ;清标志位 CLR 07H ;清结果标志位 MOV R3,#00H 4.6 综合程序举例LOOP3:MOV A,@R0 SUBB A,@R1 MOV @R0,A INC R0;取被减数 ;两数相减 ;地址值增1INC R1 INC R3 DJNZ R2,LOOP3 ;做完减法否 JNB CY,LOOP4 ;有无借位 SETB 07H ;差为负,Z?1?符号位, 说明结果无效 LOOP4: POP PSW ;恢复标志寄存器内容 RET 4.6 综合程序举例*例题:编制程序实现两位16进制数乘法运算:(R7R6)16×(R5R4)16→(R3R2R1R0)16解:51系列乘法指令只能完成两个8位无符号数相乘, 因此16位无符号数求积必须将它们分解成8位数相乘来实 现。其方法有先乘后加和边乘边加两种。现以边乘边加 为例设计。 程序如下: ORG DMUL: MOV MOV 1000H A, R6 B, R4 ; 第一个因数的低位送A ; 第二个因数的低位送BMULAB; 第一个因数的低位乘以第二个因数的低位 4.6 综合程序举例MOV R0, A MOV R1, B MOV A, R7 MOV B, R4 MUL AB ADD A, R1 MOV R1, A MOV A, B ADDC A, #00H MOV R2, A MOV A, R6 MOV B, R5 MUL AB ADD A, R1 MOV R1, A MOV A, R2; 积的低位送R0 ; 积的高位送R1 ; 第一个因数的高位送A ; 第二个因数的低位送B ; 第一个因数的高位乘以第二个因数的低位 ; 部分积相加,形成进位C 部分积相加送R1 ; 部分积的进位Cy加到高位; 第一个因数的低位送A ; 第二个因数的高位送B ; 第一个因数的低位乘以第二个因数的高位 ; 部分积相加,形成进位C 回送部分积 4.6 综合程序举例ADDC A, B MOV R2, A MOV A, #00H ADDC A, #00H MOV R3, A MOV A, R7 MOV B, R5 MUL AB ADD A, R2 MOV R2, A MOV A, R3 ADDC A, B MOV R3, A RET END; 部分积相加 ; 回送部分积 ; 部分积的进位Cy加到高位 ; 回送部分积 ; 第一个因数的高位送A ; 第二个因数的高位送B ; 第一个因数的高位乘以第二个因数的高位 ; 部分积相加,形成进位C 回送部分积; 部分积相加 ; 回送部分积 4.6 综合程序举例例题:编程计算片内RAM区50H~57H八个单元中数的算 术平均值,结果存放在5AH中。(要求8个单元的和小于 255)。 解: MOV R0, #50H ;数首地址 MOV R1, #8 ;8个数 MOV A, #0 L1: ADD A,@R0 ;求8个数之和 INC R0 DJNZ R1, L1 MOV B,#8 DIV AB ;求算术平均值 MOV 5AH,A RET 4.6 综合程序举例*例4.27 双字节无符号数乘法。解: 51系列指令系统中只有单字节乘法指令,因此双字 节相乘需分解为4次单字节相乘。 若被乘数(ab)和乘数(cd)分别表示为(az+zb)和 (cz+zd),其中a、b、c、d都是8位数,z表示8位0,其乘 积表示为: 4.6 综合程序举例式中,为相应的两个8位数的乘积,占16位,可用4次乘法指令求出,这16位的积分别表 示为 ,其中以H为后缀的为积的高8位,以L为后缀的为积的 低8位,则按下列排序并按列求和,便得到4字节乘积。 4.6 综合程序举例入口:R5(高)、R4(低),被乘数, R3(高)、R2(低),乘数; 出口:(R1)=积的低位字节地址指针。 4.6 综合程序举例图4-16 双字节无符号数乘法程序流程图动画演示 4.6 综合程序举例参考程序:MULBIN: MOV A,R1 ;复制保存地址指针 MOV R6,A MOV R7,#04H CLEAR: MOV @R1,#00H ;积单元清?0? INC R1 DJNZ R7,CLEAR MOV A,R6 MOV R1,A 4.6 综合程序举例MUL1: MOV A,R2;(R2)×(R4)MOV B,R4 MUL AB ACALL ADDM ;调用加部分积子程序 MOV A,R2 ;(R2)×(R5) MOV B,R5 MUL AB ACALL ADDM MOV A,R3 ;(R3)×(R4) 4.6 综合程序举例MOV B,R4MUL AB DEC R1 ACALL ADDM MOV A,R3 ;(R3)×(R5) MOV B,R5 MUL AB ACALL ADDM MOV A,R6 ;恢复地址指针 MOV R1,A RET 4.6 综合程序举例子程序:ADDM: ADD A,@R1 ;加部分积 MOV @R1,A MOV A,B INC R1 ADDC A,@R1 MOV @R1,A INC R1 MOV A,@R1 ADDC A,#00H 4.6 综合程序举例MOV @R1,ADEC R1 RET 说明:本程序算法可推广到多字节的乘法运算。*例4.28 双字节无符号数除法。 解:采用移位除法的方法,实现双字节无符号数相除,并考虑四舍五入。 入口:R5(高)、R4(低),被除数, R3(高)、R2(低),除数; 出口:R5(高)、R4(低),商;R7(高)、R6(低)余数。 4.6 综合程序举例图4-17 双字节无符号数除法程序流程图动画演示 4.6 综合程序举例参考程序:BINDIV: CLR MOV MOV MOV LP: CLR MOV RLC MOVA ;部分余数单元清?0? R7,A R6,A R0,#10H ;除法移位次数 C ;移位 A,R4 A R4,A 4.6 综合程序举例MOV A,R5RLC A MOV R5,A MOV A,R6 RLC A MOV R6,A MOV A,R7 RLC A MOV R7,A LP1: MOV A,R6 ;部分余数减除数 SUBB A,R2 4.6 综合程序举例MOV R1,AMOV A,R7 SUBB A,R3 JC SMALL MOV R7,A MOV A,R1 MOV R6,A INC R4 SJMP LP1;商加1 4.6 综合程序举例SMALL: DJNZ R0,LPMOV 20H,R7 ;四舍五入 JB 07H,ADD1 CLR C MOV A,R6 RLC A MOV R6,A MOV A,R7 RLC A SUBB A,R3 JC RETURN 4.6 综合程序举例JNZ ADD1MOV A,R6 SUBB A,R2 JC RETURN ADD1: MOV A,R4 ;商加1 ADD A,#01H MOV R4,A MOV A,R5 ADDC A,#00H MOV R5,A RETURN: RET 4.6 综合程序举例*例4.29 BCD码多字节加法。解:为了将计算机所能识别的二进制数转换成人们 习惯使用的十进制数,可利用十进制调整指令,使多字 节加法转换成多字节BCD码加法。 入口:(R0)=被加数低位字节地址指针, (R1)=加数低位字节地址指针, (R3)=字节数; 出口:(R0)=和值低位字节地址指针。 4.6 综合程序举例图4-18 BCD码多字节加法程序流程图动画演示 4.6 综合程序举例参考程序:BCDADD: MOV 20H,R0 MOV 23H,R3 CLR C LPO: MOV A,@R0 ;取被加数 ADDC A,@R1 ;两数相加 DA A ;十进制调整 MOV @R0,A INC R0 ;指针加1 INC R1 DJNZ R3,LPO ;做完加法否 4.6 综合程序举例MOV R3,23HJNC RETURN ;有无进位 MOV @R0,#01H INC R3 RETURN: MOV R0,20H RET *例4.30 双字节BCD码十进制乘法。 解:从乘数高位开始进行BCD码形式乘法。 入口:R1(高)、R0(低),被乘数, R3(高)、R2(低),乘数; 出口:R7(最高)、R6、R5、R4(最低),BCD码形式的 积。 4.6 综合程序举例图4-19 双字节BCD码十进制乘法程序流程图动画演示 4.6 综合程序举例参考程序:DUBCDM: CLR A ;积单元清?0? MOV R7,A MOV R6,A MOV R5,A MOV R4,A MOV 21H,R3 MOV A,R3 JZ LL ANL A, #0F0H ;取R3高位 4.6 综合程序举例JZ HN SWAP A ACALL DDUBCD ACALL LSTBCD HN: MOV A,21H ;取R3低位 ANL A, #0FH JZ LL1ACALL DDUBCD LL1: ACALL LSTBCD LL: MOV A,R2 4.6 综合程序举例ANL A, #0FHJZ RETURN ACALL DDUBCD RETURN: RET DDUBCD: MOV R3,A LP0: MOV A,R4 ADD A,R0 DA A MOV R4,A MOV A,R5 ADDC A,R1;一位BCD码乘法 4.6 综合程序举例DA AMOV R5,A MOV A,R6 ADDC A,#00H DA A MOV R6,A MOV A,R7 ADDC A,#00H DA A MOV R7,A 4.6 综合程序举例ADDC A,#00H DA A MOV R7,A DJNZ R3,LP0 RET LSTBCD: MOV R3,#04H LP1: CLR C MOV A,R4 RLC A MOV R4,A ;BCD码左移一位 4.6 综合程序举例MOV A,R5RLC A MOV R5,A MOV A,R6 RLC A MOV R6,A MOV A,R7 RLC A MOV R7,A DJNZ R3,LP1 RET 4.7 汇编语言的开发环境4.7.1单片机开发系统单片机开发系统在单片机应用系统设计中占有重要的位Z,是 单片机应用系统设计中不可缺少的开发工具。在单片机应用系统设计的仿真调试阶段,必须借助于单片机开发 系统进行模拟,调试程序,检查硬件、软件的运行状态,并随时观察 运行的中间过程而不改变运行中的原有数据,从而实现模拟现场的真 实调试。单片机开发系统应具备的功能: ① 方便地输入和修改用户的应用程序; ② 对用户系统硬件电路进行检查和诊断;③ 将用户源程序编译成目标代码,固化到相应的ROM中去,并能 在线仿真;④ 以单步、断点、连续等方式运行用户程序,能正确反映用户 程序执行的中间状态,即能实现动态实时调试。
4.7 汇编语言的开发环境常用的MCS-51开发系统:⑴Keil C51单片机仿真器。 ⑵广州周立功单片机发展有限公司的TKS系列仿真器。⑶Flyto Pemulator单片机开发系统。⑷Medwin集成开发环境。 ⑸E6000系列仿真器。4.7.2汇编语言的编辑与汇编1.汇编语言的编辑源程序的编辑:编写程序,并以文件的形式存于磁盘中的过程。 编辑好的源程序应以? .ASM”扩展名存盘,以备汇编程序调用。 计算机上进行源程序的编辑的过程:利用计算机中常用的编辑 软件(EDLIN、PE等)或利用开发系统中提供的编辑环境。 4.7 汇编语言的开发环境2.汇编语言的汇编 汇编:把汇编语言源程序翻译成目标代码(机器码)的 过程。 汇编语言源程序的汇编的分类: ⑴人工汇编:指利用人脑直接把汇编语言源程序翻译 成机器码的过程。特点:简单易行,但效率低、出错率高。 ⑵机器汇编:利用软件(称为汇编程序)自动把汇编语 言源程序翻译成目标代码的过程。汇编工作由计算机完成,一般的单片机开发系统中都能实现汇编语言源程序的 汇编。 4.7 汇编语言的开发环境工程中应用的程序都是采用机器汇编来实现的。通用 的MCS-51汇编程序是MCS-51.EXE,它能实现对汇编语言源 程序的汇编。 汇编语言源程序为:文件名.ASM;经汇编程序汇编后生成的打印文件为:文件名.PRT;生成的列表文件为:文件名.LST; 生成的目标文件为:文件名.OBJ;最后生成可执行文件为:文件名.EXE。 4.7 汇编语言的开发环境3.对汇编语言程序的基本要求 ⑴正确性 ⑵可靠性 ⑶可读性好⑷程序代码要短⑸程序执行时间短 ⑹工作区分配及切换 ⑴主程序一般使用0区,R0~R7对应内部RAM单元地址 为00H~07H。 ⑵被主程序调用的第1级子程序,一般使用1区, R0~ R7对应内部RAM单元地址为08H~0FH。 ⑶被第1级子程序调用的第2级子程序,一般使用2区, R0~R7对应内部RAM单元地址为10H~17H。⑷被第2级子程序调用的第3级子程序,一般使用3区, R0~R7对应内部RAM单元地址为18H~1FH。 在内部RAM资源紧张的情况下,如果没有使用3区,或 第3级子程序无须使用全部的寄存器,如只使用R0~R3, 则可将18H~1FH(没有使用3区)或1CH~1FH(使用3区,但 只使用R0~R3寄存器)作为用户RAM。 对于子程序来说,断点明确,是否要切换工作区视情 况而定。例如,当子程序中没有使用工作寄存器组R0~R7,或 子程序中使用的工作寄存器组R0~R7,在调用后无需保护, 就不用切换工作寄存器区,仅保护子程序中用到的寄存器, 如Acc、PSW、B等即可。 ⑸为避免混乱,尽量使用用户区的RAM单元作为子程 序入口/出口参数存放区。SUB1:PUSH PSW PUSH A 保护程序状态字 ; 保护累加器……SETB RS0 CLR RS1; 将需要保护的特殊功能寄存器压入堆栈; 切换工作区。选择的工作区与子程序级别有关……POP xx …; 子程序实体,具体指令由程序功能决定; 恢复现场 ; ?POP指令条数与PUSH指令一致,只是顺序相反POP PSWRET; 恢复程序状态字; 返回 4.7 汇编语言的开发环境4.7.3汇编语言的调试1.单片机开发系统的调试功能⑴运行控制功能 ⑵对应用系统状态的读出功能 ⑶跟踪功能 4.7 汇编语言的开发环境2.常见的软件错误 ⑴逻辑错误:主要是语法错误。 ⑵功能错误:主要是设计思想或算法导致不能实现 软件功能的错误。 ⑶指令错误:指在编辑应用指令时所产生的错误。 如:指令疏漏、位Z不妥、指令不当和非法调用等。 ⑷程序跳转错误:指程序运行不到指定的地方,或 发生死循环等。 ⑸子程序错误: ⑹动态错误:指系统动态性能没有达到设计指标的 错误。如:控制系统的实时响应速度、显示器的亮度、 定时器的精度等。 ⑺上电复位电路的错误: ⑻中断程序错误:指现场的保护与恢复错误、触发 方式错误等。 4.8 本章小结本章通过一些实例,介绍了汇编语言程序设计的基 本步骤。要求学生掌握汇编语言程序结构、设计方法和 设计技巧,可熟练编程。 主要内容与重点掌握: 1、伪指令的使用 2、程序设计基本步骤 分4步:⑴确定计算方法、运算步骤和顺序,把运算 过程画成框图;⑵确定数据:包括工作单元的数量、分配 存放单元;⑶ 按所使用计算机的指令系统,依据框图写 出汇编语言程序;⑷ 上机调试程序,直至完成预定功能。 设计时,应按照尽可能节省数据存储单元、缩短程序长度、减少执行时间3个原则编制程序。 4.8 本章小结3、程序结构 汇编语言程序分为以下4类: ⑴顺序结构:是基本结构; ⑵分支结构:无条件或有条件的转移、散转; ⑶循环结构:需要重复执行某一段程序时采用; ⑷子程序结构。模块化设计时,按功能设计成子程 序模块,需要时调用子程序。 4、编程技巧 掌握编程实例中常用的编程思路,如:数制的转换; 多字节的加、减、乘、除;查表;排序等程序的编程思 路。程序设计需要多学、多练,才能熟练掌握。 4.9 思考与练习题1.编程将片内35H~55H单元中内容送到以3000H为首址的存储区中。 MOV R0, #35H MOV R7, #21H MOV DPTR, #3000H LOOP: MOV A, @R0 MOVX @DPTR, A INC R0 INC DPTRDJNZ R7, LOOP END 4.9 思考与练习题2.设5AH单元中有一变量X,请编写计算下述函数式的程序,结果存入5BH单元。MOV A, 5AH MOV B, AMUL AB MOV R0, A MOV A, 5AH 4.9 思考与练习题CLR CL1:L2:SUBB A, #10 JC L1 MOV A, R0 ADD A, #6 SJMP L2 MOV A, R0 CLR C SUBB A, #3 MOV 5BH, A END 4.8 思考与练习题3.编程计算片内RAM区50H~57H这8个单元中数的和,结果存放于R6、R7中。 MOV R0, #8 MOV R1, #50H CLR A MOV R7,#0 MOV R5, A CLR CL1: ADD A, @R1 4.8 思考与练习题MOV R6, AMOV A, R5 ADDC A, R7 MOV R7, A INC R1 MOV A, R6 DJNZ R0, L1 END 4.8 思考与练习题4.编写对一个多字节数作乘10的运算子程序。 设字节长度存R7,多字节数的首地址为30H,乘积存以 50H开始的存储单元 CHENG: MOV R0, #50H MOV R1, #30H MOV R7, #4 MOV A, @R1 MOV B, #10 MUL ABL1: 4.8 思考与练习题MOV @R0, AMOV A, B INC R0 INC R1 ADDC A,@R0 DJNZ R7, L1 RET 4.8 思考与练习题5.设有两个长度均为15的数组,分别存放在以2000H和2100H为首的存储区中,试编程求其对应项之和,结 果存放到以2200H为首的存储区中。 设R2存第一数组地址高8位,R3存第二数组地址高8 位,R4存对应和地址高8位。 MOV R7, #15 MOV R2, #20H MOV R3, #21H MOV R4, #22H L1: MOV DPH, R2 4.8 思考与练习题MOVX A, @DPTRMOV R0, A MOV DPH, R3 MOVX A, @DPTR ADD A,R0 MOV DPH, R4 MOVX @DPTR, A INC DPL DJNZ R7, L1END 4.8 思考与练习题6.试编程把以2000H为首地址的连续50个单元的内容按升序排列,存放到以3000H为首地址的存储区中。 CNT EQU 50 MOV R7,#50 MOV R6, #30H MOV R5, #20H MOV DPL, #0 MOV DPH, R5 L11: MOVX A, @DPTR MOV DPH, R6 MOVX @DPTR,A 4.8 思考与练习题INC DPTRLL0:MOV DPH, R5 DJNZ R7,L11 MOV R2, #CNT MOV A,R2 MOV R4,A MOV A, R2 MOV R7, A MOV DPH, R6 MOV DPL,#0 4.8 思考与练习题L1:MOVX A,@DPTRMOV R0,A INC DPTR MOVX A,@DPTR CLR C SUBB A,R0 JNC LL MOVX A,@DPTR XCH A,R0 MOV R3,#2 4.8 思考与练习题MOVX @DPTR,ALL:STOP: LL2:DEC DPL MOV A, R0 MOVX @DPTR,A INC DPTR DJNZ R7, L1 DEC R2 DJNZ R4, LL2 SJMP$ DJNZ R3,LL0 SJMP STOP 4.8 思考与练习题7.设有100个无符号数,连续存放在以2000H为首地址的存储区中,试编程统计奇数和偶数的个数。 R3为偶数个数,R2为奇数个数R4为0的个数。 MOV R7 ,#100 MOV DPTR,#2000H MOV R2,#0 MOV R3,#0 MOV R4,#0 MOV B,#2L1: MOVX A,@DPTR JNZ L0 4.8 思考与练习题INC R4 L0:L2: L3:SJMP L3 DIV AB MOV A,B JNZ L2 INC R3 SJMP L3 INC R2 INC DPTR MOV B,#2 4.8 思考与练习题DJNZ R7,L1 END8.将片外RAM地址为1000H~1030H的数据块,全部搬 迁到片内RAM30H~60H中,并将原数据区域全部清?0”。 MOV R7,#31H MOV DPTR, #1000H MOV R0,#30H 4.8 思考与练习题L0:MOVX A,@DPTRMOV @R0,A CLR A MOVX @DPTR,A INC DPTR INC R0 DJNZ R7,L0 END 4.8 思考与练习题9.从20H单元开始有一无符号数据块,其长度在20H单元。求出数据块中最小值,并存入21H单元。 MOV R7,#1FH MOV R0,#20H MOV A,@R0 MOV R1,A L0: INC R0 MOV A,@R0 CLR C 4.8 思考与练习题SUBB A,R1JNC L1 MOV A,@R0 XCH A,R1 L1: DJNZ R7,L0 MOV 21H,R1 END 10.在以2000H为首地址的存储区中,存放着20个用 ASCⅡ码表示的0~9之间的数,试编程将它们转换成 BCD码(即一个单元存放两位BCD码)的形式存放在 3000H~3009H单元中。 4.8 思考与练习题设R0为2000H低位首地址,R1为3000H低位首地址L0:MOV R7,#20 MOV R0 ,#0 MOV R1 ,#0 MOV DPTR,#2000H MOVX A,@DPTR ANL A,#0FH MOV R2,A INC R0 MOV DPL,R0 4.8 思考与练习题MOVX A,@DPTRANL A,#0FH SWAP A ORL A,R2 MOV DPH,#30H MOV DPL,R1 MOVX @DPTR,A INC R0 INC R1 MOV DPL,R0 MOV DPH,#20H 4.8 思考与练习题DJNZ R7,L0END11.试编写一双字节有符号数除法子程序。设被除数存放在20H,除数存放在30H,商存放在20H, 余数30H,符号位20H FLAG BIT 20H MOV R5,#0E5H MOV R4,#0E5H MOV R3,#80H 4.8 思考与练习题MOV R2,#55HCLR BINDIV:CLR MOV MOV MOV MOV XRL RLC MOV20H A ;部分余数单元清&0& R7,A R6,A R0,#10H ;除法移位次数 A,R5 A,R3 A 20H,C 4.8 思考与练习题MOV A,R5LP:CLR MOV MOV CLR MOV CLR MOV RLC MOVACC.7 R5,A A,R3 ACC.7 R3,A C A,R4 A R4,A;移位 4.8 思考与练习题MOV A,R5RLC MOV MOV RLC MOV MOV RLC MOVA R5,A A,R6 A R6,A A,R7 A R7,A;部分余数减除数LP1: MOV A,R6 4.8 思考与练习题SUBB A,R2MOV R1,A MOV A,R7 SUBB A,R3 JC SMALL MOV R7,A MOV A,R1 MOV R6,A INC R4 SJMP LP1;商加1 4.8 思考与练习题SMALL: DJNZ R0,LPMOV 20H,R7 JB 07H,ADD1 CLR C MOV A,R6 RLC A MOV R6,A MOV A,R7 RLC A;四舍五入 4.8 思考与练习题SUBB A,R3JC RETURN JNZ ADD1 MOV A,R6 SUBB A,R2 JC RETURN ADD1: MOV A,R4 ADD A,#01H MOV R4, A MOV A, R5;商加1 4.8 思考与练习题ADDC A,#00HJNB FLAG, XX SETB ACC.7 XX: MOV R5,A RETURN:RET12.试编写一多字节BCD码加法程序。设字节数存R7,被加数BCD码存在以20H~23 H单元 首地址存R0,加数BCD码存在以30H~33H ,单元首地址 存R1,和存放在30H~34H。 4.8 思考与练习题MOV R7,#4L0:MOV MOV CLR MOV CLR MOVR0,#20H R1,#30H A 34H,#0 C A,@R0ADDC A,@R1 4.8 思考与练习题DA AL1:MOV @R1,A INC R0 INC R1 DJNZ R7,L0 JNC L1 MOV @R1,#1 SJMP $ END 4.8 思考与练习题13.试编程将ROM中自2000H单元开始的100个数,按顺序移至片外RAM以2080H单元开始的存储区中。MOV R7, #100MOV MOV CLR MOVR0, #0 R1, #80H A DPTR, #2000H 4.8 思考与练习题LOOP:MOVC A, @A+DPTR MOV DPL, R1 MOVX @DPTR, A INC R1 INC R0 MOV DPL, R0 CLR A DJNZ R7, LOOP END
蔡​美​琴​第​二​版第四章习题解答(仅供参考) 第四章习题解答(仅供参考) 4―1 若有两个无符号数。 x、y 分别存放在内部存储器 50H、51H 单...第四章 80C51 的程序设计习题及答案 1、80C51 单片机汇编语言有何特点? 、 单片机汇编语言有何特点? 答: 80C51 单片机汇编语言的源程序结构紧凑、 灵活, 汇编...第四章习题与思考答案 4-3 外设端口有哪两种编址方法?各有什么特点? 答:...中断源 4-11 MCS-51 单片机中断响应的条件有哪些?如何进行中断响应 的操作? ...单片机第四章习题答案 选择题 1-5 BACAA, 6-10 BAADA, 11-14 CCAD 问答题 1.MCS-51 系列单片机定时计数器的定时功能和计数功能有什么不同?分别应用在什么...第四章习题 1、何为“准双向 I/O 接口”?在 MCS-51 单片机的四个并口中,...2、80C51 单片机有几个定时/计数器?它们由哪几个功能寄存器组成?怎样实现 定时...第四章 80C51 系列单片机指令系统 41 80C51 系列中所有单片机是否使用完全相同的指令系统? 系列中所有单片机是否使用完全相同的指令系统? 答: 80C51 系列单片机以 ...单片机第四章习题解答_工学_高等教育_教育专区。第四章习题 参考答案 4―1 若有两个无符号数。 x、 y 分别存放在内部存储器 50H、51H 单元中,试编写一个...第二章 80C51 的结构和原理习题及答案 1、80C514 单片机在功能上、工艺上、程序存储器的配置上有哪些种类? 答:80C51 单片机在功能上有两种大类: (1) 、...第4章《单片机原理与C51基础》赵丽清(课后习题及...【4-11】若 80C51 的晶振频率为 6MHZ,试计算...第四章思考题答案: 【4-1】解答:程序设计者使用...单片机原理及应用课后习题答案第5章作业_互联网_IT/...(可参考第四章的电子教案中的例子) 18.第 5 章...中断响应后,利用 D 触发器的 SD 端接 80C51 的...
All rights reserved Powered by
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 单片机存储器结构 的文章

 

随机推荐