51子程序库

合集下载

MCS-51单片机程序设计

MCS-51单片机程序设计

+1
,当X>0
Y= 0
,当X=0
开始
-1
,当X<0
X=0
N
程序流程框图如图4.1所示。 Y
Y←0
X>0 Y
Y←1
N Y←-1
结束
程序如下: ORG
MOV CJNE MOV AJMP MP1: JB MOV LJMP MP2: MOV HERE: SJMP
1000H A,R0 A,#00H,MP1 R1,#00H HERE ACC.7 MP2 R1,#01H HERE R1,#0FFH HERE
1000H DPTR,#2000H DPL DPH DPTR,#3000H R2,DPL R3,DPH
;源数据区首地址 ;源首址暂存堆栈
;目的数据区首地址 ;目的首址暂存寄存器
LOOP:
POP POP MOVX INC PUSH PUSH MOV MOV MOVX MOV MOV DJNZ SJMP
;源数据区首地址 ;目的数据区首地址 ;循环次数 ;取数据 ;数据传送 ;源地址加1 ;目的地址加1 ;循环控制 ;结束
例4.8 外部RAM之间的数据传送程序。
把外部RAM 2000H开始单元中的数据传送到外部RAM 3000H开始的单 元中,数据个数在内部RAM的35H单元中。
START:
ORG MOV PUSH PUSH MOV MOV MOV
K=?
K=0
K=1
转向 0 分支 转向 1 分支
K= n-1
K=n
转向 n-1 分支 转向 n 分支
例4.5 设内部RAM的30H单元有一个数,根据该数值的不同 转移到不同的程序段进行处理,设数值的范围为0~10的 无符号数。

51单片机汇编中断程序调用子程序

51单片机汇编中断程序调用子程序

文章标题:深度解析:51单片机汇编中断程序调用子程序一、介绍在51单片机的汇编编程中,中断程序和子程序的调用是非常重要的内容。

本文将深入讨论51单片机汇编中断程序如何调用子程序的相关知识,帮助读者更加深入地理解这一主题。

二、51单片机汇编中断程序调用子程序的基本原理在51单片机中,中断是指在程序运行过程中,由硬件或者软件主动触发的一种事件,当中断发生时,CPU会立即暂停正在执行的程序,转而去执行与该中断相关的处理程序,当处理完毕后再返回原程序继续执行。

子程序则是一段独立的代码,可以被主程序或其他子程序调用执行。

中断程序调用子程序的基本原理是,当中断发生时,CPU会跳转到中断服务程序进行处理,在中断服务程序中可以调用需要的子程序进行处理,处理完毕后再返回中断服务程序,最终返回到原来的程序中继续执行。

三、中断程序调用子程序的具体实现方法1. 中断程序的编写首先需要编写中断程序,并向51单片机的中断向量表中注册相应的中断号。

在中断程序中,可以调用需要的子程序进行处理。

2. 子程序的编写编写需要被调用的子程序,并保证其能够正确地处理需要的任务。

子程序的调用和返回是通过特定的指令来实现的。

3. 调用和返回在中断程序中,通过特定的指令调用需要的子程序,等待子程序执行完成后再进行返回。

这里需要特别注意子程序调用的参数传递和返回值的处理。

四、中断程序调用子程序的实际应用中断程序调用子程序在实际应用中有着广泛的用途,比如在实时系统中,可以利用中断程序调用子程序来实现即时响应;在通信系统中,可以利用中断程序调用子程序来实现数据处理和通信协议的处理等。

五、个人观点和总结中断程序调用子程序是51单片机汇编编程中的重要内容,掌握了这一技术可以让我们更加灵活地进行程序设计和开发。

通过本文的深度解析,希望读者能够更加深入地理解和掌握这一知识,并在实际应用中发挥其作用。

完整的文章已经写好并按照知识的文章格式进行了排版,总字数超过3000字。

51单片机浮点运算子程序库

51单片机浮点运算子程序库

