天正DWX71E23UKT5天正2014机器码怎么看注册码应该是多少

天正DWX71E23UKT54机器码注册码应该是多少_百度知道
天正DWX71E23UKT54机器码注册码应该是多少
才出现机器码,表示装了好多都不行,还有天正我还用了粘贴那两个系统文件夹用管理员权限也不行,还是不可以然后会出现单击锁那个东西,还是改了时间的,好麻烦,不过用管理员权限打开注册机还是不可以,64位操作系统,2014版本cad 天正9.0
我有更好的答案
2014建筑注册码:B2EDB
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁第2章51单片机指令系统2.1 汇编语言2.2 MCS-51单片机的指令系统 2.3 汇编程序的设计 2.1 汇编语言2.1.1 指令格式[标号:] 操作码助记符 [第一操作数] [,第二操作数] [;注释]标号是程序员根据编程需要给指令设定的符号地
址, 可有可无; 标号由1-8个字符组成,第1个字符必须是英文字, 不能是数字或其它符号;标号后必须用冒号“:”。操作码指明执行什么性质和类型的操作,如数据传 送操作,加法操作等。 [标号:]操作码助记符[第一操作数] [,第二操作数] [;注释]操作数指明操作的数本身或是操作数所在的地址。操作数一 般有以下几种形式:(1)没有操作数项,操作数隐含在操 作码中,如NOP指令;(2)只有1个操作数,如INC A指令; (3)有两个操作数,如MOV A, #20H指令,操作数之间以 逗号相隔;(4)有三个操作数,如CJNE A,#00H,NEXT指令, 操作数之间也以逗号相隔。 注释是对指令的解释说明,用以提高程序的可读性;注释前 必须加分号“;”。 2.1.2 指令中的常用符号??Rn: 表示当前工作寄存器R0~R7中的一个。@Ri: 表示寄存器间接寻址,常常作间接寻址的地址指 针。其中Ri代表R0和R1寄存器中的一个。 Direct: 表示内部数据存贮器单元的地址及特殊功能寄存 器SFR的地址,对SFR而言,既可使用它的物理地址,?也可直接使用它的符号名字。?#date: 表示8位立即数,即8位常数,取值范围为#00H~ #0FFH #date16: 表示16位立即数,即16位常数,取值范围为 #0000H~#0FFFFH? ? ? ? ?addr16: 表示16位地址 addr11: 表示11位地址 rel: 用补码形式表示的地址偏移量,取值范围为- 128~+127。Bit: 表示内部RAM和SFR中的具有位寻址功能的位地址。SFR 中的位地址可以直接出现在指令中,为了阅读方便,往往也可 用SFR的名字和所在的数位表示。如:表示PSW中奇偶校验位, 可写成D0H,也可写成PSW.0的形式出现在指令中。 @: 表示间接寻址寄存器或基址寄存器的前缀符号。 $: 表示当前指令的地址。? ??? ?/ : 位操作数的前缀,表示对该位操作数取反,如/bit。X: 片内RAM的直接地址或寄存器。 (X): 由X寻址的单元中的内容。 2.1.3指令系统的寻址方式寻址就是如何指定操作数所在的地址。 所谓寻址方式,就是如何找到存放操作数的地址,把操 作数提取出来的方法。 MCS-51单片机共有7种寻址方式,即: 2.1.3 指令系统的寻址方式1、立即寻址立即寻址是指操作数在指令中直接给出,通常把出现在指令中的 操作数称为立即数,立即数作为指令的一部分存放在代码段里。 例如2.1: MOV A,#30H; A←30H MOV DPTR, #1234H; DPTR←234H2、直接寻址直接寻址是将操作数的地址直接存放在指令中。 例2.2: MOV PSW,# 20H ;例2.3: MOV A,30H; A←(30H)注意:直接寻址方式只能使用8位二进制数表示的地址,故寻址范围只限于内 部RAM,即低128单元(直接以单元地址给出)和专用寄存器(以单元地址或 符号给出)。直接寻址是访问专用寄存器的唯一方法。 3、寄存器寻址 将操作数存放于通用寄存器中,以寄存器的内容为操作数 的寻址方式。通用寄存器指A、B 、DPTR以及R0~R7 。例2.4: CLR A INC DPTR ADD R5,# 20H4、寄存器间接寻址寄存器间接寻址是以寄存器中内容为地址,以该地址中内容为操作数 的寻址方式,即操作数是通过寄存器间接得到的。用来存放操作数地址的 寄存器称为指针。指针只能用R0、R1和DPTR。 寻址范围:(1)内部数据存储器――指针只能用R0或R1;(2)外部数 据存储器――指针用R0和R1或DPTR,外部低256单元的间址寄存器可用R0 和R1或DPTR,其他只能用DPTR作为间址寄存器。 注意:为了与寄存器寻址区别开,寄存器间接寻址方式要在 寄存器前加@; 间接寻址不能对SFR寻址。例2.5: 设(R0)=25H,内部RAM (25H)=37H, MOV A,@R0 指令的执行结果是:(A)=37H。 其指令操作过程示意图如 图所示。R0 25H RAM 地址 25H37HA37H寄存器间接寻址示意图 5、变址寻址将基址寄存器与变址寄存器的内容相加,结果作为操作数的地址。? DPTR或PC是基址寄存器;? 累加器A是变址寄存器;? 该类寻址方式主要用于查表操作。 例2.6:设(A)=02H,(DPTR)=2000H,外部ROM中, (2002H)=55H 执行指令 MOVC A,@A+DPTR 结果是 (A)=55H 程序说明:DPTR A 02H2000H (1)变址寻址只能针对程序存储器进行寻址,寻址范围64K; (2)变址寻址指令只有3条: MOVC A,@A+DPTR;器02H2000H55H MOVC A,@A+PC;ROM读指令JMP @A+DPTR;无条件转移指令 (3)均为单字节指令 图2.22002 H55H变址寻址示意图 6、相对寻址以当前程序计数器PC的内容为基础,加上指令给出的一字节补码数(偏移量)形成新的PC值的寻址方式,新的PC值作为跳转指令的转移地址(也称目的地址)。试问偏移量的范围为多少?-128~+127相对转移是以转移指令所在的地址为基点,向前(地址增加) 最大可转移(127+转移指令字节)个单元地址,向后(地 址减少)最大可转移(128-转移指令字节)个单元地址。 例2.7:1000H: SJMP 38HROMH 1002HPC+2 1002H 操作码A38H操作数103AH图2-3相对寻址示意图
7、位寻址位寻址是指对片内RAM中20H~2FH中的128个位地 址,以及SFR中的11个可进行位寻址的寄存器中的 位地址寻址。 例2.8: ① MOV ② MOV C,20H A,20H①指令是位寻址指令,它是将位寻址区中位地址为20H中的内容,送给位累加器C,传送的是一位二进制数。②指令是字节地址寻址指令,此指令是将内部RAM中20H单元中的内容送给累加器A,传送的是8位二进制数。 8051单片机寻址方式小结?对片内外程序存储器只能使用变址寻址方式,即变 址寻址是一种专门用于程序存储器的寻址方式。?内部数据存储器的寻址方式较多。低128单元 寻址方式 高128单元 (专用寄存器) 用户RAM区 位寻址区 通用寄存器区(FFH~80H) (7FH~30H) (2FH~20H) (1FH~00H)寄存器寻址 位寻址 直接寻址 部分间接寻址 8051单片机寻址方式小结?对于外部数据存储器,只能使用寄存器间接寻址方 式。寄存器间接寻址 以R0或R1作间址寄存器 以DPTR作间址寄存器 高地址单元 (FFFFH~0101H) 低地址单元 (H)?立即数寻址方式只涉及到8位或16位数据,已经在 指令中给出。 8051单片机寻址方式小结? ?相对寻址只解决程序转移问题。 在两个操作数的指令中,把左边操作数称之为目的 操作数,而右边操作数称之为源操作数。我们所讲 的各种寻址方式都是针对源操作数的。但实际上源 操作数和目的操作数都有寻址问题。 2.2 MCS-51单片机的指令系统51系列单片机指令系统由111条指令组成。 MCS-51指令系统可分为五大类: ? ? ? ? ? 数据传送指令(28条); 算术运算指令(24条); 逻辑运算及移位指令(25条); 控制转移指令(17条); 位操作指令或布尔操作(17条) 2.2.1数据传送指令数据传送操作是把数据从源地址传送到目的地 址,指令执行后源地址内容不变,目的操作数被源 操作数所代替。累加器 A直接地址 direct间接地址 @Ri寄存器 Rn立即数 #data寄存器 DPTR图2-4 MCS-51单片机片内数据传送图
1. 内部数据传送指令(1)以累加器A为目的操作数的指令汇编指令格式MOV A, Rn MOV A,操作(Rn)→A字节1 2周期1 1; (direct)→AMOV A, @RiMOV A,#data;;((Ri))→A#data→A1211 (2)以寄存器Rn为目的操作数的指令(3条) 汇编指令格式 MOV Rn , A ; MOV Rn, 操作 (A)→Rn 字节 1 2 周期 1 2(direct)→RnMOV Rn,##data→ Rn21 这组指令的功能是把源操作数所指定的内容送到当 前工作寄存器组R0~R7中的某个寄存器。注意:89C51指令系统中没有“MOV Rn,Rn”传送指令。问题:是否可以进行寄存器之间的直接寻址传送?如欲进行MOV R1,R2,可否用指令MOV R1,02H? (3) 以直接地址为目的操作数的指令(5条)汇编指令格式 MOV direct,A MOV direct,Rn 操作 ; (A)→ (Rn)→direct 字节 2 2 周期 1 2MOVdirect, (源direct)→ (目的direct)direct,@R ((Ri))→direct 232MOV2MOVdirect,# #data→direct32 (4)以间接地址为目的操作数的指令(3条)汇编指令格式 MOV @Ri , A;操作 (A)→(Ri)字节 1周期 1 2 1MOV @Ri , ;(direct)→(Ri) 2 #data→(Ri) 2MOV @Ri ,#data(Ri)表示Ri中的内容为指定的RAM单元。
(5)以DPTR为目的操作数 (1条)汇编指令格式 MOV DPTR , #DATA16 ; 操作 dataH→DPH, dataL→DPL 字节 3 周期 2这是唯一的16位立即数传送指令,其功能是把16位常数 送入DPTR。DPTR由DPH和DPL组成。 例如: MOV DPTR,#1234H 结果为 (DPTR)= 1234H。 (DPH)=12H,(DPL)=34H 2、外部RAM及I/O端口与累加器A之间的数据传送CPU访问片外RAM只能采用寄存器间接寻址的方式,并 且只能通过累加器。 指令格式 MOVX A,@Ri MOVX @Ri,A指令寻址空间 字节 周期 ; ((Ri))→A,且使/RD=0 分别为多少? 1 2操作MOVX A,@DPTR ; ((DPTR))→A,使/RD=0; (A)→(Ri),使/WR=0 MOVX @DPTR,A ; (A)→(DPTR),使/WR=011 122 2NOTE:在MCS-51系统中,由于扩展I/O端口与外部RAM统 一编址,即扩展I/O端口地址占用外部RAM地址空间的某一单 元,因此外部RAM及扩展I/O端口的读写操作指令、操作时序 完全相同。只能通过累加器A存取外部RAM和扩展I/O端口。 ① 使用@DPTR寻址的指令,访问64K范围。 ② 使用@Ri寻址的指令,访问256B范围。例2.13:已知片外RAM (2000H)=33H, 读外部RAM的 2000H单元的程序段:MOV DPTR ,#2000H MOVX A ,@DPTR 指令执行后,(A)=33H 例2.14:将累加器A的内容送到外部2000H单元的程序段: MOV MOV P2 , #20H R0 , #00HMOVX @R0,A
3、累加器A与程序存储器ROM之间的数据传送指令 (查 表指令,常用来查一个已做好在ROM中的表格)MOVC A , @A+PCMOVC A , @A+DPTR;均为单字节指令 例2.15: ORG H MOV A, #30H;占用两个字节单元 8002H MOVC A, @A+PC;取出MOVC指令后, (PC)=8003H … ORG 8030H DB ‘ABCDEFGHIJ’ 上述查表指令执行后,将33H地址所对应的程序 存储器中的内容44H(字符‘D’的ASCII码)送到累加器A中。 如果R0中的值为2,则运行结果为 (DPTR)=? 0102H (ACC) =? 4 4、数据交换指令(1)字节交换指令 XCH A,Rn XCH A,directA 一字节 源操作数 一字节XCH A,@Ri (2)半字节交换指令(字节单元与累加器A进行低4 位的半字节交换)XCHDAA,@Ri半字节 RAM 半字节半字节交换操作 4、数据交换指令(3)累加器高低半字节交换指令SWAPA;例如: (R0)=20H,(A)=3FH,(20H)=75H, 分别执行下列指令后,XCHXCHA,R0;A,@R0;XCHD A,@R0;SWAPA 4、堆栈操作堆栈是在片内RAM中按“先进后出,后进先出” 原则设置的专用存储区。设置堆栈操作的目的是为了 保护断点和现场,以便在子程序或中断服务子程序运 行结束后,能正确返回主程序。 数据的进栈、出栈由指针SP统一管理。堆栈的操 作有如下两条专用指令: PUSH direct ;SP←(SP+1),((SP))←(direct) POP direct ; direct ←((SP)),SP ← SP-1 例2.16: 设(SP)=30H, (50H)=43, 执行指令 PUSH 50H 结果:(SP)=31H, (31H)=43H, 执行过程如图2.5所示。 例2.17:设(SP)=35H, (35H)=66H, 执行指令 POP 40H 结果:(40H)=66H,(SP)=34H, 执行过程如图2.6所示。 片内 片内 写操作,是以SP为间址寄存器的间接寻址方 50H 43H 43H50H片 内堆栈操作实际上是通过堆栈指针SP进行的读 片内 式。但因为在系统中SP是唯一的,所以在指50H 50H40H 令中把通过SP的间接寻址的操作数项隐含了, 40H 40H 66H 40H ××只表示出直接寻址的操作数项。31H ×× SP 31H 43H 30H ×× 30H ×× 执行前 执行前PUSH 指令后SPSP 35H 66H10H ××SP11H 66H 10H ××执行前执行POP指令后图2.5 PUSH指令示意图图2.6 POP指令示意图 例: 2.2.2算术运算类指令算术运算结果将进位CY、半进位AC、溢出位OV 三个标志位置位或复位,只有加1和减1指令不影响这 些标志位。(针对8位无符号二进制数)1、加法指令 ADD A,Rn ADD A,direct ADD A,@Ri ADD A,#data;A←(A) +( Rn) ;A← (A) +(direct) ;A← (A)+ ((Ri)) ;A←(A)+ #data 使用加法指令时要注意对程序状态字PSW的影响:? ? ?如果位3有进位,则辅助进位标志AC置1,反之AC清0; 如果位7有进位,则进位标志CY置1,反之CY清0; 若位6有进位而位7没有进位或者位7有进位而位6没有进位, 则溢出标志OV置1,否则清0.?溢出标志的状态,只有在符号数加法运算时才有意义。当两 符号数相加时,如果OV=1,则表示加法运算超出了累加器A 所能表示的符号数有效范围,即产生溢出,运算结果错误。 例如:(A)=C2H,(R0)=A9H,执行ADD A,R0指 令。+1←01011运行结果:(A)=6BH,AC=0,CY=1,OV=1 如果C2H和A9H为无符号数,则结果正确。 如果C2H和A9H为符号数,则结果不正确。(两 个负数相加不可能得到正数) 2、带进位加指令 ADDC A,Rn ADDC A,direct ADDC A,@Ri ADDC A,#data;A←(A)+ (Rn) + C;A←(A)+(direct)+ C ;A←(A)+(Ri)+ C ;A←(A)+ #data + C带进位加指令对CY、AC、OV的影响与前述相同。该类型指令常用于多字节数的加法运算。 例如:编写三字节无符号数的加法程序。假设被加数放在内部RAM20H~22H (低位在前),加数放在内部RAM2AH~2CH单元(低位在前)。 MOV MOV MOV R0,#20H; 被加数首地址 R1,#2AH;加数首地址 R7,#03H;字节数CLRLOOP: MOV MOV INC R0C;清进位标志A, @R0; 取被加数的一个字节 @R0, A;暂存中间结果 ;地址增量ADDC A, @R1;与加数的一个字节相加INC R1; DJNZ R7,LOOP;次数减1,不为0转移CLR AADDC MOV A , # OOH; 处理进位 @R0, A;存进位 3、带借位减指令SUBB A,RnSUBB A,direct SUBB A,@Ri SUBB A,#data;A← (A )-(Rn) - C;A← (A )-(direct)- C ;A← (A) C(Ri)- C ;A← (A )- data C C 使用该指令时要注意对程序状态字PSW的影响 :? ? ?如果位3有借位,则辅助进位标志AC置1,反之AC清0;如果位7有借位,则进位标志CY置1,反之CY清0;若位6有借位而位7没有借位或者位7有借位而位6没有借位 ,则溢出标志OV置1,否则清0.?溢出标志的状态,只有在符号数减法运算时才有意义。当 两符号数相减时,如果OV=1,则表示减法运算超出了累加 器A所能表示的符号数有效范围,即产生溢出,运算结果错 误。MSB 7 6 5 4 3 2 1 0 LSB 例如:(A)=C9H,(R2)=54H,CY=1执行SUBB A,R2指令。1―运行结果:(A)=74H,CY=1,OV=1 如果C9H和54H为无符号数,则结果正确。 如果C9H和54H为符号数,则结果不正确。(负 数减去正数不可能得到正数) 4、乘法指令MUL AB ; BA← A×B? 功能:实现累加器A和B寄存器中的两个8位无符号数相乘, 16位乘积的低8位放在累加器A中,高8位放在B寄存器中。? 单字节指令,执行时间最长(4个机器周期) ? 影响PSW的状态:(1)进位标志CY总是清0;(2)溢出 标志OV与乘积有关,OV=1表示乘积超过255,即乘积分别 在B与A中,否则OV=0,表示乘积只在A中,即乘积小于 FFH(B=00H)。 例2.20: (A)=30H,(B)=60H, 执行 MUL AB 结果: (A)=00H,(B)=12H。 OV=? CY=? 5、除法指令DIV AB;? 功能:实现累加器A和B寄存器中的两个8位无符号相除,其中商存放累加器A中,余数存放在B中。 ? 单字节指令,执行时间最长(4个机器周期). ? 影响PSW的状态:(1)进位标志CY总是清0;(2)溢出 标志OV反映除数情况,当除数为0,置OV=1,表明除法无意义,其他情况下OV=0。例2.21 (A)=0B4H(即180),(B)=18H (即24) 执行 DIV AB结果为 (A)=07H…商 (B)=0CH…余数, CY=0 ,(OV)=0 , (P)=1 6、加1指令 INC A ;A← (A) + 1 INC Rn ;Rn← (Rn) + 1 INC direct;direct← (direct)+ 1 INC @Ri ;(Ri)←((Ri))+ 1 INC DPTR;DPTR←( DPTR) + 1INC指令不影响程序状态字PSW的进位标志CY,即使 INC DPTR在加1过程中低8位有进位,也是直接进上 高8位而不是置进位标志CY。 7、减1指令 DEC A ;A← (A) - 1 DEC Rn ;Rn← (Rn) - 1 DEC direct ;direct← (direct)- 1 DEC @Ri ;(Ri)←(Ri)- 1? DEC指令不影响程序状态字PSW的进位标志CY。 ? 对于数据指针DPTR,没有减1指令,只能通过编程实现DPTR-1。? 加1减1指令,通常配合寄存器间接寻址指令,用于修改地址指针。 8. 十进制调整指令 DA A 该指令专用于BCD码加法运算的十进制调整。该指令一般是跟在ADD或ADDC指令之后,并且是 两个压缩型BCD数相加。使用该指令是为了把累加器 A中和进行调整。调整的实质是将十六进制的加法运 算转换成十进制,具体调整方法为:① 若累加器A的低4位大于9(A-F),或者辅助进 位位AC=1,则累加器A的内容加06H(A←(A)+ 06H),且将AC置“1”。 ② 若累加器A的高4位大于9(A-F),或进位位 CY=1,则累加器A的内容加60H(A←(A)+ 60H),且将CY置“1”。 调整后,辅助进位位AC表示十进数中个位向十位 的进位,进位标志CY表示十位向百位的进位。 例2.22:(A)=65BCD,(B)=78BCD,CY =0 ADD A,B DA A 指令执行后,(A)=43BCD,(CY) =1。 2.2.3 逻辑运算与循环类指令1、逻辑“与”指令ANL A,Rn ANL A, A ←(A)∧Rn) ; A←(A)∧(direct)ANL A,#dataANL A,@Ri ANL direct,A; A←(A)∧data; A←(A)∧((Ri)) ; direct←(direct)∧(A)ANL direct,#data; direct ←(direct)∧#dataANL A,#data 该指令可用于对目的操作数的某一位或某几位清零例2.23 ANL 位不变。 P1 ,#0FH P1口锁存器的高4位清零,低4 2、逻辑“或”指令ORL A,Rn ORL A,direct ORL A,#data ORL A,@Ri ;A ←(A)∨(Rn),n=0~7 ; A ←(A)∨(direct) ; A← (A)∨ data ; A ←(A)∨((Ri)),i=0,1ORL direct,A;direct←(direct)∨(A)ORL direct,#data ;direct←(direct)∨#data ORL A,#data 该指令可用于对目的操作数的某一位或某几位取反例2.25 (P1)=05H,(A)=33H, 执行指令 ORL P1,A 3、逻辑“异或”指令XRL A,RnXRL A,direct XRL A,@Ri; A←(A) (Rn);A ←(A) (direct) ;A ←(A)((Ri)),i=0,1XRL A,#dataXRL direct,A;A ←(A)#data;direct←(direct)(A)XRL direct,#data ;direct←(direct) #dataXRL A,#data 该指令可用于对目的操作数的某一位或某几 位置1例2.26.设(A)=90H,(R2)=72H XRL A, R2 结果:(A)=0E2H,(R2)=72H。指令执行 4、求反与清零指令 ① CLR A 功能是累加器A清“0”。不影响 Cy、Ac、OV等标志。 ② CPL A 功能是将累加器A的内容按位逻辑 取反,不影响标志。 例 2.28: 设 (A) =; 执行指令: CPL A 结果: (A) =B=C9H 5、循环指令① RL A② RR A③ RLC A ④ RRC AA.7A.7 CY CY A.7 A.7A.0A.0 A.0 A.0⑤ 累加器ACC半字节交换指令 SWAP A ; (A0~3) (A4~7) 2.2.4 程序转移类指令1、无条件转移指令 ① 绝对(短)转移指令AJMP addr11 ;PC←PC+2, PC10~0 ← addr11这是一条2K字节范围内的无条件跳转指令,转移的目标地 址必须与AJMP下一条指令的地址的高5位地址码A15~A11相 同。 执行指令时, PC先加2,然后把addrll送入PC.10~PC.0, PC.15~PC.11保持不变。由于该指令只修改PC的部分内容, 所以通过该指令形成的目的地址只在2K内变化。 例如:2070H AJMP 16AH 结果为(PC)=216AH ② 长转移指令LJMPaddr16;PC ← addr16功能:把指令第二、第三个字节的内容即指令提供 的16位目的地址送入PC,然后程序无条件地转移 到目标地址处。 因为addr16是一个16位二进制地址,地址范围 0000H~FFFFH,因此可在64KB范围内转移。 ③ 短(相对)转移指令 SJMP rel ;PC ← PC + 2 + rel功能:先使程序计数器PC加2,然后指令提供的有符 号的地址偏移量rel和PC相加,得到目的地址。转移 的范围为-128-+127字节。偏移量rel计算: ?向前转移――rel=目的地址-(源地址+2) =地址差-2 ?向后转移――rel=(目的地址-(源地址+2))补 =FEH-地址差 例如:835AH SJMP 35H 向前转移 ? 向前还是向后转移? ? 目的地址: 8391H 再如:835AH SJMP 0E7H 向后转移 ? 向前还是向后转移? ? 目的地址: 8343H ④间接转移指令(散转指令)JMP @A+DPTR ;PC ← A + DPTR?功能:将累加器A中8位无符号数二进制数与数据指 针DPTR的内容相加,以形成目的地址送入PC,实现无条件转移操作。?特点:转移地址可以在程序运行中加以改变。因此 这条指令具有多分支转移的功能,该功能称为散转 功能,间接长转移指令又称为散转指令。 例2.30;将TAB代表的地址送入DPTR ;跳转 ;跳转ROUT0开始的程序段 ;跳转ROUT1开始的程序段 ;跳转ROUT2开始的程序段 ;跳转ROUT3开始的程序段RL A MOV DPTR,#TAB JMP @A+DPTR TAB: AJMP ROUT0 TAB+2: AJMP ROUT1 TAB+4: AJMP ROUT2 TAB+6: AJMP ROUT3 ... ROUT0: ... ROUT1: ... ROUT2: ... ROUT3:为什么需要RL A? 去掉可不可以 2、条件转移指令条件转移指令的操作是判断指定的条件,如果条 件满足则转移,不满足则顺序执行。该类指令都采用相对寻址方式,转移范围共256 字节(-128~127B)。当条件满足时,把PC的当前值 (下一条指令的第一个字节的地址)与相对偏移量rel相加形成转移的目标地址。① 累加器判零转移指令 JZ A=0, (PC)←(PC)+ 2 + rel JNZ A≠0, (PC)←(PC)+ 2 + rel ② 比较转移指令CJNE CJNE CJNE CJNE A,#data,rel;累加器内容与立即数不等转移 A,direct,rel:累加器内容与内部RAM单元内容不等转移 Rn,#data,rel;寄存器内容与立即数不等转移 @Ri,#data,rel;内部RAM前128单元内容与立即数不等转移功能说明: ?程序转移: ?若左操作数=右操作数,则程序顺序执行,PC←(PC) +3,CY←0 ?若左操作数&右操作数,则程序转移,PC←(PC) +3+rel,CY←0 ?若左操作数&右操作数,则程序转移,PC←(PC) +3+rel,CY←1 ?数值比较 例2.31: MOV A,R0 CJNE A,#10H,L1 ; MOV R1,#0 ; AJMP L3 L1: JC L2 MOV R1,#0AAH ; AJMP L3 L2: MOV R1,#0FFH L3: AJMP L3因此最终结果是:本程序执行前, 如果R0=10H,则R1=00H; 如果R0&10H,则R1=0AAH; 如果R0&10H,则R1=0FFH。 ③ 减1非0转移指令DJNZ Rn,rel ; Rn ←(Rn)-1, 若(Rn)≠0, (PC)←(PC)+ 2 + rel; 若(Rn)=0,(PC)←(PC)+ 2 指令功能:工作寄存器Rn减1不等于0,则,转移到 偏移量所指向的地址,否则程序往下执行。 DJNZ direct,rel ;direct←(direct)-1,若 direct≠0, (PC)←(PC)+ 2 + rel; 若 direct=0, (PC)←(PC)+ 2 指令功能:直接地址单元中的内容减1不等于0,则 转移到偏移量所指向的地址,否则程序往下执行 ④ 位转移指令JC rel若Cy=1,则转移 PC←PC+2+rel;否则程序顺序执行JNC rel若Cy=0,则转移PC←PC+2+rel;否则程序顺序执行JB bit,rel若(bit)=1,则转移PC←PC+3+rel;否则程序顺序执行JNB bit,rel 若(bit)=0,则转移,PC←PC+3+rel;否则程序 顺序执行 2.2.5 调用子程序及返回指令 (1)调用子程序指令在程序设计中,通常将 反复出现、具有通用性和功 能相对独立的程序段设计成 子程序。子程序可以有效地 缩短程序长度、节约存储空 间;可被其他程序共享以及 便于模块化、便于阅渎、调 试和修改。主 程 序 断点主 程 序图2.7子 程 序子程序调用示意图 ① 长调用指令LCALL addr16 ;三字节指令PC←PC+3,SP←SP+1,(SP)←PC7~0;SP←SP+1,(SP)←PC15~8, PC←addr16长调用指令的16位目标地址由指令直接给出,所以子程序 可放在64KB空间的任何地方。指令的执行过程是把本指令的第2、3个字节分别装入PC的 高8位和低8位)获得子程序的入口地址,并把该断点地址入栈 (断点地址保护),即该指令在执行过程需要完成两项操作,即 断点保护与构造目的地址。例如:(SP)=60H,标号START为0100H,标号MIR为8100H, 执行START:LCALL MIR。结果为(SP)=62H,(61H)=03H,(62H)=01H,(PC) =8100H ② 绝对调用指令 ACALL addr11 ;PC ←PC+2, SP←SP+1,(SP)←PC7~0; SP ← SP+1,(SP)← PC15~8, PC10~0←addr11 指令执行过程: ? PC加2(本指令代码为两个字节)获得下一条指令的地址, ? 把该断点地址(当前的PC值)入栈,?将断点地址的高五位与11位目标地址(指令代码第一字节的高 3位,以及第二字节的八位)连接构成16位的子程序入口地址, 使程序转向子程序。 注意: 调用子程序的入口地址和ACALL指令的下一条指令的地址, 其高五位必须相同,因此子程序的入口地址和ACALL指令下 一条指的第一个字节必须在同一个2KB范围内。 2 返回指令RET ;PC15~8← (SP),SP←SP-1 ;PC7~0← (SP),SP←SP-1返回指令的功能是恢复断点地址,即从堆栈中 取出断点地址送给PC,子程序通过RET指令返回主 程序。 RETI ;PC15~8←(SP),SP←SP-1 ;PC7~0 ←(SP),SP←SP-1 功能与RET指令相似,两指令不同之处是该指 令清除了中断响应时被置“1”的内部中断优先级 寄存器的优先级状态。 2.2.6位操作指令 1、位数据传送指令MOV C,bit MOV bit,C ;C←(bit) ;bit←C 06H是内部RAM 20H字节位6的例2.32MOV C, 06H;(20H).6→Cy 位地址。例2.33MOV P1.0, C 注意:没有MOV bit,bit指令;Cy→P1.0 2、位状态修改指令 2、位状态修改指令CLR C ;C←0CLR CPL CPL SETB SETBbit C bit C bit;(bit)←0 ;C← ;(bit)←(bit) ;C←1 ;(bit)←1该组指令将操作数指定的位清“0”、求反、置 “1”, 不影响其它标志。例2.34: SETB 3DH; 将27H.5位置1CLR C; Cy位清0 3、位逻辑运算指令 ANL C,bit ;C←C∧(bit) ANL C,/bit ;C←C∧(bit) ORL C,bit ;C←C∨(bit) ORL C,/bit ;C←C∨(bit 例如:程序如下,试说明该程序的功能。E、B和D均 为位地址。MOV ANL MOV MOV ANL ORL MOVC,B C,/E D,C C,E C,/B C,D D,C通过位逻辑运算可以对各种组合逻辑电路进行模拟,即用软件 的方法来获得组合逻辑电路的功能 补充内容――I/O口访问指令使用说明?位双向I/O口,供单片机输入/输出数据使用。端口的每一位均由锁存器、输出驱动器和输入缓冲器组成。对这些口可以进行按口寻址,进行字节操作;也可以按口线寻址,进行位操作。使用过程要注意对口的操作的一些特殊问题, (A)I/O 的结构?P0口: 字节地址80H,位地址 80H~87HP0口某一位电路包括:? 1个数据输出锁存器,用于数据位锁 存 ? 2个三态数据输入缓冲器,分别用于 锁存器数据和和引脚数据的输入缓 冲。 ? 1个多路转换开关MUX:在控制信号 的作用下,由MUX实现锁存器输出 和地址/数据线之间的接通转接。 ? 数据输出的驱动和控制电路,由2个 场效应管组成,上面的场效应管构 成上来电路。开关输入来自锁存器和“地 址/数据”,输入转接由 “控制”信号控制。其作用 是使P0口既可作为通用I/O 口,又可以作为单片机的地 址/数据线使用。? ?在传输地址或数据时,CPU 发出控制信号,打开上面的 与门,使MUX打向上边,使 内部地址/数据线与下面的 FET处于反相接通状态,此 时的输出驱动电路由于上下 两个FET处于反相,行程推 拉式电路结构,提高了负载 能力。 当输入数据时,数据信号直 接从引脚通过输入缓冲器进 入内部总线。? P0口作为通用I/O使用时,控制信号为0,封锁了与门,并 将输出驱动电路的上拉FET截止,MUX打向下边,与D锁存器 的/Q端接通。?P0作为输出口时,来自CPU的“写入 ”脉冲加在D锁存器的CP端,内部总 线的数据写入D锁存器,并向端口引 脚输出。由于输出电路是漏极开路, 须外接上拉电阻才能有高电平输出。?P0作为输入口使用时,应区分读引脚 和读端口(读锁存器)。(1)读引脚:直接读取引脚P0.X的状态 ,此时由读引脚信号把下方的缓冲器 打开,引脚的状态经过缓冲器读入内 部总线。 (2)读端口:读锁存器信号打开上面的 缓冲器把锁存器Q端的状态读入内部 总线。 ?P1口:只能作为通用I/O口字节地址90H,位地址90H~97H? ?P1口位结构电路原理如图所示。 使用P1口时,应注意:(1)P1作为输出时,不需要外接上拉电阻; (2)作为输入时,应先向锁存器写入1,使其输出驱动电路FET截止。 ??P2口:字节地址A0HP2口的位结构电路原理图 如图所示。?注意:? MUX其中一个输入端是单一的“地址”。? P2口只作为地址线使用,口的输出用不着是三态,即P2 为准双向口;? 作为通用I/O,MUX接通锁存器Q端。 ?P3口:字节地址B0H(1)对于作为第二功能输出的引脚,当作为通用I/O时,电路中的“第二输出功能”线应 保持高电平,与非门开通,使锁存器的Q端输 出保持畅通。当输出第二功能信号,该锁存 器应预先置1,使与非门对“第二功能”信号 的输出是畅通的,从而实现第二功能信号输 出。 (2)对于作为第二功能输入的引脚,在口线 引脚内部增加了1个缓冲器,输入的信号从此 缓冲器的输出端获得。而作为通用I/O使用的 数据输入,仍取自三态缓冲器的输出端。 P3口无论作为输入口还是第二功能信号的输 入,锁存器输出和第二输出功能线都应保持 高电平。 (B)对口操作的指令?按口操作指令:凡是能对专用寄存器寻址的指令都能用于口 的操作,其中典型代表是口输入/输出(MOV指令)。? 输出数据时,用MOV指令把输出数据写入各口线电路的锁存器。 ? 输入数据时,用MOV指令把各口线的引脚状态读入。 例如: MOV Pm,A MOV A,Pm MOV Pm,#data MOV direct,Pm MOV Pm,direct? 按口线操作的指令:对口来说,寻址的就是口线。例如 MOV Pm.n,C MOV C,Pm.n SETB Pm.n (C)读引脚数据前须先写“1”? 8051的4个I/O口在数据输入时均呈准双向口特性,这种口在引脚 信号输入操作中存在一个特殊问题。? 即如果口线引脚的原状态为低电平,则外界输入的任何信号均被引 ORL P1,#03H;将P1.0和P1.1置1,准备输入信号 脚拉低为低电平,这样就不能反映出外界输入的真实状态,这实际 MOV C,P1.0 上是封锁了口线,外界信号不能输入。 MOV 20H,CMOV C,P1.1 ? 当外界输入为高电平时,在拉低过程中会产生大电流,有可能把晶 MOV 21H,C 体管烧坏。 ? 例如:解决办法:在进行引脚数据输入操作之前,须先向电路中的 锁存器写入“1”,使FET截止,以避免锁存器为0态时对引 脚读入的干扰。 (D)读端口操作时的“读-改-写”功能?读端口:指通过锁存器上面的缓冲器读锁存器Q端 的状态。?对口的操作指令中,有些指令的操作过程是:先读 出口的数据,然后对读出的数据进行运算或修改操 作,最后把结果回送给口。 例如:ORL P0,#0FH这类读改写指令不直接读引脚而是读锁存器,以避 免错误发生。? 2.2.7 空操作指令 NOP ;PC ← PC+1该指令除了使PC加1,消耗1个机器周期外,没有 执行任何操作。可用于短延时。 2. 3 汇编语言程序设计 汇编语言特点: (1)汇编语言能编写出最优化程序; (2)汇编语言编程难度高; (3)能直接管理和控制硬件设备; (4)通用性差,不易移植。 使用汇编语言设计程序时,要求设计者能对单 片机硬件结构了解深入,要对系统硬件资源进 行合理分配使用,编程技巧性高。 2. 3 汇编语言程序设计2.3.1 常用的伪指令(程序员发给汇编程序的命令)汇编语言程序的机器汇编是由计算机自动完成的。 为此,在源程序中应有向汇编程序发出指示信息,告 诉它如何完成汇编工作,这一任务是通过使用伪指令 来实现的。 伪指令具有控制汇编程序的输入输出、定义数据和 符号、条件汇编、分配存储空间等功能。伪指令无对 应的机器码,汇编得到目标程序后,在目标程序中是 没有与伪指令对应的机器码。 2. 3 汇编语言程序设计2.3.1 常用的伪指令(程序员发给汇编程序的命令)1. ORG 汇编起始地址命令(用于规定目标程序的起始地址)标号:ORGADDRESS例2.35: ORG 1000H ST: MOV A, R1 … 上述指令规定了其后一段程序的起始地址为1000H,并指 定了标号ST的地址为1000H。 2. END 汇编结束命令 用于汇编语言源程序的末尾,表示源程序到此结束。在 机器汇编时,对END后面的指令不予处理。一个源程序只能 有一条END命令。 3. DB例如定义字节数据命令DB n1, n2, n3,………,nN1000H ‘ABC’ ,100,32H ORG格式:[标号:]TAB1: DB从1000H开始的存储单元的内容如图所示。ROMH H H 43H 64H 32HDB命令常用于存放数据 表格,比如存放数码管 的十六进制数的字形码。… 4. DW 定义字数据命令格式:[标号:] DW nn1, nn2,……,nnN功能:用于从指定地址开始,在程序存储器的连续单元 中定义16位的数据字。ROM例如ORG2000HTAB2:DW 1020H,1234H, 100 汇编后存储单元的内容如图所示。01H 20H H 12H34H00H 64H2004H2005H… 5. DS格式: 例:定义存储区命令[标号:] ORG L1: DS DS X功能:从指定的地址开始,保留X字节的存储单元。6000H 02HL2: DB88H,35H汇编后,从6000H开始保留2个字节单元,从6002H单元开始按 DB命令给内存单元赋值:(6002H)=88H(6003H)=35H注意: (1)DB、DW、DS命令只能对程序存储器使用,而不能对RAM使用。 (2)DB一般用于定义数据,DW用来定义地址。 6. EQU(Equat)赋值命令 格式:字符名 EQU 数或汇编符号功能:把字符名赋予一个数或特定的汇编符号。赋值 后,指令中可用该符号名来表示数或汇编符号。例: CH1 X EQU EQU 2000H R1通过EQU命令把CH1等值为数值2000H,X等值于寄 存器R1。 7 . DATA 数据地址赋值命令 格式:字符名 DATA nn功能:将数据地址或代码地址赋予规定的字符名称。DATA与EQU命令的区别:后者定义的字符名须先定义后使用, 而DATA定义的字符名无此限制。8. BIT定义位地址符号命令BIT bit格式:字符名将位地址bit赋予所定义的字符名。 例3.40: L0 BIT P1.1该指令把位地址P1.1赋给了变量 L0 2.3.2 汇编程序设计方法 1. 程序设计的一般流程 (1)任务分析; (2)分析问题,确定算法和工作步骤; (4)分配内存,确定程序与数据区存放地 址,画出程序流程图; (5)编写汇编语言的源程序; (6)上机调试、修改,最终确定程序。 2.汇编程序基本结构形式? ? ?顺序结构 分支结构 循环结构程序执行时,程序流向不变,按顺序一条一条地执行指令。 分支程序含有转移指令,可分为无条件分支和有条件分支 程序。对于有条件分支程序又可分为单分支选择结构和多 分支选择结构。?子程序程序含有可重复执行的程序段,汇编没有专门的循环指令, 一般可使用条件转移指令通过条件判断来控制循环的执行。将那些需多次应用、完成相同的某种运算操作的程序段从 整个程序中独立出来,单独编成一个程序段,需要时通过 ? 中断服务子程序 指令调用。子程序须以返回指令RET结束。 中断服务子程序是为响应某中断源的中断请求服务的独立 程序段,与子程序类似,但中断服务子程序须以RETI指令 结束。 (1) 顺序程序设计:程序按顺序一条一 条地执行指令。例1: 两个4位BCD码分别 放在片内RAM 30H、参考程序如下:(考虑最高位可能有进位)ORG 1000H MOV A, 30H ADD A,40H DA A MOV 50H,A MOV A,31H ADDC A,41H DA A MOV 51H,A CLR C MOV A,#00H ADDC A,#00H MOV 52H, A SJMP $ END ;暂停 ;保留最高位进位 ;最低位送入累加器A ;BCD码调整 ;存放和的最低位31H和40H、41H中,求它们的和并将和存放 在片内RAM 50H、51H、 52H中,低地址放低位 数。;BCD码调整 ;存放和的高位 例2、把片外8000H中的数拆成高、低半字节,分别 送入40H、41H两个单元中。ORG 0000H MOV R0, #40H MOV DPTR, #8000H MOVX A, @DPTR MOV B, A SWAP A ANL A, #0FH MOV @R0 , A INC R0 MOV A, B ANL A, #0FH MOV @R0, A LOOP: SJMP LOOP END;设R0为地址指针 ;指定的字节;暂存 ;交换 ;屏敝高位;指定字节的内容屏敝高位 (2)分支程序 程序分支是根据条件对程序的执行进行判 断,满足条件则进行程序转移,不满足条件就 顺序执行程序。 分支程序又分为单分支和多分支结构。在 8051中,可实现单分支程序转移的指令有JZ、 JNZ、CJNE、DJNZ、JB、JNB、JBC等。 (2)分支程序?单分支程序 例1 假设有两个数在内部RAM 单元的40H 和41H 中现在要求找出其中较大的一个数并将较大的数存入40H 中,将较小的一个数存入41H 中。 ORG 1000H MOV A, 40H CLR C SUBB A, 41H JNC WAIT MOV A, 40H XCH A, 41H MOV 40H, A WAIT:SJMP $ END开始A←(40H) Cy清0 两数相减 Y Cy=0? N 两数交换结束 例2 求单字节有符号数的二进制补码?分析:正数补码是其本身,负数补码是其反码加1,故程序 首先判断被转换数的符号。设二进制数存放在累加器A中,其补码也放回到A中。?参考程序: CMPT: JNB ACC.7,RETURN;(A)&0,返回 MOV C,ACC.7;符号位保存 CPL A ADD A,#01H ;(A)求反,加1 MOV ACC.7,C;符号位存在A的最高位 RETURN:RET 单分支结构其他形式 练习:假定在外部RAM中有ST1、ST2、ST3共3个连续单元 ,其中ST1和ST2分别存放两个8位无符号二进制数,要求找出 其中的大数并存入ST3中。参考程序: (2)多分支程序结构多分支程序通过多个条件来实现转移,一个条件形成两路分支,在其中的一个分支继续进行条件判断, 形成下一级分支,从而实现分支的嵌套。51单片机无 多分支转移指令,无法使用单条指令完成多分支转移。实现方法:???多次使用条件转移指令,如CJNE A,#data, rel指 令,JZ,JC等指令 使用JZ、JB实现跳转 ?使用查地址表方法实现多分支 程序的转移。 使用查表方法. ?使用查转移指令表的方法实现多分支程序转移。 用多条CJNE语句,逐次比较 ,实现多分支程序的转移。 优点:简单、易懂 缺点:速度慢使用CJNE指令实现程序多分支转移 ?使用CJNE指令实现程序多分支转移NY Y分析: T54QTaQT55 温度下限T54 温度上限T55 低于T54 高于T55 则升温 则降温N NYYN 参考程序 ?使用JZ、JB指令实现程序多分支转移例2 求符号函数YORG 0100H START: MOV A, 30H JZ MM JNB ACC.7, LL MOV A, #0FFH; AJMP MM LL: MOV A, #01H MM: MOV 31H, A END?1, ? y ? ? 0, ? - 1, ?开始x?0 x?0 x?0取x 即(30H)→A N A0?YA=0?YNA ←1A ←-1(31H)←A结束图2.9 符号函数程序流程图 ?使用查表法实现程序多分支转移?使用查地址表法实现多分支转移? 首先要在程序中建立一个差值表,并将各分支入口地址与该表首地址的差值按序排列其中。 ? 差值表首地址送入DPTR,分支号送入A中。 ? 然后就可通过转移指令JMP @A+DPTR进行分支。 例1:有BR0,BR1,BR2,BR3共4个分支程序段,各分支程序段 的功能依次是BR0:从内部RAM取数 BR1:从外部RAM中低256B范围取数BR2:从外部RAM中4KB范围取数BR3:从外部RAM中64KB范围取数并假定R0中存放取数地址低8位地址,R1中存放高8位地址, R3中存放分支序号值,假定以BRTAB作为差值表首地址, BR0_BRTAB~BR0_BRTAB为差值. 例1: 利用四分支程序,实现在①内部RAM取数 ②在外部RAM低256B范围取数.③在外部 RAM4KB取数.④在外部RAM64KB范围 取数. R0 低8位地址. R1 高8位地址 R3 分支序号0,1,2,3.0 BR01BR12BR23BR3
②查转移指令表的方式实现多分支与方法?不同的是,表中放的是转移指令。使用变址寻址转移指令(间接转移指令)JMP @ A+DPTR; (PC)←(A)+(DPTR)具体方法: (A)将转移指令直接放入表中,即表示由转移指令 组成指令表。 (B)该表的首址送DPTR。DPTR的基地址存转移指 令表的起始地址,A为表的偏移量。通过此指令实现 程序的分支转移。 例如:BRTAB:MOV A,R3 ;R3存分支号 RL A ;分支号乘2,形成偏移量 MOV DPTR,#BRTAB;转移指令表首址 JMP @A+DPTR AJMP ROUT0 AJMP ROUT1 AJMP ROUT2……AJMP ROUT127 4. 循环程序在程序运行中需要多次反复执行某段程序段,这时可以在 程序中设置一些条件,使该段程序从分支出口出来,又回到入 口,继续重复执行该段程序。循环结构程序主要由以下四部分组成:?? ? ?循环初始化 :循环控制计数初值、地址指针起始地址设定 等。 循环体 循环控制:两种方式――计数控制与条件控制循环结束:存放循环程序执行结果,并按顺序执行循环体 下一步指令。 ①单重循环开始 开始 设置循环初值循环结束?设置循环初值循环处理 循环修改 N 循环结束? Y 结束处理YN 循环处理 循环修改 结束处理结束图2.11 循环程序先处 理后判断的流程图结束图2.12 循环程序先判断 后处理的流程图 例1: 把片内RAM以30H为首地址的数据块依次传送到片外RAM以2000H为首地址的区域内,数据块的长度在工 作寄存器R2中。 ORG 000H MOV R0, #30H ;建立源地址指针 MOV DPTR , #2000H ;建立目的地址指针 LOOP: MOV A, @R0 ;取数 MOVX @DPTR, A ;保存到目标地址中 INC R0 ;源地址加 INC DPTR ;目的地址加1 DJNZ R2, LOOP ;判断数据是否移完 SJMP $ END ② 多重循环循环体内还包含 循环体程序,称循 环嵌套,或称多重 循环。在多重循环 中,不允许循环体 相互交叉,也不允 许从外层循环跳入 内层循环,否则将 出错。双重循环的 流程图如图。开始循环初始化1循环处理1循环初始化2循环处理2 循环控制2N条件满足?Y循环控制1N条件满足?Y循环结束 结束 例2: 片内RAM从30H单元开始存放了10个无符号的数,将它们 比如:原始数据为 按照由小到大的顺序排列。分析:采用冒泡排序法。 思路:50、38、7、13、59、44、78、22 第一次冒泡: 50、38、7、13、59、44、78、22 逆序互换 逆序互换 逆序互换 正序不换 逆序互换 正序不换 逆序互换从前向后进行相邻数比较, 38、50、7、13、59、44、78、22 如果数据的大小次序与要求顺 38、7、50、13、59、44、78、22 序不符时(逆序),就将两个 38、7、13、50、59、44、78、22 数互换,否则为正序不互换。 为了进行升序排列,应通过这 38、7、13、50、59、44、78、22 种相邻数互换方法,使大数向 38、7、13、50、44、59、78、22 后移,小数向前移。如此从前 38、7、13、50、44、59、78、22 向后进行一次冒泡,就将最大 38、7、13、50、44、59、22、78 数换到最后;然后再进行一次 冒泡,将次大数排到倒数第二 位置,与此类推。第一次 冒泡结束 例2: 片内RAM从30H单元开始存放了10个无符号的数,将它们 按照由小到大的顺序排列。分析:采用冒泡排序法。 思路:比如:原始数据为50、38、7、13、59、44、78、22 第一次冒泡: 38、7、13、50、44、59、22、78 第二次冒泡: 7、13、38、44、50、22、59、78 第三次冒泡:从前向后进行相邻数比较, 如果数据的大小次序与要求顺 序不符时(逆序),就将两个 数互换,否则为正序不互换。 为了进行升序排列,应通过这 种相邻数互换方法,使大数向 后移,小数向前移。如此从前 向后进行一次冒泡,就将最大 数换到最后;然后再进行一次 冒泡,将次大数排到倒数第二 位置,与此类推。7、13、38、44、22、50、59、78第四次冒泡: 7、13、38、22、44、50、59、78 第五次冒泡: 7、13、22、38、44、50、59、78 第六次冒泡: 7、13、22、38、44、50、59、78第七次冒泡:7、13、22、38、44、50、59、78 注意事项: (1)由于每次冒泡都从前向后排定比如:原始数据为50、38、7、13、59、44、78、22一个大数(升序),因此,每次冒 第一次冒泡: 泡所需进行的比较次数都递减1。 38、7、13、50、44、59、22、78 比如n个数排序,第一次比较(n1)次,第二次(n-2)等。但实 (2)对于n个数,理论上须(n-1) 第二次冒泡: 7、13、38、44、50、22、59、78际编程时,固定比较次数为(n-1) 第三次冒泡:7、13、38、44、22、50、59、78次才能完成排序。而实际上可能不 第四次冒泡: 到(n-1)次就排好了。判断排序 7、13、38、22、44、50、59、78 是否完成的方法就是看各次冒泡中 第五次冒泡: 是否发生互换,有则未完成。为此, 7、13、22、38、44、50、59、78 控制排序结束一般不用计数方法, 第六次冒泡: 而使用设置互换标志的方法,以其 7、13、22、38、44、50、59、78 状态表示一次冒泡中有无数据互换。 第七次冒泡: 7、13、22、38、44、50、59、78 开始例2: 片内RAM从30H单元开始存放了10个无符号的数,将它们按照 由小到大的顺序排列。 分析:采用冒泡排序法。 思路: 从前向后进行相邻数比较,如 果数据的大小次序与要求顺序不符 时(逆序),就将两个数互换,否数据块首地址 比较次数30H → R1 09H → R 7交 换标志位20H 清 0 A取前数送入修改 数据块 指针 取后数送入 前数>后数 B ? N则为正序不互换。为了进行升序排列,应通过这种相邻数互换方法, 使大数向后移,小数向前移。如此 从前向后进行一次冒泡,就将最大 数换到最后;然后再进行一次冒泡, 将次大数排到倒数第二位置,与此 类推。NY 前数与后数位置交换 交 换标志位20H 置 1(R7) - 1=0? Y (20H)=1? YN结束 ORG 0100H SORT: MOV R0, #30H MOV R1, #09H CLR 20H LOOP: MOV A, @R0 INC R0 MOV B, @R0 CJNE A, B, SS SS: JC ZZZ MOV @R0, A DEC R0 MOV @R0, B INC R0 SETB 20H ZZZ: DJNZ R1, LOOP JB 20H, SORT SJMP $ END;置数据块首地址 ;置每次冒泡比较次数 ;交换标志位清0 ;取前数 ;取后一个数 ;比较两个数的大小 ;若前数<后数,转移,不交换;交换数据 ;有交换,标志位置1;若有交换,继续进行下一轮冒泡 循环结构的另一应用――定时程序定时程序也是典型的循环程序,它是通过执行一个具有固定 延时时间得循环体来实现延时的。定时程序只能用汇编语言 编写。定时功能还能用定时器/计数器实现。 ? 单循环定时程序: 例如: MOV R5,#TIME LOOP: NOP NOP DJNZ R5,LOOP NOP指令的机器周期为1,DJNZ为2,则循环一次共4个机器 周期。 若单片机晶振6MHz,机器周期为2us,故延时为8us*TIME? 循环结构的另一应用――定时程序定时程序也是典型的循环程序,它是通过执行一个具有固定 延时时间得循环体来实现延时的。定时程序只能用汇编语言 编写。定时功能还能用定时器/计数器实现。 ? 多循环定时程序:获得较长延时 例如: MOV R5,#TIME1;1个机器周期 LOOP2: MOV R4,#TIME2;1个机器周期 LOOP1: NOP ;1个机器周期 NOP ;1个机器周期 DJNZ R4,LOOP1;2个机器周期 DJNZ R5,LOOP2;2个机器周期 RET ;2个机器周期 延时:(TIME2*4+2+1)*TIME1*机器周期+2*机器周期? 5. 查表程序查表程序广泛应用于显示、打印字符的转换以及 数据补偿、计算、转换等程序中。 ( 1)用DPTR作为基址的查表程序 通常由三步完成: ①将所查表格的首地址存入DPTR中; ②将所查表格的项数即所需读取的表格元素在表 中的位置是第几项送到累加器A中; ③执行查表指令 MOVC A,@A+DPTR,把表 中读取的数据送回到累加器A中。 例2.50:见书(P49)RE: MOV DPTR, #TAB MOV A,31H CLR C RLC A MOV 31H, A XCH A, 30H RLC A XCH A, 30H MOV A,31H ADD A, DPL MOV DPL, A MOV A, DPH ADDC A, 30H MOV DPH, A CLR A MOVC A, @A+DPTR MOV 30H ,A INC DPTR CLR A MOVC A, @A+DPTR MOV 31H, A RET TAB: DW ××;X*2,双字节表,低字节左移一位 ;高字节左移;加表首地址;取出温度数据高位;取出温度数据低位 (2)用PC作为基址的查表程序 MOVC A,@A+PC? 该指令执行时先将所查表格的项数送到累加器A中,再进行地址调整,把偏移量加到A中 。? 偏移地址(DATA)计算方式为 :DATA = 表格首地址-(该指令所在的地址+1),? 用ADDA,#DATA? 执行完这条指令后PC的内容不变,只要改变A中值,即可将表格各位数据读出。 例2.49:已知30H的低4位有一位十六进制数,把它转成ASCⅡ 码送30H中。 ORG H:MOV A,30H 1002H:ANL A,#0FH ;屏蔽高四位 1004H: ADD A,#(TAB-HTA-1) ;加偏移量 HTA: MOVC A,@A+PC ;查表,HTA=H: MOV 30H,A ;30H ← A 1009H: SJMP $ TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46H END(TAB为100B)偏移量=表格首地址-(该指令所在的地址+1),即等于MOVC查表指令和数据表格之间的字节数。 小结???DPTR:能提供16位基址,可以在使用前给 DPTR赋值。查表范围可达整个程序存储器 64KB空间,远程查表。 PC虽然也能提供16位地址,但不能赋值。基 址值是固定的。A的内容为8位无符号的数, 只能在256个地址单元内寻址,近程查表。 使用MOVC A, @A+PC时注意对A的修正。 6.子程序设计 (1)子程序设计时注意事项: ① 子程序的入口地址: 给子程序赋一个名字,实际为入口地址的符号地址。 ②子程序的参数传递:入口与出口 入口参数――主程序在指定位置提供给子程序的数 据。主调程序在调用子程序前,应将入口参数放在 指定的空间以便传给子程序,子程序运行后将在这 些空间得到需要处理的数据或数据所在的地址。 出口参数――子程序运行结束前,把处理好的结果 送到指定的位置,以便返回主程序后,主程序可以 从指定位置得到需要的结果,这类子程序返回主程 序的参数就是出口参数。 参数传递的方法 主要有三种传递方法 ? 利用寄存器或片内RAM传送参数。 ? 利用寄存器传送参数的地址。 ? 利用堆栈传送参数。 ③保护与恢复现场: 保护现场:压栈指令PUSH 恢复现场:弹出指令POP ④ 子程序嵌套 子程序可以嵌套,子程序运行时,通过子程序中 调用指令,调用另外子程序。 ⑤子程序的返回 子程序运行完后,通过子程序中最后1条指令 RET,返回原来的主程序。 例2.51 把A中的4位二进制数转成ASCII码,结果存 入A中。入口参数:待转换的二进制数在A中。 出口参数:转换后的ASCII码在A中 ZHCX: CJNE A ,#0AH,NEXT NEXT : JC ASC1 ADD A , #07H ASC1: ADD A,#30H RET 例2.52 ASCII码转换成十六进制数 入口参数:待转换的 ASCII 码在R2中。 出口参数:转换后的十六进制数在R3中。 XP: MOV A,R2 CLR C SUBB A,#30H CLR C JNB ACC.4,M1 SUBB A,#7 M1: MOV R3,A SJMP $ 例2.53 双字节BCD码整数转换成双字节十六进制整数M OV A,R3 ;将低字节转换成十六进制 LCALL BCD1 MOV R3,A MOV A,R2 ;将高字节转换成十六进制 LCALL BCD1 MOV B,#100 ;扩大一百倍 MUL AB ADD A,R3 ;和低字节按十六进制相加 MOV R3,A CLR A ADDC A,B MOV R2,A SJMP $ BCD1: MOV B,#10H ;分离十位和个位 DIV AB MOV R4,B ;暂存个位 MOV B,#10 ;将十位转换成十六进制 MUL AB ADD A,R4 ;十六进制加上个位 RET BH2: 例2.54 二进制数转成十进制数(BCD码) 入口参数:待转换的 二进制数在R2中。 出口参数:转换为的三位BCD码,存放在R3(百位), R4(十位),R5(个位)中 MOV A, R2 ;取二进制数. MOV B, #100 DIV AB ;除以100 MOV R3, A ;A中是百位数. MOV A, #10 XCH A, B DIV AB ;再除以10 MOV R4, A ; A中是十位数. MOV R5, B ;B中的数是个位 RET
MCS-51指令系统及汇编程序―汇集和整理大量word文档,专业文献,应用文书,考试资料,教学教材,办公文档,教程攻略,文档搜索下载下载,拥有海量中文文档库,关注高价值的实用信息,我们一直在努力,争取提供更多下载资源。

我要回帖

更多关于 天正2014机器码怎么看 的文章

 

随机推荐