




已阅读5页,还剩29页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
微机原理与接口技术程序、算法和编程第3章 程序、算法和编程通过前序课程(C语言程序设计、汇编语言程序设计、数据结构等)应该已经掌握(不是学过)了程序设计、算法、编程环境和程序调试的基本内容。请拿出纸笔,回答以下问题:页眉位置填写个人信息4内容:专业(可简写)、班级、姓名、学号(后4位即可)(版芯部分(留出页眉、页脚、左右边距以后的区域)填写正式内容:)1、什么叫(计算机)程序?答:(10个字以内)2、解释“算法”二字的含义?答:(10个字以内)3、计算机程序设计的算法的详细程度与编程语言的关系?(或者说:高级语言算法与汇编(机器)语言算法的区别?)答:(2行以内)4、说出几种学过的典型算法的名称。(不用说内容,仅仅说出名称即可!)答:5、为什么要有编程环境?答:(20个字以内)6、解释集成开发环境(IDE)的含义?缩写IDE的英文展开?答:7、写出程序的三种基本结构(的名称)。答:(12个字)8、写出程序调试的三种常用方法。答:(12个字)9、以“5门课的成绩,分别排序”为例,说明“自顶向下、逐步细化”的程序编写方法。答:(20个字以内)10、以“5门课的成绩,分别排序”为例,说明“自下而上、逐步完善”的程序编写方法。答:(20个字以内)(请把方框看成纸张的边缘,按示范的位置填写指定内容!今后作业和实验报告都按照这样的格式!)信息院 电子 0701 XX号 XXX1、什么叫(计算机)程序?答:(10个字以内)命令的有效组合。2、解释“算法”二字的含义?答:(10个字以内)算法就是步骤。3、计算机程序设计的算法的详细程度与编程语言的关系?(或者说:高级语言算法与汇编(机器)语言算法的区别?)答:(2行以内)算法的每一步应该是所用语言的指令/命令能实现(能表达)的动作, 高级语言算法的每一步可以是复杂的动作,汇编(机器)语言算法的每一步只能是简单动作。4、说出几种学过的典型算法的名称。(不用说内容,仅仅说出名称即可!)答:排序、查找、枚举、迭代、递归、5、为什么要有编程环境?答:(20个字以内)命令翻译和调试。6、解释集成开发环境(IDE)的含义?缩写IDE的英文展开?答:早期的编程环境是几个独立的程序:编辑程序、编译程序、连接程序、调试程序、为了用户操作的方便,后来出现了把独立程序集成在一个窗口界面的形式,用户进入这个窗口界面,通过菜单选择具体的操作,这就称为集成开发环境。I集成 IntegratedD开发 DevelopmentE环境 Environment7、写出程序的三种基本结构(的名称)。答:(12个字)顺序结构、分支结构、循环结构8、写出程序调试的三种常用方法。答:(12个字)连续执行、单步执行、断点执行。9、以“5门课的成绩,分别排序”为例,说明“自顶向下、逐步细化”的程序编写方法。答:(30个字以内)先写出(针对5门课程的)5次空循环,然后写一门课排序的循环体。10、以“5门课的成绩,分别排序”为例,说明“自下而上、逐步完善”的程序编写方法。答:(30个字以内)先写出一门课成绩的排序程序,然后外面套上5次循环。参考答案:解释复印材料:单片机程序框架1、任何语言的程序都有一个严格的结构(为什么?)2、C语言的程序结构:预处理命令主函数子函数3、汇编语言程序结构:伪指令 (真)指令代码伪指令与程序功能无关,而是通知汇编程序对后续内容做什么样的处理。伪指令不会形成指令机器码。(真)指令表示程序的功能,每条真指令汇编以后得到一条指令机器码。4、不同的CPU有特定的指令系统从而有特定的程序格式(特定的伪指令和真指令)。(1)8086CPU的程序格式:DATA SEGMENT变量 DB/DW 数据表DATA ENDS;-EXTRA SEGMENT变量 DB/DW 数据表EXTRA ENDS;-CODE SEGMENTASSUME CS:CODE,DS:DATA,ES:EXTRAMAIN PROC FARSTART: MOV AX,DATA MOV DS,AX MOV AX,EXTRA MOV ES,AX ;主程序的具体内容 CALL SUB1 MOV AH,4CH INT 21H MAIN ENDP;-SUB1 PROC NEAR ;子程序1的具体内容 RETSUB1 ENDP;- ;-CODE ENDS END START(2)51单片机的CPU比8086简单,没有存储器分段的必要,所以伪指令少得多,格式也简单:;第一部分为若干符号常量定义伪指令(可有可无,复杂程序一般都有!)ST_ADDR EQU 0000H R7_LS DATA 30H R6_LS DATA 31H START_KEY BIT 20H.0 TIME_KEY BIT 20H.1 ;第二部分是用ORG伪指令定义的各个基本程序入口(ROM 中有6个特定地址!)ORG 0000H ;前面定义了ST_ADDR,所以这里可以写ORG ST_ADDRLJMP 主程序起始标号(如START)ORG 0003H ;或者ORG ST_ADDR+03HLJMP 外部中断0的服务程序起始标号ORG 000BH ;或者ORG ST_ADDR+0BHLJMP 定时器T0的服务程序起始标号ORG 0013H ;或者ORG ST_ADDR+13HLJMP 外部中断1的服务程序起始标号ORG 001BH ;或者ORG ST_ADDR+1BHLJMP 定时器T1的服务程序起始标号ORG 0023H ;或者ORG ST_ADDR+23HLJMP 串行口中断的服务程序起始标号;第三部分是用ORG伪指令定义了具体位置的主程序、子程序、中断服务程序ORG ST_ADDR+100HSTART: 端口初始化 具体处理程序子程序1标号: RET子程序2标号: RET中服1标号: RETI 中服5标号: RETI;第四部分是数据表(可有可无!)变量名: DB/DW 数据表END ;最后必须有END,标明程序的结束位置,否则汇编报错!3.1 指令格式和常用伪指令3.1.1 汇编语言、应用程序、汇编程序、指令格式用汇编语言编写的程序需要一个配套的汇编程序把助记符指令翻译为2进制指令。学习8086汇编语言的时候,所用的汇编程序是MASM.EXE,现在学习51单片汇编语言,也有一个配套的汇编程序A51。1. 要点每种CPU有各自的一套机器指令;机器指令的集合称为机器语言;每条机器指令符号化就是助记符指令汇编指令;汇编指令的集合称为汇编语言;用汇编语言编写的应用程序,经过配套的汇编程序翻译为机器指令才能被CPU理解和执行。2. 汇编程序功能 汇编程序规定了助记符与机器指令的对应关系以及指令的书写规范:51汇编语言指令格式: 简单表达: 操作码 操作数详细表达: 标号: 指令助记符 操作数1,操作数2,操作数3 ;注释说明:指令基本内容是操作码和操作数; 操作码由35个字母构成,不区分大小写;操作数可以有0、1、2、3个,其中双操作数指令最典型;操作数与助记符用空格分隔,操作数之间逗号分隔;指令之前可以有标号,指令之后可以有注释;标号以字母打头,冒号结尾,长度有限,标号不能是助记符;指令中常数可4种进制,用尾符标识,省略尾符标识则系统默认为10进制数;注释以分号开头,分号以后可以是任何文字。 要求:教材给出了每条指令的机器码,第一次实验预习内容就是人工汇编! 汇编程序提供(定义了)便于用户编程的伪指令、运算符以及宏操作(宏定义、宏汇编):运算符有算术运算、逻辑运算、关系运算三类,可以将常量和运算符组成的表达式作为一个操作数写在指令中(MOV A,#5*3+2),汇编程序在汇编时将表达式的值计算出来作为操作数。宏操作就是用户自定义指令,包括宏定义、宏调用、宏展开三个概念。3.1.2 伪指令MCS-51汇编程序提供的常用伪指令有:1. 定位伪指令(决定后续真指令的存储地址)格式:ORG ROM地址 例: ORG 4000H功能:告诉汇编程序将ORG指令以下的真指令的机器码从给定的地址开始顺序存放2. 汇编结束伪指令:格式:END功能:告诉汇编程序程序到此为止,以下内容不再汇编。3. 符号常量定义伪指令(赋值伪指令):格式:常量名 EQU n(n可为单字节常数、双字节常数、寄存器名)功能:使常量名获得n的值,在程序指令中使用该常量名就代表数n。例:ST_ADDR EQU 4000H ;定义了ST_ADDR代表4000H这个数值 则可以在后面使用: ORG ST_ADDR ;等效于 ORG 4000H MOV DPTR, #ST_ADDR ;等效于 MOV DPTR,#4000H4. 位变量定义伪指令:格式:变量名 BIT 位地址功能:使变量名获得位地址,在程序指令中使用该变量就代表对应位。5. 字节定义伪指令:(程序中定义表格)格式:变量名: DB 逗号分隔的数据表 (8位以内2进数或单引号内ASCII字符)功能:告诉汇编程序给数据表中每个数据安排一个字节的空间。例: SCORE: DB 77, 65, 88, 34CHAR: DB A, 41H, 0, 06. 字定义伪指令:格式:变量名: DW 逗号分隔的数据表(16位以内2进制数)功能:告诉汇编程序给数据表中每个数据安排一个字的空间。7. 程序地址计数器$:程序中使用符号“$”,就等于使用$所在指令的地址,例如:JNB RI, $ 就是原地循环。8. 变量、标号命名规则:字母或下划线打头,后跟字母、数字、下划线,长度30字符;无论变量和标号,必须跟冒号。3.1.3 常用缩写符号介绍指令格式的时候,表示寻址等内容不能一一枚举具体描述,因此定义了一些通用符号:立即数的符号: #表示立即数;#data表示8位立即数,例如 MOV A, #data#data16表示16位立即数, 例如 MOV DPTR, #data16直接寻址的符号: direct表示8位直接地址或专用寄存器名称;bit表示某可寻址位的地址;寄存器寻址的符号: Rn表示R0-R7中的任何一个;间接寻址的符号: 表示间接寻址;Ri表示R0或R1; MOV A, R1跳转指令中的地址符号: addr16表示16位地址,长跳转指令中使用;addr11表示11位地址,区内跳转指令中使用;rel表示8位带符号相对地址偏移量,页内跳转;用语言文字描述指令执行过程时用到括号:(数值)表示直接寻址,即括号内的数值是单元地址,如(30H)就表示以30H单元的内容为操作数;把(30H)赋值给A 把(30H)赋值给A结果A中得35H 结果A中得到2FH 中间过程: 因为(30H)30H单元的内容35H 所以(30H) (35H) 而(35H)2FH 所以(30H)2FH55H35H2FH 12H2EH2FH30H31H32H33H34H35H36H37H39H38H(数值)表示间接寻址,即以括号内数值为地址,找到一个单元以后,单元的内容仍然是地址,按这个地址再找到一个单元,此单元的内容为操作数。 3.2 寻址方式寻址方式就是数据或地址的表示方法。学习的时候,注意分别记忆和理解数据的寻址指令中对操作数的表示方法;地址的寻址跳转指令中的跳转目的位置的表示方法MCS-51的数据存储位置有:通用寄存器、专用寄存器、内RAM、外RAM、内外统一的ROM,有五种寻址方式:立即数寻址、寄存器寻址、直接寻址、寄存器间接寻址、基址加变址寻址。MCS-51的ROM空间最大64K,地址变化范围分为三种情况:1字节符号数(表示相对地址)、11位地址(区内地址)、16位地址(长调用和长跳转地址)。1. 有关数据的五种寻址方式:立即数寻址:指令中以#为前缀的操作数就是立即数寻址,汇编以后操作数与指令操作码一起存放于ROM中(立即数是指令机器码的组成部分),读取指令的同时就得到了操作数,因此立即数没有地址,或者说立即数就在ROM中程序指令中。例:MOV A,#30H ;其中的30H就是立即数,功能:把30H赋值给累加器A(使累加器存有30H)。寄存器寻址:指令中用工作寄存器R0-R7、累加器A、通用寄存器B、16位地址寄存器DPTR以及进位标志C所表示的操作数,就是这些寄存器的内容。例如:MOV A,#30H中的A属于寄存器,MUL AB中的AB和MOV DPTR,#2000H中的DPTR都属于寄存器。直接寻址:指令中直接写出单元地址、专用寄存器名称或地址、位地址、位名称,可以访问内RAM的128字节、专用寄存器、可寻址位(位寻址)。例如: MOV A,30H ;把内RAM 30H单元的值付给A,30H就是内RAM的30H单元MOV 81H,6FH ;81H就是专用寄存器SP,可以写成MOV SP, 6FH 注意:专用寄存器有地址也有名称,在指令中无论用名称还是用地址都属于直接寻址。寄存器间接寻址:以寄存器的内容为地址。能够间接寻址的寄存器只可以是R0、R1和DPTR,以打头表示间址,可访问内外RAM。对内可以使用MOV指令以及R0、R1间址,访问内部RAM的全部128字节。对外可以使用MOVX指令以及R0、R1间址,访问256字节的范围;更多是使用MOVX指令以及DPTR间址,访问全部64K空间。例如:MOV A,R0、MOVX A,R0、MOV DPTR,A。对于PUSH和POP指令,认为是以SP为寄存器的间接寻址。基址加变址寻址:只用于访问ROM,基址只能是DPTR或PC,变址只能是A。具体指令只有MOVC A,A+PC和MOVC A,A+DPTR两种形式。单片机ROM外RAM和接口寄存器内RAM007FH内RAM80FFH直接寻址和间接寻址基址变址寻址间接寻址立即寻址:无地址专用寄存器80FFH寄存器寻址:R0-R7、A、B、DPTR、进位C间接寻址直接寻址归纳:只有内RAM的00-7FH有两种寻址方式,其余空间都仅有一种寻址方式。2. 有关跳转的寻址方式条件跳转指令采用相对寻址方式,就是指令中的操作数不是跳转的绝对地址,而是对程序计数器PC值的修正量(偏移量)。无条件跳转和子程序调用属于绝对跳转,用目的地址取代PC原有值。相对跳转PC与偏移量叠加绝对跳转PC被目的地址替换51单片的跳转寻址只有一种直接寻址方式,即在跳转或调用指令中用标号表示出目的地址,汇编程序会根据指令的功能把标号译为偏移量或绝对地址。3. 关于布尔处理机和位寻址51单片提供较强大的位寻址功能,将这一功能称为布尔处理机或位处理机。有17条位处理指令。可以位寻址的区域有两个,一个是内RAM中有16个字节单元(20H2FH)除了可以按字节地址整体访问,还对这16个单元的每一位进行了编址,共计有128个可寻址位,位地址00H7FH,使用位处理指令时可以直接寻址这些位;二是在21个专用寄存器中有12个可位寻址的寄存器,这些位也有位地址(范围在80HFFH,中间有间断),同时还有位名称,访问时写地址和写名称等效,汇编程序都能识别(写名称更便于人的理解)。位寻址也属于直接寻址。3.3 程序状态字和指令类型3.3.1 程序状态字PSW任何CPU都有一个存放程序运行装态和设置参数的寄存器,称为程序状态字(Program Status Word)。8086中称为标志寄存器(Flag Register)。51单片机称为PSW,是一个8位专用寄存器,存放程序状态信息,其中7位有定义: PSW.7 PSW.0 C AC F0 RS1 RS0 OV PCY(Carry)表示无符号数加减的进位/借位标志,可用命令置位和清零;AC(Assistant Carry)辅助进/借位标志(系统使用,与用户无关);F0为用户预留标志,可用命令置位和清零,可作为某种事件/状态的判断标志;RS1、RS0通用寄存器区选择,可用命令置位和清零;OV(Overflow)表示有符号数加减的溢出标志,可用命令置位和清零;P(Parity)累加器中为1的位的个数的奇偶标志,奇数P1,可用命令置位和清零;51的状态标志只有4个,其中前3个与运算结果相关,最后一个P标志与运算无关(永远反映A的现状):l 进位CY与运算结果相关。CY标志表示无符号数运算结果溢出(有进位或借位)。布尔操作指令中CY是位操作的累加器l 半进位AC与运算结果有关。AC标志用于BCD调整指令。l 溢出OV与运算结果有关。OV用于表示有符号数的运算结果溢出(OVD6D7)。l 奇标志P时刻反映累加器ACC的奇偶状态,无论对A的赋值还是运算都影响P。对PSW赋值也不能控制此位!影响标志的指令:(表示有影响)指令助记符影响的标志CYOVACADDADDCSUBBMULDIVDARRCRLCSETB CCLR CANL C,bitANL C,/bitORL C,bitORL C,/bitMOV C,bitCJNE00103.3.2 51指令概况44个助记符、33种功能、111条指令、255种机器码。111条指令中:指令长度 单字节49、双字节46、三字节16计算机指令执行时间的相关概念:l 时钟利用振荡电路产生稳定、均匀的方波(脉冲),作为所有电路动作的节拍信号。(保证数字电路动作的步调一致。几百万、上千万个门电路不能各自为政!)l 时钟周期振荡电路的振荡周期,这是指令动作的最小时间单位。l 机器周期固定的若干时钟周期作为一个较大时间单位,这是完成指令一个分解动作需要的时间。51单片机是以12个时钟周期为一个机器周期。l 指令周期执行一条指令需要的机器周期数(只能是整数)。注意:从机器周期的定义可以看出,一条指令的执行时间是以机器周期为单位,不是以时钟周期为单位。这也有助于反过来理解为什么有机器周期这个单位。 执行时间 单周期64、双周期45、四周期2 111条指令分为5类: 数据传送29条(8个助记符) 算术操作24条(8个助记符) 逻辑操作24条(9个助记符) 控制转移17条(13个助记符) 布尔操作17条(11个助记符,其中与前面重复5个)下面的指令表中,“字节数”一栏是该指令翻译成机器码(2进制形式)的长度,指令长度是以字节为单位,或1字节、或2字节、或3字节(其它CPU的指令系统可能还有更长的),不存在非整数字节的情况。下面的指令表中,“振荡器周期”一栏就是时钟周期数,51单片机以12个振荡周期=1个机器周期,可以看出51的指令执行时间或是1机器周期、或是2机器周期、或是4机器周期。数据传送指令一览表位操作指令一览表:指令格式指令功能指令长度(字节数)执行时间(机器周期)MOV C,bitMOV bit,CCLR CCLR bitCPL CCPL bitSETB CSETB bitANL C,bitANL C,/bitORL C,bitORL C,/bitJC relJNC relJB bit,relJNB bit,relJBC bit,rel 直接寻址位送位累加器CYCY值送直接寻址位CY清0直接寻址位清0CY取反直接寻址位取反CY置1直接寻址位置1CY“与”直接寻址位CY“与”直接寻址位的“非”CY“或”直接寻址位CY“或”直接寻址位的“非”CY1则跳转CY0则跳转直接寻址位1则跳转直接寻址位0则跳转直接寻址位1则跳转并对该位清022121212222222233111111112222222223.4 数据传送指令3.4.1 内部数据传送指令MOV、PUSH、POP、XCH、XCHD指令(本教材把SWAP指令列入逻辑指令中)3.4.2 累加器A与外部数据存储器传送指令MOVX指令3.4.3 查表指令(累加器A读取ROM的指令)MOVC指令例3.21、例3.22 乘法、除法指令例3.1 以A为目的数的传送4种例3.2 以Rn为目的数的传送3种例3.3 以Direct为目的数的传送5种例3.4 以Ri为目的数的传送3种例3.5 传送指令综合使用例3.6 入栈:SP+1,内容存入SP所指单元例3.7 出栈:SP所指单元内容弹出,SP-1例3.8、例3.9 交换指令例3.10、例3.11 、例3.12 查表指令3.5 算术运算指令3.5.1 加法指令ADD、ADDC、INC、DA指令3.5.2 减法指令SUBB、DEC指令3.5.3 乘法指令MUL指令3.5.4 除法指令DIV指令例3.12、例3.13 、例3.14 ADD指令例3.15 ADDC指令例3.16 INC指令例3.17、例3.18 DA A指令例3.19、例3.20 SUBB 和 INC指令例3.21、例3.22 乘法、除法指令3.6 逻辑指令3.6.1 累加器A的逻辑操作指令CLR、CPL、RL、RR、RCL、RCR指令,SWAP指令(有的书把SWAP列入传送指令)3.6.2 两个操作数的逻辑操作指令ANL、ORL、XRL指令例3.23 CPL A 指令例3.24 SWAP A 指令例3.25、例3.26 ANL指令6条例3.27、例3.28 ORL指令6条例3.29、例3.30 XRL指令6条3.7 位操作指令3.7.1 位变量传送指令MOV指令3.7.2 位变量修改指令CLR、CPL、SETB指令3.7.3 位变量逻辑操作指令ANL、ORL指令例3.31 位变量传送指令例3.32 位变量修改指令例3.33 位变量逻辑与指令例3.34 位变量逻辑或指令3.8 控制转移指令3.8.1 无条件转移指令AJMP、SJMP、LJMP、JMP指令3.8.2 条件转移指令JZ、JNZ、JC、JNC、JB、JNB、JBC、CJNE、DJNZ指令3.8.3 调用和返回指令ACALL、LCALL、RET、RETI指令例3.35 AJMP指令例3.36 SJMP指令例3.37 LJMP指令例3.38 JMP A+DPTR指令 例3.39 CJNE指令 例3.40 DJNZ指令,软件延时程序 例3.41 ACALL指令 例3.42 LCALL指令 例3.43、例3.44 RET指令关于散转指令:跳转指令中唯一一条间接转移指令为: JMP ADPTR用途解释:假设有一个100个分支的程序,要求根据累加器A中的数值选择其中一个执行:(用非正规的语言)表达为: IF (A=0) JMP BRANCH0 ELSEIF (A=1) JMP BRANCH1 ELSEIF (A=2) JMP BRANCH2 ELSEIF (A=98) JMP BRANCH98ELSE JMP BRANCH1进行这个分支选择,需要对A进行平均50次的判断(判断就是比较计算),费时间。请看一段跳转指令: TABLE: AJMP PRG0 ; AJMP是双字节指令AJMP PRG1AJMP PRG2AJMP PRG3AJMP PRG4 AJMP PRG126AJMP PRG127注意这段程序的代码保存在TABLE标号所代表的起始地址中,TABLE+0位置存放的是AJMP PRG0指令,TABLE+2位置存放的是AJMP PRG1指令,。地址增量为2可以找到下一条指令。如果我们从另外一个位置,执行另外一条跳转指令: 执行“JMP 0+TABLE”,就可以跳到AJMP PRG0这句,而执行这句就可以跳到PRG0; 执行“JMP 2+TABLE”,就可以跳到AJMP PRG1这句,而执行这句就可以跳到PRG1; 执行“JMP 4+TABLE”,就可以跳到AJMP PRG2这句,而执行这句就可以跳到PRG2; 执行“JMP 6+TABLE”,就可以跳到AJMP PRG3这句,而执行这句就可以跳到PRG3; 执行“JMP 8+TABLE”,就可以跳到AJMP PRG4这句,而执行这句就可以跳到PRG4; 如果要求根据A值(A值为0127),分别跳转到128个程序分支,就可以定义上面的跳转指令表,结合一句: “JMP A2TABLE” 来实现。JMP A+DPTR 就是完成这种功能的。具体应用共需要三条指令: DPTR内装入TABLE地址MOV DPTR,TABLEROL A最后:JMP A+DPTR可以看出:由于是用A的内容*2 作为偏移量,所以散转的分支最多128个。(A的原始值超过127,乘2以后会溢出!)如果用LJMP指令构造散转表,则必须用A*3作为偏移量,这样散转的分支最多(256/3)=85(取整)!补充例题: 写一个子程序,功能是根据A中的值对P1、P3口读入的数据进行加、减、乘、除运算。(假设A取值为0、1、2、3,调用子程序之前已经获得,就是说:A是子程序的调用参数!)解:FOUR: MOV P1,#0FFHMOV P3,#0FFHMOV DPTR,#TABLERL AJMP A+DPTRTABLE: AJMP PRG0 AJMP PRG1 AJMP PRG2 AJMP PRG3PRG0: MOV A,P1 ADD A,P3MOV P1,ACLR AADDC A,#0MOV P3,ARETPRG1: MOV A,P1 CLR CSUBB A,P3MOV P1,ACLR ARLC AMOV P3,ARETPRG2: MOV A,P1 MOV B,P3MUL ABMOV P1,AMOV P3,BRETPRG3: MOV A,P1 MOV B, P3DIV ABMOV P1,AMOV P3,BRET3.9 程序设计方法这里仅仅介绍了软件设计的有关方法。3.9.1 程序设计的步骤 需求分析 总体方案 算法设计 数据结构 编程实现 运行调试 整理优化3.9.2 程序框图和程序结构1. 程序框图粗框图、细框图2. 框图设计工具Visio、Word等均可。3. 程序基本结构顺序结构、分支结构、循环结构(1)顺序程序无需解释。(2)典型分支程序是用条件跳转指令构成:根据某个条件选择事先编好的两段程序之一来执行。分支程序的灵活运用可以构成多分支、嵌套分支以及循环结构。复习51单片机的指令,归纳出能够实现分支控制的指令有:l 控制转移指令中的:JZ、JNZ、D JNZ、CJNEl 位操作指令中的:JC、JNC、JB、JNB、JBCl 无条件跳转指令:LJMP、SJMP、JMP也能构造分支,但属于强行分支,不是条件分支。条件分支的几种情况以及表达:JNB TI,$ CJNE R0, #2FH, LOOP DJNZ 31H, LOOP 对于学过汇编语言的同学们,这些应该已经掌握。下面的例题重点介绍循环程序(其中反复用到了分支和顺序):3.9.3 循环程序的设计方法1. 循环程序要点(1)循环程序的结构: 初始化 ;这句话(对每个循环)只能执行一次 循环体 ;重复执行的部分 循环控制 ;判断条件,循环终止条件不出现就继续返回到循环体,否则下行(2)C语言的循环结构:初始化和循环控制在一条语句中! For (条件) 循环体 Do while(条件) 循环体 While(条件) 循环体(3)8086的循环结构: MOV CX, 循环次数标号:循环体 LOOP 标号 ;此指令先对CX减1,然后判断CX值,不为0则跳到标号,为0则下行(4)51的循环结构 51的DJNZ就是循环指令(DEC以后NOT ZERO 就JMP) 所以,DJNZ指令要跟着两个操作数,一个是DEC谁、另一个JMP到哪! 由于DEC的对象可以指定,所以比8086限定CX似乎更灵活了。 重温DJNZ指令:DJNZ Rn, relDJNZ direct, rel一般使用Rn较多:MOV R2,#100L1: 循环体DJNZ R2, L1这就是51的循环程序结构,我们要严格把握单层循环结构,才能在多重循环的时候不自乱阵脚。例3.45 n个数求和的思路。 算法算法实现累加器Y清零,循环次数n例3.46循环标号: Y=Y+Xi n=n-1 n0 跳到循环标号 Y中即累加结果例3.46 从50H单元存放n个字节数据,字节数n存放在R2,求和得到双字节存放在R3R4。解:NSUM:MOVR3,#0 MOVR4,#0 ;清空累加器MOVR0,#50H ;R0指向50H单元LOOP:MOVA,R4 ;累加和的低字节ADD A,R0 ;与指针所指的一个数据相加MOVR4,A ;A的值存回R4,这就是累加和的低字节CLR A ;A清空ADDCA,R3 ;进位C与R3相加MOVR3,A ;结果存回R3INC R0 ;修改指针DJNZR2,LOOP ;循环控制RET ;这是子程序,思考其入口参数和出口参数是什么?例3.47 设在外部RAM中有一个字符串(ASCII码串),首地址在DPTR,串的长度用特征字符来控制(以0为结束标志)。要求从串行口把这个字符串发送出去。假定串行口已经设置完毕,写出发送程序。解:串行发送数据的基本步骤取得要发送的数据(字节);放入串口的数据寄存器SBUF中;等待串口发送完毕(TI=1);令TI=0接着进行步骤。(我们把字节数据放入串口电路,串口电路进行逐位发送,所以需要时间。)SOUT:MOVXA,DPTR ;取得一个字符JNZ SOUT1 ;不是结束标志,转到发送程序RET ;是结束标志,子程序返回SOUT1:MOVSBUF,A ;教材程序不够常规!JNB TI,$CLR TIINC DPTRSJMPSOUT例3.48 把内部RAM 30H32H单元的内容左移4位,移出的内容存放于R2。0000000066665555444433332222111132H31H30HR20000666655554444333322221111000032H31H30HR2原始状态移位结果解:算法一:利用字节交换指令和半字节交换指令实现要求RL43:MOVR0,#32H ;指针指向32H单元CLR A ;A=0000 0000LOOP:XCHDA,R0 ;半字节交换,第一次A=0000 1111, (32H)=2222 0000SWAPA ;A=1111 0000XCHa,r0 ;字节交换,A=2222 0000,(32H)=1111 0000DEC R0 ;修改指针CJNER0,#2FH,LOOP ;循环控制SWAPA ;A=0000 6666MOVR2,A ;传给R2RET算法二:例3.50 例题3.48的3字节左移4位的操作可以用带C的循环移位指令来实现。RLC43: MOVR7,#4 ;移位次数MOVR2,#0 ;清空R2LOOP0:MOVR0,#32H ;R0指向32H单元MOVR6,#3 ;3个单元CLRC ;C=0LOOP1:MOVA,R0 ;取出一个单元移位前的数据RLCA ;左移1位,C中的值进入A最低位,A最高位进入CMOVR0,A ;变化以后的A的值存回原单元DECR0 ;修改指针DJNZR6,LOOP1 ;循环3次,3个字节都移动了1位,最终C中内容该进R2MOVA,R2 ;取出R2原值RLC A ;C值进入A的最低位MOVR2,A ;存回R2DJNZR7,LOOP0 ;移4位RET2. 多重循环例3.49 50ms延时子程序延时时间计算标号指 令指令长度和执行时间指令执行次数合计周期数DEL:MOV R7,#200双字节、单周期指令11*1=1DEL1:MOV R6,#125双字节、单周期指令200200*1=200DEL2:DJNZ R6,DEL2双字节、双周期指令125*200125*200*2=50000DJNE R7,DEL1双字节、双周期指令200200*2=400RET单字节、双周期指令11*2=2总计周期数(教材上的计算有误 !)50603个机器周期假设系统时钟为12MHz,则1个机器周期是1us,运行上述程序的时间就是50.603ms。如果要求时间更准确,就需要精细调整循环次数。基本原则:改变内层循环次数。从上面计算结果可知,误差是+603个机器周期,所以内循环次数减少1.5次就可以减少600个机器周期。但是循环次数无法出现小数,如果内循环次数减少1次,误差+200个机器周期,如果内循环次数减少2次误差-200个机器周期。利用单周期的NOP指令可以解决-200这个误差:标号指 令指令参数指令执行次数合计周期数DEL:MOV R7,#200双字节单周期指令11*1=1DEL1:MOV R6,#123双字节单周期指令200200*1=200NOP单字节单周期指令1*2001*200*1=200DEL2:DJNZ R6,DEL2双字节双周期指令123*200123*200*2=49200DJNE R7,DEL1双字节双周期指令200200*2=400RET单字节双周期指令11*2=2总计周期数(教材上的计算有遗漏 !)50003个机器周期对于更长时间的软件延时,一般方法是编写一个较小单位的基本演示程序,然后用循环调用若干次地方法实现:例如上面的50ms延时程序已经确定,名称为DEL50:DEL50: MOV R7, #200DEL50_1: MOV R6,#123NOPDEL50_2: DJNZ R6, DEL50_2DJNZ R7,DEL50_1 RET1秒延时程序可以基于已经存在的50ms延时子程序如下构造:DEL1S: MOV R5, #20DEL1S_1: LCALL DEL50 DJNZ R5, DEL1S_1 RET3.9.4 子程序设计和参数传递方法1. 子程序的意义减少重复代码;减少程序长度;逻辑结构清晰;实现化整为零。2. 参数传递基本方
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 消防兵面试题目及答案
- 湘潭策划面试题目及答案
- 机械加工基础知识培训课件
- 网络检索面试题目及答案
- 新解读《GB-T 36145 - 2018建筑用不锈钢压型板》
- 南京去年中考数学试卷
- 灵璧一中高一数学试卷
- 历城区二下语文数学试卷
- 河湖景观照明与美化设计方案
- 老师改五年级的数学试卷
- 2025年医疗器械生产企业员工培训试题(附答案)
- 2025年中药调剂师试卷及答案
- 破局向新 持续向上-2025年人力资源发展趋势报告-智联招聘北大国发院
- 2025年公平竞争审查知识竞赛考试练习题库(正式版)含答案
- 自适应加密动态调整-洞察及研究
- 2025年北京市房屋租赁合同范本(个人版)
- (新教材)2025年秋期人教版二年级上册数学核心素养教案(第3单元)(教学反思有内容+二次备课版)
- 登革热与基孔肯雅热防控指南
- 2025年重庆市中考英语试卷真题(含标准答案及解析)
- 2025年时事政治考试题及参考答案(100题)
- 井工煤矿风险监测预警处置方案之安全监控系统监测预警处置方案
评论
0/150
提交评论