51单片机浮点运算子程序库时间:2007-11-14 来源: 作者: 点击:3967 字体大小:【大中小】1: FSDT 功能:浮点数格式化2: FADD 功能:浮点数加法3: FSUB 功能:浮点数减法4: FMUL 功能:浮点数乘法5: FDIV 功能:浮点数除法6: FCLR 功能:浮点数清零7: FZER 功能:浮点数判零8: FMOV 功能:浮点数传送9: FPUS 功能:浮点数压栈10: FPOP 功能:浮点数出栈11: FCMP 功能:浮点数代数值比较不影响待比较操作数12: FABS 功能:浮点绝对值函数13: FSGN 功能:浮点符号函数14: FINT 功能:浮点取整函数15: FRCP 功能:浮点倒数函数16: FSQU 功能:浮点数平方17: FSQR 功能:浮点数开平方快速逼近算法18: FPLN 功能:浮点数多项式计算19: FLOG 功能:以10为底的浮点对数函数20: FLN 功能:以e为底的浮点对数函数21: FE10 功能:以10为底的浮点指数函数22: FEXP 功能:以e为底的浮点指数函数23: FE2 功能:以2为底的浮点指数函数24: DTOF 功能:双字节十六进制定点数转换成格式化浮点数25: FTOD 功能:格式化浮点数转换成双字节定点数26: BTOF 功能:浮点BCD码转换成格式化浮点数27: FTOB 功能:格式化浮点数转换成浮点BCD码28: FCOS 功能:浮点余弦函数29: FSIN 功能:浮点正弦函数30: FATN 功能:浮点反正切函数31: RTOD 功能:浮点弧度数转换成浮点度数32: DTOR 功能:浮点度数转换成浮点弧度数为便于读者使用本程序库,先将有关约定说明如下:1.双字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据,地址小的单元存放高字节。如果[R0]=1234H,若(R0)=30H,则(30H)=12H,(31H)=34H。2.二进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节纯小数(原码)来表示。当尾数的最高位为1时,便称为规格化浮点数,简称操作数。在程序说明中,也用[R0]或[R1]来表示R0或R1指示的浮点操作数,例如:当[R0]=-6.000时,则二进制浮点数表示为83C000H。若(R0)=30H,则(30H)=83H,(31H)=0C0H,(32H)=00H。3.十进制浮点操作数:用三个字节表示,第一个字节的最高位为数符,其余七位为阶码(二进制补码形式),第二字节为尾数的高字节,第三字节为尾数的低字节,尾数用双字节BCD码纯小数(原码)来表示。当十进制数的绝对值大于1时,阶码就等于整数部分的位数,如876.5 的阶码是03H,-876.5 的阶码是83H;当十进制数的绝对值小于1时,阶码就等于80H 减去小数点后面零的个数,例如0.00382 的阶码是7EH,-0.00382的阶码是0FEH。在程序说明中,用[R0]或[R1]来表示R0或R1指示的十进制浮点操作数。例如有一个十进制浮点操作数存放在30H、31H、32H中,数值是-0.07315,即-0.7315乘以10的-1次方,则(30H)=0FFH,31H=73H,(32H)=15H。若用[R0]来指向它,则应使(R0)=30H。4.运算精度:单次定点运算精度为结果最低位的当量值;单次二进制浮点算术运算的精度优于十万分之三;单次二进制浮点超越函数运算的精度优于万分之一;BCD码浮点数本身的精度比较低(万分之一到千分之一),不宜作为运算的操作数,仅用于输入或输出时的数制转换。不管那种数据格式,随着连续运算的次数增加,精度都会下降。5.工作区:数据工作区固定在A、B、R2~R7,数符或标志工作区固定在PSW和23H单元(位1CH~1FH)。在浮点系统中,R2、R3、R4和位1FH为第一工作区,R5、R6、R7和位1EH为第二工作区。用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。6.子程序调用范例:由于本程序库特别注意了各子程序接口的相容性,很容易采用积木方式(或流水线方式)完成一个公式的计算。以浮点运算为例:计算y = Ln √ | Sin (ab/c+d) |已知:a=-123.4;b=0.7577;c=56.34;d=1.276; 它们分别存放在30H、33H、36H、39H开始的连续三个单元中。用BCD码浮点数表示时,分别为a=831234H;b=007577H;c=025634H;d=011276H。求解过程:通过调用BTOF子程序,将各变量转换成二进制浮点操作数,再进行各种运算,最后调用FTOB子程序,还原成十进制形式,供输出使用。程序如下:TEST: MOV R0,#39H ;指向BCD码浮点操作数dLCALL BTOF ;将其转换成二进制浮点操作数MOV R0,#36H ;指向BCD码浮点操作数cLCALL BTOF ;将其转换成二进制浮点操作数MOV R0,#33H ;指向BCD码浮点操作数bLCALL BTOF ;将其转换成二进制浮点操作数MOV R0,#30H ;指向BCD码浮点操作数aLCALL BTOF ;将其转换成二进制浮点操作数MOV R1,#33H ;指向二进制浮点操作数bLCALL FMUL ;进行浮点乘法运算MOV R1,#36H ;指向二进制浮点操作数cLCALL FDIV ;进行浮点除法运算MOV R1,#39H ;指向二进制浮点操作数dLCALL FADD ;进行浮点加法运算LCALL FSIN ;进行浮点正弦运算LCALL FABS ;进行浮点绝对值运算LCALL FSQR ;进行浮点开平方运算LCALL FLN ;进行浮点对数运算LCALL FTOB ;将结果转换成BCD码浮点数STOP: LJMP STOPEND运行结果,[R0]=804915H,即y=-0.4915,比较精确的结果应该是-0.491437。(1) 标号: FSDT 功能:浮点数格式化入口条件:待格式化浮点操作数在[R0]中。出口信息:已格式化浮点操作数仍在[R0]中。影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节FSDT: LCALL MVR0 ;将待格式化操作数传送到第一工作区中LCALL RLN ;通过左规完成格式化LJMP MOV0 ;将已格式化浮点操作数传回到[R0]中(2) 标号: FADD 功能:浮点数加法入口条件:被加数在[R0]中,加数在[R1]中。出口信息:OV=0时,和仍在[R0]中,OV=1时,溢出。影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 6字节FADD: CLR F0 ;设立加法标志SJMP AS ;计算代数和(3) 标号: FSUB 功能:浮点数减法入口条件:被减数在[R0]中,减数在[R1]中。出口信息:OV=0时,差仍在[R0]中,OV=1时,溢出。影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节FSUB: SETB F0 ;设立减法标志AS: LCALL MVR1 ;计算代数和。先将[R1]传送到第二工作区MOV C,F0 ;用加减标志来校正第二操作数的有效符号RRC AXRL A,@R1MOV C,ACC.7ASN: MOV 1EH,C ;将第二操作数的有效符号存入位1EH中XRL A,@R0 ;与第一操作数的符号比较RLC AMOV F0,C ;保存比较结果LCALL MVR0 ;将[R0]传送到第一工作区中LCALL AS1 ;在工作寄存器中完成代数运算MOV0: INC R0 ;将结果传回到[R0]中的子程序入口INC R0MOV A,R4 ;传回尾数的低字节MOV @R0,ADEC R0MOV A,R3 ;传回尾数的高字节MOV @R0,ADEC R0MOV A,R2 ;取结果的阶码MOV C,1FH ;取结果的数符MOV ACC.7,C ;拼入阶码中MOV @R0,ACLR ACC.7 ;不考虑数符CLR OV ;清除溢出标志CJNE A,#3FH,MV01;阶码是否上溢?SETB OV ;设立溢出标志MV01: MOV A,@R0 ;取出带数符的阶码RETMVR0: MOV A,@R0 ;将[R0]传送到第一工作区中的子程序MOV C,ACC.7 ;将数符保存在位1FH中MOV 1FH,CMOV C,ACC.6 ;将阶码扩充为8bit补码MOV ACC.7,CMOV R2,A ;存放在R2中INC R0MOV A,@R0 ;将尾数高字节存放在R3中MOV R3,AINC R0MOV A,@R0 ;将尾数低字节存放在R4中MOV R4,ADEC R0 ;恢复数据指针DEC R0RETMVR1: MOV A,@R1 ;将[R1]传送到第二工作区中的子程序MOV C,ACC.7 ;将数符保存在位1EH中MOV 1EH,CMOV C,ACC.6 ;将阶码扩充为8bit补码MOV ACC.7,CMOV R5,A ;存放在R5中INC R1MOV A,@R1 ;将尾数高字节存放在R6中MOV R6,AINC R1MOV A,@R1 ;将尾数低字节存放在R7中MOV R7,ADEC R1 ;恢复数据指针DEC R1RETAS1: MOV A,R6 ;读取第二操作数尾数高字节ORL A,R7JZ AS2 ;第二操作数为零,不必运算MOV A,R3 ;读取第一操作数尾数高字节ORL A,R4JNZ EQ1MOV A,R6 ;第一操作数为零,结果以第二操作数为准MOV R3,AMOV A,R7MOV R4,AMOV A,R5MOV R2,AMOV C,1EHAS2: RETEQ1: MOV A,R2 ;对阶,比较两个操作数的阶码XRL A,R5JZ AS4 ;阶码相同,对阶结束JB ACC.7,EQ3;阶符互异MOV A,R2 ;阶符相同,比较大小CLR CSUBB A,R5JC EQ4EQ2: CLR C ;第二操作数右规一次MOV A,R6 ;尾数缩小一半RRC AMOV R6,AMOV A,R7RRC AMOV R7,AINC R5 ;阶码加一ORL A,R6 ;尾数为零否?JNZ EQ1 ;尾数不为零,继续对阶MOV A,R2 ;尾数为零,提前结束对阶MOV R5,ASJMP AS4EQ3: MOV A,R2 ;判断第一操作数阶符JNB ACC.7,EQ2;如为正,右规第二操作数EQ4: CLR CLCALL RR1 ;第一操作数右规一次ORL A,R3 ;尾数为零否?JNZ EQ1 ;不为零,继续对阶MOV A,R5 ;尾数为零,提前结束对阶MOV R2,AAS4: JB F0,AS5 ;尾数加减判断MOV A,R4 ;尾数相加ADD A,R7MOV R4,AMOV A,R3ADDC A,R6JNC AS2LJMP RR1 ;有进位,右规一次AS5: CLR C ;比较绝对值大小MOV A,R4SUBB A,R7MOV B,AMOV A,R3SUBB A,R6JC AS6MOV R4,B ;第一尾数减第二尾数MOV R3,ALJMP RLN ;结果规格化AS6: CPL 1FH ;结果的符号与第一操作数相反CLR C ;结果的绝对值为第二尾数减第一尾数MOV A,R7SUBB A,R4MOV R4,AMOV A,R6SUBB A,R3MOV R3,ARLN: MOV A,R3 ;浮点数规格化ORL A,R4 ;尾数为零否?JNZ RLN1MOV R2,#0C1H;阶码取最小值RETRLN1: MOV A,R3JB ACC.7,RLN2;尾数最高位为一否?CLR C ;不为一,左规一次LCALL RL1SJMP RLN ;继续判断RLN2: CLR OV ;规格化结束RETRL1: MOV A,R4 ;第一操作数左规一次RLC A ;尾数扩大一倍MOV R4,AMOV A,R3MOV R3,ADEC R2 ;阶码减一CJNE R2,#0C0H,RL1E;阶码下溢否?CLR AMOV R3,A ;阶码下溢,操作数以零计MOV R4,AMOV R2,#0C1HRL1E: CLR OVRETRR1: MOV A,R3 ;第一操作数右规一次RRC A ;尾数缩小一半MOV R3,AMOV A,R4RRC AMOV R4,AINC R2 ;阶码加一CLR OV ;清溢出标志CJNE R2,#40H,RR1E;阶码上溢否?MOV R2,#3FH ;阶码溢出SETB OVRR1E: RET(4) 标号:FMUL 功能:浮点数乘法入口条件:被乘数在[R0]中,乘数在[R1]中。出口信息:OV=0时,积仍在[R0]中,OV=1时,溢出。影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节FMUL: LCALL MVR0 ;将[R0]传送到第一工作区中MOV A,@R0XRL A,@R1 ;比较两个操作数的符号RLC AMOV 1FH,C ;保存积的符号LCALL MUL0 ;计算积的绝对值LJMP MOV0 ;将结果传回到[R0]中MUL0: LCALL MVR1 ;将[R1]传送到第二工作区中MUL1: MOV A,R3 ;第一尾数为零否?ORL A,R4MOV A,R6 ;第二尾数为零否?ORL A,R7JZ MUL5MOV A,R7 ;计算R3R4×R6R7-→R3R4 MOV B,R4MUL ABMOV A,BXCH A,R7MOV B,R3MUL ABADD A,R7MOV R7,ACLR AADDC A,BXCH A,R4MOV B,R6MUL ABADD A,R7MOV R7,AMOV A,BADDC A,R4MOV R4,ACLR ARLC AXCH A,R3MOV B,R6MUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,AJB ACC.7,MUL2;积为规格化数否? MOV A,R7 ;左规一次RLC AMOV R7,AMUL2: MOV A,R7JNB ACC.7,MUL3INC R4MOV A,R4JNZ MUL3INC R3MOV A,R3JNZ MUL3MOV R3,#80HINC R2MUL3: MOV A,R2 ;求积的阶码ADD A,R5MD: MOV R2,A ;阶码溢出判断JB ACC.7,MUL4JNB ACC.6,MUL6MOV R2,#3FH ;阶码上溢,设立标志SETB OVRETMUL4: JB ACC.6,MUL6MUL5: CLR A ;结果清零(因子为零或阶码下溢)MOV R3,AMOV R4,AMOV R2,#41HMUL6: CLR OVRET(5) 标号: FDIV 功能:浮点数除法入口条件:被除数在[R0]中,除数在[R1]中。出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出。影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节FDIV: INC R0MOV A,@R0INC R0ORL A,@R0DEC R0DEC R0JNZ DIV1MOV @R0,#41H;被除数为零,不必运算CLR OVRETDIV1: INC R1MOV A,@R1INC R1ORL A,@R1DEC R1DEC R1JNZ DIV2SETB OV ;除数为零,溢出RETDIV2: LCALL MVR0 ;将[R0]传送到第一工作区中MOV A,@R0XRL A,@R1 ;比较两个操作数的符号RLC AMOV 1FH,C ;保存结果的符号LCALL MVR1 ;将[R1]传送到第二工作区中LCALL DIV3 ;调用工作区浮点除法LJMP MOV0 ;回传结果DIV3: CLR C ;比较尾数的大小MOV A,R4SUBB A,R7MOV A,R3SUBB A,R6JC DIV4LCALL RR1 ;被除数右规一次SJMP DIV3DIV4: CLR A ;借用R0R1R2作工作寄存器XCH A,R0 ;清零并保护之PUSH ACCCLR AXCH A,R1PUSH ACCMOV A,R2PUSH ACCMOV B,#10H ;除法运算,R3R4/R6R7-→R0R1 DIV5: CLR CMOV A,R1RLC AMOV R1,AMOV A,R0RLC AMOV R0,AMOV A,R4RLC AMOV R4,AXCH A,R3RLC AXCH A,R3MOV F0,CCLR CSUBB A,R7MOV R2,AMOV A,R3SUBB A,R6ANL C,/F0JC DIV6MOV R3,AMOV A,R2MOV R4,AINC R1DIV6: DJNZ B,DIV5MOV A,R6 ;四舍五入CLR CRRC ASUBB A,R3CLR AADDC A,R1 ;将结果存回R3R4MOV R4,ACLR AADDC A,R0MOV R3,APOP ACC ;恢复R0R1R2MOV R2,APOP ACCMOV R1,APOP ACCMOV R0,AMOV A,R2 ;计算商的阶码CLR CSUBB A,R5LCALL MD ;阶码检验LJMP RLN ;规格化(6) 标号: FCLR 功能:浮点数清零入口条件:操作数在[R0]中。出口信息:操作数被清零。影响资源:A 堆栈需求: 2字节FCLR: INC R0INC R0CLR AMOV @R0,ADEC R0MOV @R0,ADEC R0MOV @R0,#41HRET(7) 标号: FZER 功能:浮点数判零入口条件:操作数在[R0]中。出口信息:若累加器A为零,则操作数[R0]为零,否则不为零。影响资源:A 堆栈需求: 2字节FZER: INC R0INC R0MOV A,@R0DEC R0ORL A,@R0DEC R0JNZ ZEROMOV @R0,#41HZERO: RET(8) 标号: FMOV 功能:浮点数传送入口条件:源操作数在[R1]中,目标地址为[R0]。出口信息:[R0]=[R1],[R1]不变。影响资源:A 堆栈需求: 2字节FMOV: INC R0INC R0INC R1INC R1MOV A,@R1MOV @R0,ADEC R0DEC R1MOV A,@R1MOV @R0,ADEC R0DEC R1MOV A,@R1MOV @R0,ARET(9) 标号: FPUS 功能:浮点数压栈入口条件:操作数在[R0]中。出口信息:操作数压入栈顶。影响资源:A、R2、R3 堆栈需求: 5字节FPUS: POP ACC ;将返回地址保存在R2R3中MOV R2,APOP ACCMOV R3,AMOV A,@R0 ;将操作数压入堆栈PUSH ACCINC R0MOV A,@R0PUSH ACCINC R0MOV A,@R0PUSH ACCDEC R0DEC R0MOV A,R3 ;将返回地址压入堆栈PUSH ACCMOV A,R2PUSH ACCRET ;返回主程序(10) 标号: FPOP 功能:浮点数出栈入口条件:操作数处于栈顶。出口信息:操作数弹至[R0]中。影响资源:A、R2、R3 堆栈需求: 2字节FPOP: POP ACC ;将返回地址保存在R2R3中MOV R2,APOP ACCMOV R3,AINC R0INC R0POP ACC ;将操作数弹出堆栈,传送到[R0]中MOV @R0,ADEC R0POP ACCMOV @R0,ADEC R0POP ACCMOV @R0,AMOV A,R3 ;将返回地址压入堆栈PUSH ACCMOV A,R2PUSH ACCRET ;返回主程序(11) 标号: FCMP 功能:浮点数代数值比较(不影响待比较操作数)入口条件:待比较操作数分别在[R0]和[R1]中。出口信息:若CY=1,则[R0] < [R1],若CY=0且A=0则[R0] = [R1],否则[R0] > [R1]。影响资源:A、B、PSW 堆栈需求: 2字节FCMP: MOV A,@R0 ;数符比较XRL A,@R1JNB ACC.7,CMP2MOV A,@R0 ;两数异号,以[R0]数符为准RLC AMOV A,#0FFHRETCMP2: MOV A,@R1 ;两数同号,准备比较阶码MOV C,ACC.6MOV ACC.7,CMOV B,AMOV A,@R0MOV C,ACC.7MOV F0,C ;保存[R0]的数符MOV C,ACC.6MOV ACC.7,CCLR C ;比较阶码SUBB A,BJZ CMP6RLC A ;取阶码之差的符号JNB F0,CMP5CPL C ;[R0]为负时,结果取反CMP5: MOV A,#0FFH ;两数不相等RETCMP6: INC R0 ;阶码相同时,准备比较尾数INC R0INC R1INC R1CLR CMOV A,@R0SUBB A,@R1MOV B,A ;保存部分差DEC R0DEC R1MOV A,@R0SUBB A,@R1DEC R0DEC R1ORL A,B ;生成是否相等信息JZ CMP7JNB F0,CMP7CPL C ;[R0]为负时,结果取反CMP7: RET(12) 标号: FABS 功能:浮点绝对值函数入口条件:操作数在[R0]中。出口信息:结果仍在[R0]中。影响资源:A 堆栈需求: 2字节FABS: MOV A,@R0 ;读取操作数的阶码CLR ACC.7 ;清除数符MOV @R0,A ;回传阶码RET(13) 标号: FSGN 功能:浮点符号函数入口条件:操作数在[R0]中。出口信息:累加器A=1 时为正数,A=0FFH时为负数,A=0 时为零。影响资源:PSW、A 堆栈需求: 2字节FSGN: INC R0 ;读尾数MOV A,@R0INC R0ORL A,@R0DEC R0DEC R0JNZ SGNRET ;尾数为零,结束SGN: MOV A,@R0 ;读取操作数的阶码RLC A ;取数符MOV A,#1 ;按正数初始化JNC SGN1 ;是正数,结束MOV A,#0FFH ;是负数,改变标志SGN1: RET(14) 标号: FINT 功能:浮点取整函数入口条件:操作数在[R0]中。出口信息:结果仍在[R0]中。影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节FINT: LCALL MVR0 ;将[R0]传送到第一工作区中LCALL INT ;在工作寄存器中完成取整运算LJMP MOV0 ;将结果传回到[R0]中INT: MOV A,R3ORL A,R4JNZ INTACLR 1FH ;尾数为零,阶码也清零,结束取整MOV R2,#41HRETINTA: MOV A,R2JZ INTB ;阶码为零否?JB ACC.7,INTB;阶符为负否?CLR CSUBB A,#10H ;阶码小于16否?JC INTDRET ;阶码大于16,已经是整数INTB: CLR A ;绝对值小于一,取整后正数为零,负数为负一MOV R4,AMOV C,1FHRRC AMOV R3,ARL AMOV R2,AJNZ INTCMOV R2,#41HINTC: RETINTD: CLR F0 ;舍尾标志初始化INTE: CLR CLCALL RR1 ;右规一次ORL C,F0 ;记忆舍尾情况MOV F0,CCJNE R2,#10H,INTE;阶码达到16(尾数完全为整数)否? JNB F0,INTF ;舍去部分为零否?JNB 1FH,INTF;操作数为正数否?INC R4 ;对于带小数的负数,向下取整MOV A,R4JNZ INTFINC R3INTF: LJMP RLN ;将结果规格化(15) 标号: FRCP 功能:浮点倒数函数入口条件:操作数在[R0]中。出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 5字节FRCP: MOV A,@R0MOV C,ACC.7MOV 1FH,C ;保存数符MOV C,ACC.6 ;绝对值传送到第二工作区MOV ACC.7,CMOV R5,AINC R0MOV A,@R0MOV R6,AINC R0MOV A,@R0MOV R7,ADEC R0DEC R0ORL A,R6JNZ RCPSETB OV ;零不能求倒数,设立溢出标志RETRCP: MOV A,R6JB ACC.7,RCP2;操作数格式化否?CLR C ;格式化之MOV A,R7RLC AMOV R7,AMOV A,R6RLC AMOV R6,ADEC R5SJMP RCPRCP2: MOV R2,#1 ;将数值1.00传送到第一工作区MOV R3,#80HMOV R4,#0LCALL DIV3 ;调用工作区浮点除法,求得倒数LJMP MOV0 ;回传结果(16) 标号: FSQU 功能:浮点数平方入口条件:操作数在[R0]中。出口信息:OV=0时,平方值仍然在[R0]中,OV=1时溢出。影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 9字节FSQU: MOV A,R0 ;将操作数XCH A,R1 ;同时作为乘数PUSH ACC ;保存R1指针LCALL FMUL ;进行乘法运算POP ACCMOV R1,A ;恢复R1指针RET(17) 标号: FSQR 功能:浮点数开平方(快速逼近算法)入口条件:操作数在[R0]中。出口信息:OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错。影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节FSQR: MOV A,@R0JNB ACC.7,SQRSETB OV ;负数开平方,出错RETSQR: INC R0INC R0MOV A,@R0DEC R0ORL A,@R0DEC R0JNZ SQMOV @R0,#41H;尾数为零,不必运算CLR OVRETSQ: MOV A,@R0MOV C,ACC.6 ;将阶码扩展成8bit补码MOV ACC.7,CINC A ;加一CLR CRRC A ;除二MOV @R0,A ;得到平方根的阶码,回存之INC R0 ;指向被开方数尾数的高字节JC SQR0 ;原被开方数的阶码是奇数吗? MOV A,@R0 ;是奇数,尾数右规一次RRC AMOV @R0,AINC R0MOV A,@R0RRC AMOV @R0,ADEC R0SQR0: MOV A,@R0JZ SQR9 ;尾数为零,不必运算MOV R2,A ;将尾数传送到R2R3中INC R0MOV A,@R0MOV R3,AMOV A,R2 ;快速开方,参阅定点子程序说明ADD A,#57HJC SQR2ADD A,#45HJC SQR1ADD A,#24HMOV B,#0E3HMOV R4,#80HSJMP SQR3SQR1: MOV B,#0B2HMOV R4,#0A0HSJMP SQR3SQR2: MOV B,#8DH MOV R4,#0D0H SQR3: MUL AB MOV A,BADD A,R4MOV R4,AMOV B,AMUL ABXCH A,R3CLR CSUBB A,R3MOV R3,AMOV A,BXCH A,R2SUBB A,R2MOV R2,ASQR4: SETB C MOV A,R4RLC AMOV R6,ACLR ARLC AMOV R5,AMOV A,R3SUBB A,R6MOV B,AMOV A,R2SUBB A,R5JC SQR5INC R4MOV R2,AMOV R3,BSJMP SQR4SQR5: MOV A,R4 XCH A,R2RRC AMOV F0,CMOV R5,AMOV R4,#8SQR6: CLR CMOV A,R3RLC AMOV R3,ACLR CMOV A,R5SUBB A,R2JB F0,SQR7JC SQR8SQR7: MOV R5,AINC R3SQR8: CLR CMOV A,R5RLC AMOV R5,AMOV F0,CDJNZ R4,SQR6MOV A,R3 ;将平方根的尾数回传到[R0]中MOV @R0,ADEC R0MOV A,R2MOV @R0,ASQR9: DEC R0 ;数据指针回归原位CLR OV ;开方结果有效RET(18) 标号: FPLN 功能:浮点数多项式计算入口条件:自变量在[R0]中,多项式系数在调用指令之后,以40H结束。出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 4字节FPLN: POP DPH ;取出多项式系数存放地址POP DPLXCH A,R0 ;R0、R1交换角色,自变量在[R1]中XCH A,R1CLR A ;清第一工作区MOV R2,AMOV R3,AMOV R4,ACLR 1FHPLN1: CLR A ;读取一个系数,并装入第二工作区MOVC A,@A+DPTRMOV C,ACC.7MOV 1EH,CMOV C,ACC.6MOV ACC.7,CMOV R5,AINC DPTRCLR AMOVC A,@A+DPTRMOV R6,AINC DPTRCLR AMOVC A,@A+DPTRMOV R7,AINC DPTR ;指向下一个系数MOV C,1EH ;比较两个数符RRC AXRL A,23HRLC AMOV F0,C ;保存比较结果LCALL AS1 ;进行代数加法运算CLR A ;读取下一个系数的第一个字节MOVC A,@A+DPTRCJNE A,#40H,PLN2;是结束标志吗?XCH A,R0 ;运算结束,恢复R0、R1原来的角色XCH A,R1XCH A,R0LCALL MOV0 ;将结果回传到[R0]中CLR AINC DPTRJMP @A+DPTR ;返回主程序PLN2: MOV A,@R1 ;比较自变量和中间结果的符号XRL A,23HRLC AMOV 1FH,C ;保存比较结果LCALL MUL0 ;进行乘法运算SJMP PLN1 ;继续下一项运算(19) 标号: FLOG 功能:以10为底的浮点对数函数入口条件:操作数在[R0]中。出口信息:OV=0时,结果仍在[R0]中,OV=1时,负数或零求对数出错。影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:9字节FLOG: LCALL FLN ;先以e为底求对数JNB OV,LOGRET ;如溢出则停止计算LOG: MOV R5,#0FFH;系数0.43430(1/Ln10)MOV R6,#0DEHMOV R7,#5CHLCALL MUL1 ;通过相乘来换底LJMP MOV0 ;传回结果(20) 标号: FLN 功能:以e为底的浮点对数函数入口条件:操作数在[R0]中。出口信息:OV=0时,结果仍在[R0]中,OV=1时,负数或零求对数出错。影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求: 7字节FLN: LCALL MVR0 ;将[R0]传送到第一工作区JB 1FH,LNOV;负数或零求对数,出错MOV A,R3ORL A,R4JNZ LN0LNOV: SETB OVRETLN0: CLR CLCALL RL1 ;左规一次CLR AXCH A,R2 ;保存原阶码,清零工作区的阶码PUSH ACCLCALL RLN ;规格化LCALL MOV0 ;回传LCALL FPLN ;用多项式计算尾数的对数DB 7BH,0F4H,30H;0.029808DB 0FEH,85H,13H;-0.12996DB 7FH,91H,51H;0.28382DB 0FFH,0FAH,0BAH;-0.4897DB 0,0FFH,0CAH;0.99918DB 70H,0C0H,0;1.1442×10-5DB 40H ;结束POP ACC ;取出原阶码JNZ LN1RET ;如为零,则结束LN1: CLR 1EH ;清第二区数符MOV C,ACC.7MOV F0,C ;保存阶符JNC LN2CPL A ;当阶码为负时,求其绝对值INC ALN2: MOV R2,A ;阶码的绝对值乘以0.69315MOV B,#72HMUL ABXCH A,R2MOV R7,BMOV B,#0B1HMUL ABADD A,R7MOV R7,A ;乘积的尾数在R6R7R2中CLR AADDC A,BMOV R6,AMOV R5,#8 ;乘积的阶码初始化(整数部分为一字节) LN3: JB ACC.7,LN4;乘积格式化MOV A,R2RLC AMOV R2,AMOV A,R7RLC AMOV R7,AMOV A,R6RLC AMOV R6,ADEC R5SJMP LN3LN4: MOV C,F0 ;取出阶符,作为乘积的数符MOV ACC.7,CLJMP ASN ;与尾数的对数合并,得原操作数的对数(21) 标号: FE10 功能:以10为底的浮点指数函数入口条件:操作数在[R0]中。出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节FE10: MOV R5,#2 ;加权系数为3.3219(Log210)MOV R6,#0D4HMOV R7,#9AHSJMP EXP ;先进行加权运算,后以2为底统一求幂(22) 标号: FEXP 功能:以e为底的浮点指数函数入口条件:操作数在[R0]中。出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节FEXP: MOV R5,#1 ;加权系数为1.44272(Lng2e)MOV R6,#0B8HMOV R7,#0ABHEXP: CLR 1EH ;加权系数为正数LCALL MVR0 ;将[R0]传送到第一工作区LCALL MUL1 ;进行加权运算SJMP E20 ;以2为底统一求幂(23) 标号: FE2 功能:以2为底的浮点指数函数入口条件:操作数在[R0]中。出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出。影响资源:DPTR、PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节FE2: LCALL MVR0 ;将[R0]传送到第一工作区E20: MOV A,R3ORL A,R4JZ EXP1 ;尾数为零MOV A,R2JB ACC.7,EXP2;阶符为负?SETB CSUBB A,#6 ;阶码大于6否?JC EXP2JB 1FH,EXP0;数符为负否?MOV @R0,#3FH;正指数过大,幂溢出INC R0MOV @R0,#0FFHINC R0MOV @R0,#0FFHDEC R0DEC R0SETB OVRETEXP0: MOV @R0,#41H;负指数过大,幂下溢,清零处理CLR AINC R0MOV @R0,AINC R0MOV @R0,ADEC R0DEC R0CLR OVRETEXP1: MOV @R0,#1 ;指数为零,幂为1.00INC R0MOV @R0,#80HINC R0MOV @R0,#0DEC R0DEC R0CLR OVRETEXP2: MOV A,R2 ;将指数复制到第二工作区MOV R5,AMOV A,R3MOV R6,AMOV A,R4MOV R7,AMOV C,1FHMOV 1EH,CLCALL INT ;对第一区取整MOV A,R3JZ EXP4EXP3: CLR C ;使尾数高字节R3对应一个字节整数RRC AINC R2CJNE R2,#8,EXP3EXP4: MOV R3,AJNB 1FH,EXP5CPL A ;并用补码表示INC AEXP5: PUSH ACC ;暂时保存之LCALL RLN ;重新规格化CPL 1FHSETB F0LCALL AS1 ;求指数的小数部分LCALL MOV0 ;回传指数的小数部分LCALL FPLN ;通过多项式计算指数的小数部分的幂DB 77H,0B1H,0C9H;1.3564×10-3DB 7AH,0A1H,68H;9.8514×10-3DB 7CH,0E3H,4FH;0.055495DB 7EH,0F5H,0E7H;0.24014DB 0,0B1H,72H;0.69315DB 1,80H,0 ;1.00000DB 40H ;结束POP ACC ;取出指数的整数部分ADD A,R2 ;按补码加到幂的阶码上MOV R2,ACLR 1FH ;幂的符号为正LJMP MOV0 ;将幂传回[R0]中(24)标号: DTOF 功能:双字节十六进制定点数转换成格式化浮点数入口条件:双字节定点数的绝对值在[R0]中,数符在位1FH中,整数部分的位数在A中。出口信息:转换成格式化浮点数在[R0]中(三字节)。影响资源:PSW、A、R2、R3、R4、位1FH 堆栈需求: 6字节DTOF: MOV R2,A ;按整数的位数初始化阶码MOV A,@R0 ;将定点数作尾数MOV R3,AINC R0MOV A,@R0MOV R4,ADEC R0LCALL RLN ;进行规格化LJMP MOV0 ;传送结果到[R0]中(25) 标号: FTOD 功能:格式化浮点数转换成双字节定点数入口条件:格式化浮点操作数在[R0]中。出口信息:OV=1时溢出,OV=0时转换成功:定点数的绝对值在[R0]中(双字节),数符在位1FH中,F0=1 时为整数,CY=1时为一字节整数一字节小数,否则为纯小数。影响资源:PSW、A、B、R2、R3、R4、位1FH 堆栈需求: 6字节FTOD: LCALL MVR0 ;将[R0]传送到第一工作区MOV A,R2JZ FTD4 ;阶码为零,纯小数JB ACC.7,FTD4;阶码为负,纯小数SETB CSUBB A,#10HJC FTD1SETB OV ;阶码大于16,溢出RETFTD1: SETB CMOV A,R2SUBB A,#8 ;阶码大于8否?JC FTD3FTD2: MOV B,#10H ;阶码大于8,按双字节整数转换LCALL FTD8SETB F0 ;设立双字节整数标志CLR CCLR OVRETFTD3: MOV B,#8 ;按一字节整数一字节小数转换LCALL FTD8SETB C ;设立一字节整数一字节小数标志CLR F0CLR OVRETFTD4: MOV B,#0 ;按纯小数转换LCALL FTD8CLR OV ;设立纯小数标志CLR F0CLR CRETFTD8: MOV A,R2 ;按规定的整数位数进行右规CJNE A,B,FTD9MOV A,R3 ;将双字节结果传送到[R0]中MOV @R0,AINC R0MOV A,R4MOV @R0,ADEC R0RETFTD9: CLR CLCALL RR1 ;右规一次SJMP FTD8(26) 标号: BTOF 功能:浮点BCD码转换成格式化浮点数入口条件:浮点BCD码操作数在[R0]中。出口信息:转换成的格式化浮点数仍在[R0]中。影响资源:PSW、A、B、R2~R7、位1DH~1FH 堆栈需求:6字节BTOF: INC R0 ;判断是否为零。INC R0MOV A,@R0MOV R7,AMOV A,@R0MOV R6,ADEC R0ORL A,R7JNZ BTF0MOV @R0,#41H;为零,转换结束。RETBTF0: MOV A,@R0MOV C,ACC.7MOV 1DH,C ;保存数符。CLR 1FH ;以绝对值进行转换。MOV C,ACC.6 ;扩充阶码为八位。MOV ACC.7,CMOV @R0,AJNC BTF1ADD A,#19 ;是否小于1E-19?JC BTF2MOV @R0,#41H;小于1E-19时以0计。INC R0MOV @R0,#0INC R0MOV @R0,#0DEC R0DEC R0RETBTF1: SUBB A,#19JC BTF2MOV A,#3FH ;大于1E19时封顶。MOV C,1DHMOV ACC.7,CMOV @R0,AINC R0MOV @R0,#0FFHINC R0MOV @R0,#0FFHDEC R0RETBTF2: CLR A ;准备将BCD码尾数转换成十六进制浮点数。MOV R4,AMOV R3,AMOV R2,#10H ;至少两个字节。BTF3: MOV A,R7ADD A,R7DA AMOV R7,AMOV A,R6ADDC A,R6DA AMOV R6,AMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,ADEC R2JNB ACC.7,BTF3;直到尾数规格化。MOV A,R6 ;四舍五入。ADD A,#0B0HCLR AADDC A,R4MOV R4,ACLR AADDC A,R3MOV R3,AJNC BTF4MOV R3,#80HINC R2BTF4: MOV DPTR,#BTFL;准备查表得到十进制阶码对应的浮点数。MOV A,@R0ADD A,#19 ;计算表格偏移量。MOV B,#3ADD A,DPLMOV DPL,AJNC BTF5INC DPHBTF5: CLR A ;查表。MOVC A,@A+DPTRMOV C,ACC.6MOV ACC.7,CMOV R5,AMOV A,#1MOVC A,@A+DPTRMOV R6,AMOV A,#2MOVC A,@A+DPTRMOV R7,ALCALL MUL1 ;将阶码对应的浮点数和尾数对应的浮点数相乘。MOV C,1DH ;取出数符。MOV 1FH,CLJMP MOV0 ;传送转换结果。(27) 标号: FTOB 功能:格式化浮点数转换成浮点BCD码入口条件:格式化浮点操作数在[R0]中。出口信息:转换成的浮点BCD码仍在[R0]中。影响资源:PSW、A、B、R2~R7、位1DH~1FH 堆栈需求:6字节FTOB: INC R0MOV A,@R0INC R0ORL A,@R0DEC R0DEC R0JNZ FTB0MOV @R0,#41HRETFTB0: MOV A,@R0MOV C,ACC.7MOV 1DH,CMOV @R0,ALCALL MVR0MOV DPTR,#BFL0;绝对值大于或等于1时的查表起点。MOV B,#0 ;十的0次幂。MOV A,R2JNB ACC.7,FTB1MOV DPTR,#BTFL;绝对值小于1E-6时的查表起点。MOV B,#0EDH ;十的-19次幂。ADD A,#16JNC FTB1MOV DPTR,#BFLN;绝对值大于或等于1E-6时的查表起点。MOV B,#0FAH ;十的-6次幂。FTB1: CLR A ;查表,找到一个比待转换浮点数大的整数幂。MOVC A,@A+DPTRMOV C,ACC.6MOV ACC.7,CMOV R5,AMOV A,#1MOVC A,@A+DPTRMOV R6,AMOV A,#2MOVC A,@A+DPTRMOV R7,AMOV A,R5 ;和待转换浮点数比较。CLR CSUBB A,R2JB ACC.7,FTB2;差为负数。JNZ FTB3MOV A,R6CLR CSUBB A,R3JC FTB2JNZ FTB3MOV A,R7CLR CSUBB A,R4JNZ FTB3MOV R5,B ;正好是表格中的数。INC R5 ;幂加一。MOV R6,#10H ;尾数为0•1000。MOV R7,#0SJMP FTB6 ;传送转换结果。FTB2: INC DPTR ;准备表格下一项。INC DPTRINC DPTRINC B ;幂加一。SJMP FTB1 ;FTB3: PUSH B ;保存幂值。LCALL DIV3 ;相除,得到一个二进制浮点数的纯小数。FTB4: MOV A,R2 ;取阶码。JZ FTB5 ;为零吗?CLR CLCALL RR1 ;右规。SJMP FTB4FTB5: POP ACC ;取出幂值。MOV R5,A ;作为十进制浮点数的阶码。LCALL HB2 ;转换尾数的十分位和百分位。MOV R6,ALCALL HB2 ;转换尾数的千分位和万分位。MOV R7,AMOV A,R3 ;四舍五入。RLC ACLR AADDC A,R7DA AMOV R7,ACLR AADDC A,R6DA AMOV R6,AJNC FTB6MOV R6,#10HFTB6: INC R0 ;存放转换结果。INC R0MOV A,R7MOV @R0,ADEC R0MOV A,R6MOV @R0,ADEC R0MOV A,R5MOV C,1DH ;取出数符。MOV ACC.7,CMOV @R0,ARETHB2: MOV A,R4 ;尾数扩大100倍。MOV B,#100MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#100MUL ABADD A,R3MOV R3,AJNC HB21INC BHB21: MOV A,B ;将整数部分转换成BCD码。MOV B,#10DIV ABSWAP AORL A,BRETBTFL: DB 41H,0ECH,1EH ;1.0000E-19DB 45H,93H,93H ;1.0000E-18DB 48H,0B8H,78H ;1.0000E-17DB 4BH,0E6H,96H ;1.0000E-16DB 4FH,90H,1DH ;1.0000E-15DB 52H,0B4H,25H ;1.0000E-14DB 55H,0E1H,2EH ;1.0000E-13DB 59H,8CH,0BDH ;1.0000E-12 DB 5CH,0AFH,0ECH ;1.0000E-11 DB 5FH,0DBH,0E7H ;1.0000E-10 DB 63H,89H,70H ;1.0000E-9DB 66H,0ABH,0CCH ;1.0000E-8DB 69H,0D6H,0C0H ;1.0000E-7 BFLN: DB 6DH,86H,38H ;1.0000E-6 DB 70H,0A7H,0C6H ;1.0000E-5DB 73H,0D1H,0B7H ;1.0000E-4DB 77H,83H,12H ;1.0000E-3DB 7AH,0A3H,0D7H ;1.0000E-2 DB 7DH,0CCH,0CDH ;1.0000E-1 BFL0: DB 1,80H,00H ;1.0000DB 4,0A0H,00H ;1.0000E1DB 7,0C8H,00H ;1.0000E2DB 0AH,0FAH,00H ;1.0000E3DB 0EH,9CH,40H ;1.0000E4DB 11H,0C3H,50H ;1.0000E5DB 14H,0F4H,24H ;1.0000E6DB 18H,98H,97H ;1.0000E7DB 1BH,0BEH,0BCH ;1.0000E8DB 1EH,0EEH,6BH ;1.0000E9DB 22H,95H,03H ;1.0000E10DB 25H,0BAH,44H ;1.0000E11DB 28H,0E8H,0D5H ;1.0000E12 DB 2CH,91H,85H ;1.0000E13DB 2FH,0B5H,0E6H ;1.0000E14 DB 32H,0E3H,60H ;1.0000E15DB 36H,8EH,1CH ;1.0000E16DB 39H,31H,0A3H ;1.0000E17DB 3CH,0DEH,0BH ;1.0000E18DB 40H,8AH,0C7H ;1.0000E19(28) 标号: FCOS 功能:浮点余弦函数入口条件:操作数在[R0]中。出口信息:结果仍在[R0]中。影响资源:DPTR、PSW、A、B、R2~R7、位1DH~1FH 堆栈需求: 6字节FCOS: LCALL FABS ;COS(-X) = COS XMOV R5,#1 ;常数1.5708(π/2)MOV R6,#0C9HMOV R7,#10HCLR 1EHLCALL MVR0CLR F0LCALL AS1 ;x+(π/2)LCALL MOV0 ;保存结果,接着运行下面的FSIN程序(29) 标号: FSIN 功能:浮点正弦函数入口条件:操作数在[R0]中。出口信息:结果仍在[R0]中。影响资源:DPTR、PSW、A、B、R2~R7、位1DH~1FH 堆栈需求: 6字节FSIN: MOV A,@R0MOV C,ACC.7MOV 1DH,C ;保存自变量的符号CLR ACC.7 ;统一按正数计算MOV @R0,ALCALL MVR0 ;将[R0]传送到第一工作区MOV R5,#0 ;系数0.636627(2/π)MOV R6,#0A2HMOV R7,#0FAHCLR 1EHLCALL MUL1 ;相乘,自变量按(π/2)规一化MOV A,R2 ;将结果复制到第二区MOV R5,AMOV A,R3MOV R6,AMOV A,R4MOV R7,ALCALL INT ;第一区取整,获得象限信息MOV A,R2JZ SIN2SIN1: CLR C ;将浮点象限数转换成定点象限数LCALL RR1CJNE R2,#10H,SIN1MOV A,R4JNB ACC.1,SIN2CPL 1DH ;对于第三、四象限,结果取反SIN2: JB ACC.0,SIN3CPL 1FH ;对于第一、三象限,直接求规一化的小数SJMP SIN4SIN3: MOV A,R4 ;对于第二、四象限,准备求其补数INC AMOV R4,AJNZ SIN4INC R3SIN4: LCALL RLN ;规格化SETB F0LCALL AS1 ;求自变量归一化等效值LCALL MOV0 ;回传LCALL FPLN ;用多项式计算正弦值DB 7DH,93H,28H;0.07185DB 41H,0,0 ;0DB 80H,0A4H,64H;-0.64215DB 41H,0,0 ;0DB 1,0C9H,2;1.5704DB 41H,0,0 ;0DB 40H ;结束MOV A,@R0 ;结果的绝对值超过1.00吗?JZ SIN5JB ACC.6,SIN5INC R0 ;绝对值按1.00封顶MOV @R0,#80HINC R0MOV @R0,#0DEC R0DEC R0MOV A,#1SIN5: MOV C,1DH ;将数符拼入结果中MOV ACC.7,CRET(30) 标号: FATN 功能:浮点反正切函数入口条件:操作数在[R0]中。出口信息:结果仍在[R0]中。影响资源:DPTR、PSW、A、B、R2~R7、位1CH~1FH 堆栈需求:7字节FATN: MOV A,@R0MOV C,ACC.7MOV 1DH,C ;保存自变量数符CLR ACC.7 ;自变量取绝对值MOV @R0,ACLR 1CH ;清求余运算标志JB ACC.6,ATN1;自变量为纯小数否?JZ ATN1SETB 1CH ;置位求余运算标志LCALL FRCP ;通过倒数运算,转换成纯小数ATN1: LCALL FPLN ;通过多项式运算,计算反正切函数值DB 0FCH,0E4H,91H;-0.055802DB 7FH,8FH,37H;0.27922DB 0FFH,0EDH,0E0H;-0.46460DB 7BH,0E8H,77H;0.028377DB 0,0FFH,68H;0.9977DB 72H,85H,0ECH;3.1930×10-5DB 40H ;结束JNB 1CH,ATN2;需要求余运算否?CPL 1FH ;准备运算标志MOV C,1FHMOV F0,C ;常数1.5708(π/2)MOV R5,#1MOV R6,#0C9HMOV R7,#10HLCALL AS1 ;求余运算LCALL MOV0 ;回传ATN2: MOV A,@R0 ;拼入结果的数符MOV C,1DHMOV ACC.7,CRET(31) 标号: RTOD 功能:浮点弧度数转换成浮点度数入口条件:浮点弧度数在[R0]中。出口信息:转换成的浮点度数仍在[R0]中。影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节RTOD: MOV R5,#6 ;系数(180/π)传送到第二工作区MOV R6,#0E5HMOV R7,#2FHSJMP DR ;通过乘法进行转换(32) 标号: DTOR 功能:浮点度数转换成浮点弧度数入口条件:浮点度数在[R0]中。出口信息:转换成的浮点弧度数仍在[R0]中。影响资源:PSW、A、B、R2~R7、位1EH、1FH 堆栈需求:6字节DTOR: MOV R5,#0FBH;系数(π/180)传送到第二工作区MOV R6,#8EHMOV R7,#0FAHDR: LCALL MVR0 ;将[R0]传送到第一工作区CLR 1EH ;系数为正LCALL MUL1 ;通过乘法进行转换LJMP MOV0 ;结果传送到[R0]中END。

51系列单片机指令表

51系列单片机指令表
直接寻址单元送累加器A
E5direct
2
1
MOVdirect.A
累加器A送直接寻址单元
F5direct
2
I
MOVRn.#data
立即数送寄存器
78~7Fdata
2
I
MOVdirect,#data
立即数送直接寻址单元
75directdata
3
2
MOV@Ri,#data
立即数送内部RAM单元
76~77data
2
1
MOVdirect,Rn
寄存器送直接寻址单元
88~8Fdireci
2
2
MOVRn.direct
直接寻址单元送寄存器
A8~AFdirect
2
2
MOVdirect.@Ri
内部RAM单元送直接寻址单元
86~87direct
2
2
MOV@Ri,direct
直接寻址单元送内部RAM单元
A6-A7direct
DOdireci
2
2
PUSHdirect
直接寻址单元压入栈顶
COdirect
2
2
算术运算类指令
指令
功能简述
指令代码
字节

T
ADDA,Rn
累加器A加寄存器
28-2F
1
1
ADDA.@Ri
累器A加内部RAM单元
26-27
1
I
ADDA.direct
照加器A加直接寻址单元
25direct
2
1
ADDA.#data
盛加器A与寄存器交换
C8~CF
1
1
XCHA,@Ri

第3章51系列单片机程序设计(C语言部分)

第3章51系列单片机程序设计(C语言部分)

idata
间接寻址片内数据存储区,可访问片内全部RAM地址空间(256字节)
pdata
分页寻址片外数据存储区(256字节)由MOV @Ri访问(i=0,1)
xdata
片外数据存储区(64 KB)由MOVX @DPTR访问
code
程序存储器64 KB空间,由MOVC @DPTR访问
第3章 51系列单片机程序设计(C部分)
/* Ary37定义为abry[3]的第7位 */
第3章 51系列单片机程序设计(C部分)
3.5 数 组
数组:数组是一组类型相同 有序数据的集合。用数组名 和下标来唯一确定数组中的 元素。
第3章 51系列单片机程序设计(C部分)
3.5.1 一维数组
一、一维数组的定义 形式:类型说明符 数组名 [常量表达式]
使用C51进行编程时,MCS-51片内的I/O口与片外扩展的I/O可以统一在一个头文 件中定义,也可以在程序中(一般在开始的位置)进行定义。
对于MCS-51片内I/O口按特殊功能寄存器方法定义。 例如:
sfr P0=0x80 ; /* 定义P0口,地址为80H */ sfr P1=0x90 ; /* 定义P1口,地址为90H */
第3章 51系列单片机程序设计(C部分)
3.4.3 C51数据的存储类型与MCS-51存储结构
表 3.4.2 C51存储类型与MCS-51存储空间的对应关系
存储类型 与存储空间的对应关系
data
直接寻址片内数据存储区,访问速度快(128字节)
bdata
可位寻址片内数据存储区,允许位与字节混合访问(16字节)
据 浮点型(float) 类
型 指针类型
详细见表3.4.1

C51指令代码

C51指令代码

一、ACALL addr11指令名称:绝对挪用指令指令代码:A10 A9 A8 10001 A7 A6 A5 A4 A3 A2 A1 A0指令功能:构造目的地址,进行子程序挪用。

其方式是以指令提供的11位地址(al0~a0),取代PC的低11位,PC的高5位不变。

操作内容:PC←(PC)+2SP←(SP)+1(SP)←(PC)7~0SP←(SP)+1(SP)←(PC)15~8PC10~0←addrl0~0字节数: 2机械周期:2利用说明:由于指令只给出子程序入口地址的低11位,因此挪用范围是2KB。

二、ADD A,Rn指令名称:寄放器加法指令指令代码:28H~2FH指令功能:累加器内容与寄放器内容相加操作内容:A←(A)+(Rn), n=0~7字节数: 1机械周期;1阻碍标志位:C,AC,OV3、ADD A,direct指令名称:直接寻址加法指令指令代码:25H指令功能:累加器内容与内部RAM单元或专用寄放器内容相加操作内容:A←(A)+(direct)字节数: 2机械周期:1阻碍标志位:C,AC,OV4、ADD A,@Ri ’指令名称:间接寻址加法指令指令代码:26H~27H指令功能:累加器内容与内部RAM低128单元内容相加操作内容:A←(A)+((Ri)), i=0,1字节数: 1机械周期:1阻碍标志位:C,AC,OV五、ADD A,#data指令名称:当即数加法指令指令代码:24H指令功能:累加器内容与当即数相加操作内容:A←(A)+data字节数: 2机械周期:1阻碍标志位:C,AC,OV六、ADDC A,Rn指令名称:寄放器带进位加法指令指令代码:38H~3FH指令功能:累加器内容、寄放器内容和进位位相加操作内容:A←(A)+(Rn)+(C), n=0~7字节数: 1机械周期:1阻碍标志位:C,AC,OV7、ADDC A,direct指令名称:直接寻址带进位加法指令指令代码:35H指令功能:累加器内容、内部RAM低128单元或专用寄放器内容与进位位加操作内容:A←(A)+(direct)+(C)字节数: 2机械周期:1阻碍标志位:C,AC,OV八、ADDC A,@Ri指令名称:间接寻址带进位加法指令指令代码:36H~37H指令功能:累加器内容、内部RAM低128单元内容及进位位相加操作内容:A←(A)+((Ri))+(C), i=0,1字节数: 1机械周期:1阻碍标志位:C,AC,OV九、ADDC A,#data指令名称:当即数带进位加法指令指令代码:34H指令功能:累加器内容、当即数及进位位相加操作内容:A←(A)+data+(C)字节数: 2机械周期:1阻碍标志位:C,AC,OV10、AJMP addr11指令名称:绝对转移指令指令代码:A10 A9 A8 1 0 0 0 1 A7 A6 A5 A4 A3 A2 A1 A0指令功能:构造目的地址,实现程序转移。

51单片机AD转换和串口收发子程序代码

51单片机AD转换和串口收发子程序代码
return(ad); //返回转换结果
}
单片机控制串口无线收发的子程序代码
/**************************************
SCON^7——SM0,与SM1一起构成串口通信方式选择;
SCON^6——SM1;
SCON^4——REN,允许接收位,1为允许接收;
D_IN=(bit)(port&0x80); //送控制字
CLOCK=1; //上升沿
delay(1);
Ct;<=1; //控制字左移一位(下一循环送控制字下一位)
SCON^1——TI,发送中断标志位,发送结束后由硬件自动置1,复位需软件;
SCON^0——RI,接收中断标志位,接收结束后由硬件自动置1,复位需软件;
PCON^7——SMOD,波特率增倍位,1为增倍,0为不增倍;
IE^7——EA,中断允许总控制位,1为CPU开放中断,0为屏蔽所有中断请求;
TR1=1; //启动定时器1
ES=0; //禁止串行中断
}
/**************************************
名称:send
功能:发送一个字节
输入参数:待发送的字节
输出参数:无
*************************************/
单片机控制A/D转换子程序代码
/**************************************
名称:read2543
功能:TLC2543驱动模块
输入参数:port通道号
输出参数:ad转换值
*************************************/

51单片机指令系统

51单片机指令系统

第 3 章 MCS - 51单片机指令系统
POP DPH POP DPL POP ACC POP PSW 执行之后, SP内容修改为 60H, 而64H、 63H、 62H、 61H 单元中的内容依次弹出到DPH、DPL、A、PSW中。
MCS -51 提供一个向上升的堆栈, 因此SP设置初值时要
的总线。由Ri作为间接寻址寄存器时, P0 口上分时输出Ri指
定的 8 位地址信息及传输 8 位数据。
第 3 章 MCS - 51单片机指令系统
5. 堆栈操作指令 PUSH direct POP direct 在MCS -51 单片机的内部RAM中, 可以设定一个先进后 出的区域, 称其为堆栈。在特殊功能寄存器中有一个堆栈指针 SP, 它指出栈顶的位置。 进栈指令的功能是: 首先将堆栈指针 SP的内容加1, 然后将直接地址所指出的内容送入SP指出的内 部RAM单元; 出栈指令的功能是: 将SP所指出的内部RAM单 元的内容送入由直接地址所指出的字节单元, 接着将堆栈指针
第 3 章 MCS - 51单片机指令系统
3.2 指令系统
3.2.1 指令分类
按指令的功能, MCS -51 指令系统可分为下列 5 类:
(1) 数据传送;
(2) 算术运算; (3) 逻辑运算; (4) 位操作; (5) 控制转移。
第 3 章 MCS - 51单片机指令系统
Rn——当前选定的寄存器区中的 8 个工作寄存器R0~R7, 即 n=0~7。 Ri——当前选定的寄存器区中的 2 个寄存器R0、 R1, i=0、1。 direct—— 8 位内部RAM单元的地址, 它可以是一个内部数据 区 RAM单元(00H~7FH)或特殊功能寄存器地址(I / O端口、 控 制寄存器、 状态寄存器 80H~0FFH)。 #data——指令中的 8 位常数。

51单片机汇编指令总结

51单片机汇编指令总结

51单片机汇编指令总结数据传输指令一.片内ram数据传输指令1.以累加器a为目的操作数的指令:mova,rnmova,directmova,@rimova,#data2.以寄存器rn为目的操作数的指令:movrn,amovrn,directmovrn,data3.以轻易地址为目的操作数的指令:movdirect,amovdirect,rnmovdirect1,derect2movdirect,@rimovdirect,#data4.间接地址为目的操作数的指令:mov@ri,amov@ri,directmov@ri,#data5.十六位数据传送指令:movdptr,#data16二.累加器a与片外ram数据传输指令:movxa,@rimovxa,@dptrmovx@ri,amovx@dptr,a三.换算串行:movca,@a+dptr(先pc←(pc)+1,后a←((a)+(dptr)))+movca,@a+pc(先pc←(pc)+1,后a←((a)+(pc)))四.互换指令:1.字节交换指令:xcha,rnxcha,directxcha,@ri2.半字节交换指令:xchda,@ri3.累加器半字节交换指令:swapa五.栈操作指令:1.push(入栈指令)pushdirect2.pop(出栈指令)popdirect算术运算指令:一.乘法加法指令:1.加法指令:adda,rnadda,directadda,@riadda,#data2.拎位次乘法指令:addca,rna←(a)+(rn)+cyaddca,directa←(a)+(direct)+cyaddca,@ria←(a)+((ri))+cyaddca,#dataa←(a)+(data)+cy3.带借位减法指令:subba,rna←(a)-cy-(rn)subba,directa←(a)-cy-(direct)subba,@ria←(a)-cy-((ri))subba,#dataa←(a)-cy-#data二.乘法乘法指令:1.乘法指令:mulabba←(a)×(b)高字节放到b中,低字节放到a中2.乘法指令:divaba←(a)÷(b)的商,(b)←(a)÷(b)的余数三.加1减1指令:1.提1指令:incaa←(a)+1incrnrn←(rn)+1incdirectdirect←(direct)+1inc@ri(ri)←((ri))+1incdptrdptr←(dptr)+12.减至1指令:decadecrndecdirectdec@ri四.十进制调制指令:daa调整累加器a的内容为bcd码逻辑操作方式指令:一.逻辑与、或、异或指令:1.逻辑与指令:anla,rnanla,directanla,@rianla,#data2.逻辑或这而令:orla,rnorla,directorla,@riorla,#dataorldirect,aorldirect,#data3.逻辑异或指令:xrla,rnxrla,directxrla,@rixrla,#dataxrldirect,axrldirect,#data二.清零、row指令:1.累加器a清零指令:crla2.累加器arow指令:cpla三.循环位移指令:1.累加器a循环左移指令:rla2.累加器a循环右移指令:rra3.累加器a连同进位位循环左移指令:rlca4.累加器a连同进位位循环右移指令:rrca控制转移指令:一.无条件迁移指令:1.绝对转移指令:ajmpaddr11(先pc+2,然后将addr11的高十位托付给pc,pc的高六位维持不变)2.长转移指令:ljmpaddr16(用addr16的值替代pc的值)3.相对迁移(长迁移)指令:sjmprel(带符号的偏移字节数)(pc+2,再加rel赋值给pc)4.间接转移指令:jmp@a+dptr(a)+(dptr)→(pc)二.条件转移指令:1.累加器判零迁移指令:jzrel先pc+2;后判断,a为0时转移,pc+rel赋值给pc;否则顺序继续执行jnzrel先pc+2,后判断,a不为0时转移,pc+rel赋值给pc;否则顺序执行2.比较转移指令:cjne目的操作数,源操作数,relcjnea,direct,rel先pc+3传回pc,再比较目的操作数和原操作数cjnea,#data,rel目>源时,程序转移,pc+rel传回pc且cy=0cjnern,#data,rel目=源时,程序顺序执行cjne@ri,#data,rel目djnzrn,rel先pc\\+2,rn-1,当rn为0时程序顺序继续执行,否则pc+rel传到pcdjnzdirect,rel先pc+3,direct-1,direct为0时程序顺序继续执行,否则pc+rel传到pc二.子程序调用、返回指令:1.绝对调用指令acall:acalladdr11先pc+2,sp+1将pc的低八位存入sp;sp+1,将pc的高八位取走sp。

51单片机指令集

51单片机指令集

51单片机指令集在嵌入式系统的开发中,51单片机是一种常用的微控制器,其指令集对于程序设计和功能实现具有重要的意义。

本文将介绍51单片机指令集的组成结构、常用指令及其功能,以及应用示例。

一、指令集的组成结构51单片机指令集由多条指令组成,这些指令按照不同的功能进行分类和编码。

常见的指令分类包括数据传送指令、算术逻辑指令、位操作指令、分支指令和中断指令等。

1. 数据传送指令数据传送指令主要用于数据在寄存器和内存之间的传输。

其中包括将数据从一个寄存器传送到另一个寄存器、将数据从内存读取到寄存器中以及将数据从寄存器写入内存等操作。

例如,MOV指令用于将一个寄存器的值传送到另一个寄存器,如MOV A, B表示将寄存器B中的值传送到寄存器A中。

2. 算术逻辑指令算术逻辑指令主要用于进行算术和逻辑运算。

其中包括加法、减法、乘法、除法、逻辑与、逻辑或、逻辑非等操作。

例如,ADD A, B用于将寄存器A和寄存器B中的值相加,并将结果保存在寄存器A中。

3. 位操作指令位操作指令主要用于对寄存器或内存中的位进行操作。

其中包括位与、位或、位翻转、位置1、位清零等操作。

例如,ORL A, #0x0F用于将寄存器A的低4位与0x0F进行按位或运算,结果保存在寄存器A中。

4. 分支指令分支指令主要用于程序的跳转和循环控制。

其中包括无条件跳转、条件跳转、循环指令等。

例如,JMP 2000H用于无条件跳转到地址2000H处执行指令。

5. 中断指令中断指令主要用于处理外部中断信号,进行程序的中断与恢复。

例如,ENI指令用于允许外部中断的响应,而DISI指令用于禁止外部中断的响应。

二、常用指令及其功能1. MOV指令MOV指令用于将数据传送给目标操作数。

可以将立即数、寄存器或内存中的值传送给目标寄存器或内存。

2. ADD指令ADD指令用于将源操作数与目标操作数相加,并将结果保存在目标操作数中。

SUB指令用于将源操作数与目标操作数相减,并将结果保存在目标操作数中。

MCS-51指令集

MCS-51指令集

助记符说明字节数机器周期数据传送类MOV A,Rn寄存器内容传送到累加器A11 MOV A,direct直接寻址字节传送到累加器21 MOV A,@Ri间接寻址RAM传送到累加器11 MOV A,#data立即数传送到累加器21 MOV Rn,A累加器内容传送到寄存器11 MOV Rn,direct直接寻址字节传送到寄存器22 MOV Rn,#data立即数传送到寄存器21 MOV direct,A累加器内容传送到直接寻址字节21 MOV direct,Rn寄存器内容传送到直接寻址字节22 MOV direct1,direct2直接寻址字节2传送到直接寻址字节132 MOV direct,@Ri间接寻址RAM传送到直接寻址字节22 MOV direct,#data立即数传送到直接寻址字节32 MOV @Ri,A累加器传送到间接寻址RAM11 MOV @Ri,direct直接寻址字节传送到间接寻址RAM22 MOV @Ri,#data立即数传送到间接寻址RAM21 MOV DPTR,#data1616位常数装入到数据指针32MOVC A,@A+DPTR代码字节传送到累加器12 MOVC A,@A+PC代码字节传送到累加器12 MOVX A,@Ri外部RAM(8位地址)传送到A12 MOVX A,@DPTR外部RAM(16位地址)传送到A12 MOVX @Ri,A累加器传送到外部RAM(8位地址)12 MOVX @DPTR,A累加器传送到外部RAM(16位地址)12PUSH direct直接寻址字节压入栈顶22 POP direct栈顶字节弹到直接寻址字节22XCH A,Rn寄存器和累加器交换11 XCH A,direct直接寻址字节和累加器交换21 XCH A,@Ri间接寻址RAM和累加器交换11 XCHD A,@Ri间接寻址RAM和累加器交换低半字节11 SWAP A累加器内高低半字节交换11算术操作类ADD A,Rn寄存器内容加到累加器11 ADD A,direct直接寻址字节内容加到累加器21 ADD A,@Ri间接寻址RAM内容加到累加器11 ADD A,#data立即数加到累加器21 ADDC A,Rn寄存器加到累加器(带进位)11 ADDC A,direct直接寻址字节加到累加器(带进位)21 ADDC A,@Ri间接寻址RAM加到累加器(带进位)11 ADDC A,#data立即数加到累加器(带进位)21 SUBB A,Rn累加器内容减去寄存器内容(带借位)11 SUBB A,direct累加器内容减去直接寻址字节(带借位)21 SUBB A,@Ri累加器内容减去间接寻址RAM(带借位)11 SUBB A,#data累加器减去立即数(带借位)21INC A累加器增111INC Rn寄存器增111 INC direct直接寻址字节增121 INC @Ri间接寻址RAM增111 DEC A累加器减111 DEC Rn寄存器减111 DEC direct直接寻址字节减121 DEC @Ri间接寻址RAM减111 INC DPTR数据指针增112MUL AB累加器和寄存器B相乘14 DIV AB累加器除以寄存器B14 DA A累加器十进制调整11逻辑操作类ANL A,Rn寄存器与到累加器11 ANL A,direct直接寻址字节与到累加器21 ANL A,@Ri间接寻址RAM与到累加器11 ANL A,#data立即数与到累加器21 ANL direct,A累加器与到直接寻址字节21 ANL direct,#data立即数与到直接寻址字节32 ORL A,Rn寄存器或到累加器11 ORL A,direct直接寻址字节或到累加器21 ORL A,@Ri间接寻址RAM或到累加器11 ORL A,#data立即数或到累加器21 ORL direct,A累加器或到直接寻址字节22 ORL direct,#data立即数或到直接寻址字节31XRL A,Rn寄存器异或到累加器11 XRL A,direct直接寻址字节异或到累加器21 XRL A,@Ri间接寻址RAM字节异或到累加器11 XRL A,#data立即数异或到累加器21 XRL direct,A累加器异或到直接寻址字节21 XRL direct,#data立即数异或到直接寻址字节32 CLR A累加器清零11 CPL A累加器求反11 RL A累加器循环左移11 RLC A经过进位位的累加器循环左移11 RR A累加器循环右移11 RRC A经过进位位的累加器循环右移11控制转移类ACALL addrll绝对调用子程序22 LCALL addr16长调用子程序32 RET从子程序中返回12 RETI从中断中返回12 AJMP addrll绝对转移22 LJMP addr16长转移32 SJMP rel短转移(相对偏移)22JMP @A+DPTR相对DPTR的间接转移12JZ rel累加器为零则转移22 JNZ rel累加器为非零则转移22 CJNE A,direct,rel比较直接寻址字节和A,不相等则转移32 CJNE A,#data,rel比较立即数和A,不相等则转移32 CJNE Rn,#data,rel比较立即数和寄存器,不相等则转移32 CJNE @Ri,#data,rel比较立即数和间接寻址RAM,不相等则转移32 DJNZ Rn,rel寄存器减1,不为零则转移32 DJNZ direct,rel地址字节减1,不为零则转移32 NOP空操作12位操作类CLR C清进位位11 CLR bit清直接寻址位21 SETB C进位位置111 SETB bit直接寻址位置121CPL C进位位取反11 CPL bit直接寻址位取反21 ANL C,bit直接寻址位与到进位位22 ANL C,直接寻址位的反码与到进位位22 ORL C,bit直接寻址位或到进位位22 ORL C,直接寻址位的反码或到进位位22MOV C,bit直接寻址位送到进位位22 MOV bit,C进位位传送到直接寻址位22 JC rel如果进位位为1则转移22 JNC rel如果进位位为零则转移22 JB bit,rel如果直接寻址位为1则转移32 JNB bit,rel如果直接寻址位为零则转移32 JBC bit,rel如果直接寻址位为1则转移,并清除该位32E8H-EFHE5H,directE6H-E7H74H,dataF8H-FFHA8H-AFH,direct78H-7FH,dataF5H,direct88H-8FH,direct85H,direct2,direct1 86H-87H75H,direct,dataF6H-F7HA6H-A7H,direct76H-77H,data90H,dataH,dataL93H83HE2H-E3HE0HF2H-F3HF0HC0H,directD0H,directC8H-CFHC5H,directC6H-C7HD6H-D7HC4H28H-2FH25H,direct26H-27H24H,data38H-3FH35H,direct36H-37H34H,data98H-9FH95H direct96H-97H94H,data04H05H direct06H-07H14H18H-1FH15H,direct16H-17HA3HA4H84HD4H58H-5FH55H,direct56H-57H54H,data52H,direct53H,direct,data48H-4FH45H,direct46H-47H44H,data42H,direct43H,direct,data68H-6FH65H,direct66H-67H64H,dataH62H,direct63H,direct,dataE4HF4H23H33H03H13Ha10a9a8 10001,addr(7~0) 12H,addr(15~8),addr(7~0) 22H32Ha10a9a8 00001,addr(7~0) 02H,addr(15~8),addr(7~0) 80H,rel73H60H,rel70H,relB5H,direct,rel B4H,data,relB8H-BFH,data,rel B6HB7H,data,rel D8H-DFH,relD5H,direct,rel 00HC3HC2HD3HD2HB3HB2H82H,bitB0H,bit72H,bitA0H,bitA2H,bit92H,bit40H,rel50H,rel20H,bit,rel30H,bit,rel10H,bit,rel。

MCS-51单片机的指令集(分类)

MCS-51单片机的指令集(分类)
RET
子程序返回
1
24
RETI
中断返回
1
24
AJMP addr11
绝对短转移
2
24
LJMP addr16
长转移
3
24
SJMP rel
相对转移
2
24
JMP @A+DPTR
相对于DPTR的间接转移
1
24
JZ rel
累加器为零转移
2
24
JNZ rel
累加器非零转移
2
24
CJNE A,direct,rel
累加器与直接地址单元比较,不等则转移
2
12
MOV direct,Rn
寄存器内容送入直接地址单元
2
24
MOV direct,direct
直接地址单元中的数据送入直接地址单元
3
24
MOV direct,@Ri
间接RAM中的数据送入直接地址单元
2
24
MOV direct,#data8
8位立即数送入直接地址单元
3
24
MOV @Ri,A
累加器内容送入间接RAM单元
DEC @Ri
间接RAM内容减1
1
12
MUL A,B
A乘以B
1
48
DIV A,B
A除以B
1
48
DA A
累加器进行十进制转换
1
12
3、逻辑操作类指令
助记符
功能说明
字节数
振荡周期
ANL A,Rn
累加器与寄存器相“与”
1
12
ANL A,direct
累加器与直接地址单元相“与”

51单片机汇编语言指令教程汇集

51单片机汇编语言指令教程汇集

51单片机汇编语言指令教程汇集1.MOV指令:MOV指令用于将一个值从一个寄存器或内存位置复制到另一个寄存器或内存位置。

例如,MOVA,将常数10复制到累加器A中。

2.ADD指令:ADD指令用于将两个操作数相加,并将结果保存在目标操作数中。

例如,ADDA,B将寄存器B的值与累加器A的值相加,并将结果保存在累加器A中。

3.SUB指令:SUB指令用于将源操作数减去目标操作数,并将结果保存在目标操作数中。

例如,SUBA,B将寄存器B的值减去累加器A的值,并将结果保存在累加器A中。

4.INC指令:INC指令用于将指定的操作数加1、例如,INCA将累加器A的值加15.DEC指令:DEC指令用于将指定的操作数减1、例如,DECA将累加器A的值减16.JMP指令:JMP指令用于无条件地跳转到指定的地址。

例如,JMP1000h将跳转到地址1000h处执行指令。

9. ACALL指令:ACALL指令用于调用一个子程序,其地址由指令给出,子程序结束后返回到调用指令的下一条指令。

例如,ACALL Subroutine将调用一个名为Subroutine的子程序。

10.RET指令:RET指令用于从子程序返回到调用指令的下一条指令。

例如,RET将从子程序返回。

11.NOP指令:NOP指令用于空操作,即不执行任何操作。

它通常用于延时或填充空白。

以上是一些常用的51单片机汇编语言指令,这些指令可以用于控制I/O口、进行算术运算、执行跳转和调用子程序等。

学习并熟练掌握这些指令,对于编写高效的51单片机汇编程序非常重要。

希望本文提供的51单片机汇编语言指令教程能够帮助你入门和掌握51单片机汇编语言的基本知识。

如果你想深入学习51单片机汇编语言,建议参考相关的教材或在线资源,进行更加系统和全面的学习。

51单片机汇编指令表

51单片机汇编指令表

以下是一些常见的51单片机(如8051系列)的汇编指令:
1. 数据传送指令:
- MOV:将一个数据或寄存器的值移动到另一个寄存器或存储器位置。

- MOVC:将数据从外部代码存储器复制到累加器或寄存器。

2. 算术运算指令:
- ADD:将累加器与另一个寄存器或存储器中的值相加。

- SUB:从累加器中减去另一个寄存器或存储器中的值。

- INC:将累加器或寄存器的值加1。

- DEC:将累加器或寄存器的值减1。

3. 逻辑运算指令:
- ANL:对累加器和另一个寄存器或存储器中的值进行逻辑与操作。

- ORL:对累加器和另一个寄存器或存储器中的值进行逻辑或操作。

- XRL:对累加器和另一个寄存器或存储器中的值进行逻辑异或操作。

- CPL:对累加器或寄存器中的值进行按位取反操作。

4. 条件分支指令:
- CJNE:比较两个值,并在不相等时跳转到指定的地址。

- DJNZ:递减累加器或寄存器,并在结果不为零时跳转到指定的地址。

5. 跳转指令:
- JMP:无条件跳转到指定的地址。

- SJMP:短跳转,跳转到相对于当前地址的指定偏移量。

- AJMP:绝对跳转,跳转到指定的地址。

- LCALL:长调用,将当前地址入栈并跳转到指定的子程序地址。

6. 位操作指令:
- SETB:将某个位设置为1。

- CLR:将某个位清零。

- JB:如果某个位为1,则跳转到指定地址。

- JNB:如果某个位为0,则跳转到指定地址。

MSC-51指令大全以及规则

MSC-51指令大全以及规则

MOV A,RnMOV A,direct //直接寻址MOV A,@Ri //间接寻址MOV A,#data //立即寻址下面我们通过一些例子加以说明:MOV A,R1 ;将工作寄存器R1中的值送入A,R1中的值保持不变。

MOV A,30H ;将内存30H单元中的值送入A,30H单元中的值保持不变。

MOV A,@R1 ;先看R1中是什么值,把这个值作为地址,并将这个地址单元中的值送入A中。

如执行命令前R1中的值为20H,则是将20H单元中的值送入A中。

MOV A,#34H ;将立即数34H送入A中,执行完本条指令后,A中的值是34H。

以寄存器Rn为目的操作的指令MOV Rn,AMOV Rn,directMOV Rn,#data这组指令功能是把源地址单元中的内容送入工作寄存器,源操作数不变。

以直接地址为目的操作数的指令MOV direct,A 例: MOV 20H,AMOV direct,Rn MOV 20H,R1MOV direct1,direct2 MOV 20H,30HMOV direct,@Ri MOV 20H,@R1MOV direct,#data MOV 20H,#34H以间接地址为目的操作数的指令MOV @Ri,A 例:MOV @R0,AMOV @Ri,direct MOV @R1,20HMOV @Ri,#data MOV @R0,#34H十六位数的传递指令MOV DPTR,#data168051是一种8位机,这是唯一的一条16位立即数传递指令,其功能是将一个16位的立即数送入DPTR中去。

其中高8位送入 DPH(083H),低8位送入DPL(082H)。

例:MOV DPTR,#1234H,则执行完了之后DPH中的值为12H,DPL中的值为34H。

反之,如果我们分别向DPH,DPL送数,则结果也一样。

如有下面两条指令:MOV DPH,#35H,MOV DPL,#12H。

则就相当于执行了MOV DPTR,#3512H。

51单片机汇编中断程序调用子程序

51单片机汇编中断程序调用子程序

51单片机汇编中断程序调用子程序(原创实用版)目录1.51 单片机汇编中断程序概述2.中断程序的调用方式3.子程序的定义与调用4.中断程序调用子程序的实例分析5.总结正文一、51 单片机汇编中断程序概述在 51 单片机汇编语言编程中,中断是一种常见的编程方式,可以实现在特定条件下程序的跳转和执行。

通过中断程序,可以实现对硬件设备的实时控制,提高程序的执行效率。

二、中断程序的调用方式中断程序的调用方式主要有两种:1.通过外部中断引脚(如 P1.0、P2.0 等)触发中断。

这种方式下,当外部中断引脚的状态发生改变时,单片机会立即跳转到中断程序的入口地址执行。

2.通过软件中断实现中断程序的调用。

这种方式下,程序员可以通过设置特定的寄存器值来触发中断,使程序跳转到中断程序的入口地址执行。

三、子程序的定义与调用子程序,也称为子例程,是程序中一段可独立执行的代码段。

子程序可以通过以下方式定义和调用:1.使用“SUB”伪指令定义子程序。

在需要调用子程序的地方,编写“CALL 子程序名”,即可实现子程序的调用。

2.使用“PROG”伪指令定义子程序。

在需要调用子程序的地方,直接编写子程序名,即可实现子程序的调用。

四、中断程序调用子程序的实例分析假设我们有一个 51 单片机汇编语言程序,当外部中断引脚 P1.0 触发时,需要执行一个子程序以完成特定功能。

程序如下:```ORG 00HMOV P1, #00HMOV R4, #0FFHSTART: NOPINT0: MOV R3, #0FFHCALL INT_SUBROUTINESJMP STARTINT_SUBROUTINE: MOV R5, R3// 子程序执行的内容MOV R3, R5SJMP RETURNRETURN: MOV R4, R3SJMP RETURN_SUBROUTINERETURN_SUBROUTINE: MOV R3, #00HSJMP START```在上述程序中,当 P1.0 引脚触发中断时,程序会跳转到“INT0”标签所在的位置,执行子程序“INT_SUBROUTINE”。

5212SINUMERIK 802Dsl_PLC子程序库说明

5212SINUMERIK 802Dsl_PLC子程序库说明

3.2
子程序 33 – EMG_STOP ( 急停处理 ) ................................................................................. 15
3.3
子程序 34 - MCP_802D (802D sl MCP 信号传递 ) ................................................................ 18
3.22 子程序 63 - TOGGLE........................................................................................................... 45
4 PLC 用户报警在子程序库中的使用..................................................................................................... 47
3.8
子程序 40 - AXES_CTL ( 主轴和进给轴控制)....................................................................... 27
3.9
子程序 41 - PLC_AXIS......................................................................................................... 30
5 PLC 实例应用程序.............................................................................................................................. 49
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

(1) 标号: BCDA功能:多字节BCD码加法
入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
出口信息:和在[R0]中,最高位进位在CY中。
影响资源:PSW、A、R2 堆栈需求: 2字节
BCDA: MOV A,R7 ;取字节数至R2中
MOV R2,A
ADD A,R0 ;初始化数据指针
XCHD A,@R0 ;换出本字节的十进制高位
MOV R3,A ;保存本字节的十进制高位
DJNZ R2,BRL1 ;处理完所有字节
RET
(5) 标号: MULD功能:双字节二进制无符号数乘法
入口条件:被乘数在R2、R3中,乘数在R6、R7中。
出口信息:乘积在R2、R3、R4、R5中。
PUSH PSW ;保存结果的符号
LCALL DIVD ;计算两个绝对值的商
JNB OV,DVS1 ;溢出否?
POP ACC ;溢出,放去结果的符号,保留溢出标志
RET
DVS1: POP PSW ;未溢出,取出结果的符号
MOV R4,#0
MOV R5,#0
MDSE: JB F0,MDS2 ;用补码表示结果
据。地址小的单元存放数据的高字节。例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,
(31H)=34H,(32H)=56H。
2.运算精度:单次定点运算精度为结果最低位的当量值。
3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无
关的或非消耗性的信息,程序就具有较好的透明性。
BRLN: MOV A,R7 ;取字节数至R2中
MOV R2,A
ADD A,R0 ;初始化数据指针
MOV R0,A
MOV R3,#0 ;工作单元初始化
BRL1: DEC R0 ;调整数据指针
MOV A,@R0 ;取一字节
SWAP A ;交换十进制高低位
MOV @R0,A ;存回
MOV A,R3 ;取低字节移出的十进制高位
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
MULD: MOV A,R3 ;计算R3乘R7
MOV B,R7
MUL AB
MOV R4,B ;暂存部分积
MOV R5,A
MOV A,R3 ;计算R3乘R6
MOV B,R6
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
RET
(2) 标号: BCDB功能:多字节BCD码减法
入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。
出口信息:差在[R0]中,最高位借位在CY中。
影响资源:PSW、A、R2、R3 堆栈需求: 6字节
BCDB: LCALL NEG1 ;减数[R1]十进制取补
LCALL BCDA ;按多字节BCD码加法处理
出口信息:乘积在R2、R3、R4、R5中。
影响资源:PSW、A、B、R2~R7 堆栈需求: 4字节
MULS: MOV R4,#0 ;清零R4R5
MOV R5,#0
LCALL MDS ;计算结果的符号和两个操作数的绝对值
LCALL MULD ;计算两个绝对值的乘积
SJMP MDSE ;用补码表示结果
XCH A,R7
CPL A
ADDC A,#0
MOV R6,A
MDS1: MOV A,R2 ;判断第一操作数或运算结果的符号
JNB ACC.7,MDS3;为正,不必处理
CPL F0 ;为负,结果符号取反
MDS2: MOV A,R5 ;求第一操作数的绝对值或运算结果的补码
CPL A
ADD A,#1
影响资源:PSW、A、B、R2~R7 堆栈需求: 2字节
DV31: CLR C
MOV A,R3
SUBB A,R7
JC DV30
SETB OV ;商溢出
RET
DV30: MOV R2,#10H ;求R3R4R5/R7-→R4R5
DM23: CLR C
MOV A,R5
RLC A
MOV R5,A
RLC A
XCH A,R2
MOV F0,C ;保存溢出位
CLR C
SUBB A,R7 ;计算(R2R3-R6R7)
MOV R1,A
MOV A,R2
SUBB A,R6
ANL C,/F0 ;结果判断
JC DVD3
MOV R2,A ;够减,存放新的余数
MOV A,R1
MOV R3,A
入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
出口信息:OV=0 时,双字节商在R2、R3中,OV=1 时溢出。
影响资源:PSW、A、B、R1~R7 堆栈需求: 2字节
DIVD: CLR C ;比较被除数和除数
MOV A,R3
SUBB A,R7
MOV A,R2
SUBB A,R6
MOV A,R0
XCH A,R1 ;换回指针
XCH A,R0
RET
(3) 标号: NEG功能:多字节BCD码取补
入口条件:字节数在R7中,操作数在[R0]中。
出口信息:结果仍在[R0]中。
影响资源:PSW、A、R2、R3 堆栈需求: 2字节
NEG: MOV A,R7 ;取(字节数减一)至R2中
MOV R5,A
MOV A,R4
CPL A
ADDC A,#0
MOV R4,A
MOV A,R4 ;四舍五入
ADD A,R4
JC DV53
SUBB A,R7
JC DV54
DV53: INC R3
DV54: CLR OV
RET
(9) 标号: DV31功能:三字节二进制无符号数除以单字节二进制数
入口条件:被除数在R3、R4、R5中,除数在R7中。
出口信息:OV=0 时,双字节商在R4、R5中,OV=1 时溢出。
JC DVD1
SETB OV ;溢出
RET
DVD1: MOV B,#10H ;计算双字节商
DVD2: CLR C ;部分商和余数同时左移一位
MOV A,R5
RLC A
MOV R5,A
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
XCH A,R2
DEC A
MOV R2,A
MOV A,R0 ;保护指针
MOV R3,A
NEG0: CLR C
MOV A,#99H
SUBB A,@R0 ;按字节十进制取补
MOV @R0,A ;存回[R0]中
INC R0 ;调整数据指针
DJNZ R2,NEG0 ;处理完(R2)字节
MOV A,#9AH ;最低字节单独取补
CLR A
ADDC A,B
MOV R3,A
MOV A,R2 ;计算R2乘R7
MOV B,R7
MUL AB
ADD A,R4 ;累加部分积
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
RLC A
XCH A,R2 ;计算R2乘R6
MOV B,R6
MUL AB
CLR C
RLC A
XCH A,B
RLC A
JNC MU20
INC R2 ;累加溢出量
MU20: XCH A,B ;累加部分积
ADD A,R4
MOV R4,A
MOV A,R3
ADDC A,B
MOV R3,A
CLR A
ADDC A,R2
MOV R2,A
RET
(7) 标号: DIVD功能:双字节二进制无符号数除法
CPL C ;将补码加法的进位标志转换成借位标志
MOV F0,C ;保护借位标志
LCALL NEG1 ;恢复减数[R1]的原始值
MOV C,F0 ;恢复借位标志
RET
NEG1: MOV A,R0 ;[R1]十进制取补子程序入口
XCH A,R1 ;交换指针
XCH A,R0
LCALL NEG ;通过[R0]实现[R1]取补
(11) 标号: DIVS功能:双字节二进制有符号数除法(补码)
入口条件:被除数在R2、R3、R4、R5中,除数在R6、R7中。
出口信息:OV=0时商在R2、R3中,OV=1时溢出。
影响资源:PSW、A、B、R1~R7 堆栈需求: 5字节
DIVS: LCALL MDS ;计算结果的符号和两个操作数的绝对值
INC R5 ;商的低位置一
DVD3: DJNZ B,DVD2 ;计算完十六位商(R4R5)
MOV A,R4 ;将商移到R2R3中
MOV R2,A
MOV A,R5
MOV R3,A
CLR OV ;设立成功标志
RET
(8) 标号: D457功能:双字节二进制无符号数除以单字节二进制数
MOV A,R4
RLC A
MOV R4,A
MOV A,R3
RLC A
MOV R3,A
MOV F0,C
CLR C
SUBB A,R7
ANL C,/F0
相关文档
最新文档