51单片机浮点运算子程序库
分享简洁51单片机常用子程序2
//uchar seg[10]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};//七段uchar seg[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90};//七段小数点不亮/************* 音乐数据表 *****************/unsigned char n=0; //n为节拍常数变量unsigned char code music_tab[] ={0x18, 0x30, 0x1C , 0x10, //格式为: 频率常数, 节拍常数, 频率常数, 节拍常数,0x20, 0x40, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x10,0x1C, 0x10, 0x18 , 0x40,0x1C, 0x20, 0x20 , 0x20,0x1C, 0x20, 0x18 , 0x20,0x20, 0x80, 0xFF , 0x20,0x30, 0x1C, 0x10 , 0x18,0x20, 0x15, 0x20 , 0x1C,0x20, 0x20, 0x20 , 0x26,0x40, 0x20, 0x20 , 0x2B,0x20, 0x26, 0x20 , 0x20,0x20, 0x30, 0x80 , 0xFF,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x20, 0x1C , 0x10,0x18, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x80,0x20, 0x30, 0x1C , 0x10,0x20, 0x10, 0x1C , 0x10,0x20, 0x20, 0x26 , 0x20,0x2B, 0x20, 0x30 , 0x20,0x2B, 0x40, 0x20 , 0x15,0x1F, 0x05, 0x20 , 0x10,0x1C, 0x10, 0x20 , 0x20,0x26, 0x20, 0x2B , 0x20,0x30, 0x20, 0x2B , 0x40,0x20, 0x30, 0x1C , 0x10,0x18, 0x20, 0x15 , 0x20,0x1C, 0x20, 0x20 , 0x20,0x26, 0x40, 0x20 , 0x20,0x2B, 0x20, 0x26 , 0x20,0x20, 0x20, 0x30 , 0x30,0x20, 0x30, 0x1C , 0x10,0x18, 0x40, 0x1C , 0x20,0x20, 0x20, 0x26 , 0x40,0x13, 0x60, 0x18 , 0x20,0x15, 0x40, 0x13 , 0x40,0x18, 0x80, 0x00};uchar h[4];uint i;uchar ADCRS;uchar Rchar;uchar X=0;float hres;void delayms(int t)//51单片机常用延时子程序毫秒级延时{int i; //声明变量i--内循环变量int j; //声明变量j--外循环变量for(j=0;j<t;j++){for (i=0;i<150;i++);//循环加法计算,消耗CPU时间,达到延时的目的}}uchar ADC(void) //adc 子程序,本程序针对常用并行8位AD芯片ADC0804 {uchar ADCRes; //声明一个uchar(无符号单字节变量,用于保存AD转换结果) P0=0xFF;//拉高P0数据总线,为读做准备(51单片机中,读取IO端口时,必须先拉高对应端口)WR=0;//把ADC0804的WR脚拉低DAC_WR=1;delayms(1);}}void int0() interrupt 1 //采用中断0 控制节拍{ TH0=0xd8;TL0=0xef;n--;}void delay (unsigned char m) //控制频率延时{unsigned i=3*m;while(--i);}void jkc_Flash_LED(void) //接于P0口的8个LED闪烁例程{P2=0XFF; //P2口高电平,关掉数码管while(1){P0=0X00;//P0端口拉低,灯亮delayms(200);P0=0XFF;//P0端口拉高,灯灭delayms(200);}void jkc_Horse_LED(void) //跑马灯例程{unsigned char temp;P2=0XFF; //P2口高电平,关掉数码管temp=0x01;P0=~temp; //temp 按位取反后赋给P0,直接输出temp(0x01),最低位是1高电平,灯不亮,低电平才亮,所以要反转位delayms(100);while(1){P0=~temp;temp<<=1;//temp向左移动一位,即里面的1向左移动一位。
MCS-51单片机实用子程序库6
MCS-51单片机实用子程序库(六)(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,#80H SJMP SQR3SQR1: MOV B,#0B2H MOV R4,#0A0H SJMP 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 CMOV 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,R4XCH A,R2RRC AMOV F0,CMOV A,R3MOV 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结束。
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。
MCS—51四字节浮点库及其使用说明
MCS—51四字节浮点库及其使用说明
李杰
【期刊名称】《单片机与嵌入式系统应用》
【年(卷),期】2002(000)012
【摘要】此浮点库包含16个子程序(数值转换、四则运算、浮点数处理等),不含函数库;占RAM(A,B,R0~R7,08H~0FH,23H);大小:1.6 KB;可任意浮动.
【总页数】2页(P77-78)
【作者】李杰
【作者单位】湖南长沙新开铺育新学校
【正文语种】中文
【中图分类】TP368.1
【相关文献】
1.MCS—51单片机实现的快速浮点多字节BCD乘除运算 [J], 陈宇;毕淑艳
2.AVR-90三字节浮点库及其使用说明 [J], 李杰
3.AVR—90三字节浮点库及其使用说明 [J], 李杰
4.MCS-96/196三字节浮点库 [J], 李杰
5.MCS—96/196三字节浮点库 [J], 李杰
因版权原因,仅展示原文概要,查看原文内容请购买。
51定点运算子程序库及其使用说明
(一)51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
地址小的单元存放数据的高字节。
例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。
2.运算精度:单次定点运算精度为结果最低位的当量值。
3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。
(二)(1)标号:BCDA功能:多字节BCD码加法入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
出口信息:和在[R0]中,最高位进位在CY中。
影响资源:PSW、A、R2 堆栈需求:2字节BCDA: MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV A,R2ADD A,R1MOV R1,ACLR CBCD1: DEC R0 ;调整数据指针DEC R1MOV A,@R0ADDC A,@R1 ;按字节相加DA A ;十进制调整MOV @R0,A ;和存回[R0]中DJNZ R2,BCD1 ;处理完所有字节RET(2)标号:BCDB功能:多字节BCD码减法入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。
出口信息:差在[R0]中,最高位借位在CY中。
影响资源:PSW、A、R2、R3 堆栈需求:6字节BCDB: LCALL NEG1 ;减数[R1]十进制取补LCALL BCDA ;按多字节BCD码加法处理CPL C ;将补码加法的进位标志转换成借位标志MOV F0,C ;保护借位标志LCALL NEG1 ;恢复减数[R1]的原始值MOV C,F0 ;恢复借位标志RETNEG1: MOV A,R0 ;[R1]十进制取补子程序入口XCH A,R1 ;交换指针XCH A,R0LCALL NEG ;通过[R0]实现[R1]取补MOV A,R0XCH A,R1 ;换回指针XCH A,R0RET(3)标号:NEG功能:多字节BCD码取补入口条件:字节数在R7中,操作数在[R0]中。
STC51单片机开发板计算器LCD1602显示浮点计算设计报告
嵌入式系统原理及应用课程设计报告姓名:学号:指导老师:目录引言 (3)第一章硬件介绍 (4)1.1单片机介绍 (4)1.2 设计所用开发板的介绍 (5)1.3 LCD1602的原理及其应用 (7)1.3.1开发板硬件连接关系 (7)1.3.2液晶屏LCD1602的功能及应用 (8)1.3.31602LCD的指令说明及时序 (9)1.3.4 1602LCD的RAM地址映射及标准字库表 (11)1.4开发板矩阵键盘原理及应用 (12)第二章设计思路、仿真及调试 (15)2.1 设计方法 (15)2.2 硬件简介 (15)2.3 软件设计 (15)2.3.1 矩阵键盘 (15)2.3.2 LCD1602 (22)第三章设计结果 (24)第四章设计总结 (27)附录 (28)引言目前单片机渗透到我们生活的各个领域.几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置.飞机上各种仪表的控制.计算机的网络通讯与数据传输.工业自动化过程的实时控制和数据处理.广泛使用的各种智能IC卡.民用豪华轿车的安全保障系统.录像机、摄像机、全自动洗衣机的控制.以及程控玩具、电子宠物等等.这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
因此.单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域.大致可分如下几个范畴:(1)在智能仪器仪表上的应用(2)在工业控制中的应用(3)在家用电器中的应用(4)在计算机网络和通信领域中的应用(5)单片机在医用设备领域中的应用(6)在各种大型电器中的模块化应用(7)单片机在汽车设备领域中的应用此外.单片机在工商.金融.科研、教育.国防航空航天等领域都有着十分广泛的用途。
随着智能化的逐步提高.单片机在我们生活中得到了越来越广泛的应用.其是一种集成在电路芯片.是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
MCS-51单片机实用子程序库(doc 62页)
MCS-51单片机实用子程序库(doc 62页)《MCS-51单片机实用子程序库(96年版)》周航慈目前已有若干版本的子程序库公开发表,它们各有特色。
笔者在1988年也编制了两个子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方面作了一些工作。
本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
经过八年来全国广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错误,成为现在这个最新版本。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前流行的以IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮(一)MCS-51定点运算子程序库及其使用说明定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
地址小的单元存放数据的高字节。
例如:[R0]=123456H,若(R0)=30H,则(30H)=12H,(31H)=34H,(32H)=56H。
2.运算精度:单次定点运算精度为结果最低位的当量值。
3.工作区:数据工作区固定在PSW、A、B、R2~R7,用户只要不在工作区中存放无关的或非消耗性的信息,程序就具有较好的透明性。
(1)标号:BCDA功能:多字节BCD码加法入口条件:字节数在R7中,被加数在[R0]中,加数在[R1]中。
出口信息:和在[R0]中,最高位进位在CY中。
影响资源:PSW、A、R2 堆栈需求:2字节BCDA: MOV A,R7 ;取字节数至R2中MOV R2,AADD A,R0 ;初始化数据指针MOV R0,AMOV A,R2ADD A,R1MOV R1,ACLR CBCD1: DEC R0 ;调整数据指针DEC R1MOV A,@R0ADDC A,@R1 ;按字节相加DA A ;十进制调整MOV @R0,A ;和存回[R0]中DJNZ R2,BCD1 ;处理完所有字节RET(2)标号:BCDB功能:多字节BCD码减法入口条件:字节数在R7中,被减数在[R0]中,减数在[R1]中。
C51如何进行浮点运算并分离小数部分显示
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
0x88, //"A"
0x83, //"B"
0xC6, //"C"
0xA1, //"D"
P1M1=0;
P1M0=0xff;//将P3口设为强上拉
while (1)
{
sprintf(led_hu, "%10.2f", df);
q=toint(led_hu[5]);
b=toint(led_hu[6]);
s=toint(led_hu[8]);
g=toint(led_hu[9]);
for (x=0;x<10;x++)
b=toint(led_hu[6]);//个位led_hu[6]=0x32—转换后-- q=2
toint(led_hu[7]);//小数点“0x2e”
s=toint(led_hu[8]);
g=toint(led_hu[9]);
}
完整的程序:
#include <STC12C5A.h>
#include <intrins.h>
#include<CTYPE.H>
#include<stdio.h>
单片机定点运算子程序库
M一、目录(1)标号:BCDA功能:多字节BCD码加法(2)标号:BCDB功能:多字节BCD码减法(3)标号:NEG功能:多字节BCD码取补(4)标号:BRLN功能:多字节BCD码左移十进制一位(乘十)(5)标号:MULD功能:双字节二进制无符号数乘法(6)标号:MUL2功能:双字节二进制无符号数平方(7)标号:DIVD功能:双字节二进制无符号数除法(8)标号:D457功能:双字节二进制无符号数除以单字节二进制数(9)标号:DV31功能:三字节二进制无符号数除以单字节二进制数(10)标号:MULS功能:双字节二进制有符号数乘法(补码)(11)标号:DIVS功能:双字节二进制有符号数除法(补码)(12)标号:SH2功能:双字节二进制无符号数开平方(快速)(13)标号:SH4功能:四字节二进制无符号数开平方(快速)(14)标号:HASC功能:单字节十六进制数转换成双字节ASCII码(15)标号:ASCH功能:ASCII码转换成十六进制数(16)标号:HBCD功能:单字节十六进制整数转换成单字节BCD码整数(17)标号:HB2功能:双字节十六进制整数转换成双字节BCD码整数(18)标号:HBD功能:单字节十六进制小数转换成单字节BCD码小数(19)标号:HBD2功能:双字节十六进制小数转换成双字节BCD码小数(20)标号:BCDH功能:单字节BCD码整数转换成单字节十六进制整数(21)标号:BH2功能:双字节BCD码整数转换成双字节十六进制整数(22)标号:BHD功能:单字节BCD码小数转换成单字节十六进制小数(23)标号:BHD2功能:双字节BCD码小数转换成双字节十六进制小数(24)标号:MM功能:求单字节十六进制无符号数据块的极值(25)标号:MMS功能:求单字节十六进制有符号数据块的极值(26)标号:FDS1功能:顺序查找(ROM)单字节表格(27)标号:FDS2功能:顺序查找(ROM)双字节表格(28)标号:FDD1功能:对分查找(ROM)单字节无符号增序数据表格(29)标号:FDD2功能:对分查找(ROM)双字节无符号增序数据表格(30)标号:DDM1功能:求单字节十六进制无符号数据块的平均值(31)标号:DDM2功能:求双字节十六进制无符号数据块的平均值(32)标号:XR1功能:求单字节数据块的(异或)校验和(33)标号:XR2功能:求双字节数据块的(异或)校验和(34)标号:SORT功能:单字节无符号数据块排序(增序)二、子程序库1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数据。
MCS—51单片机浮点库的开发及其应用
MCS—51单片机浮点库的开发及其应用
毛玉良;颜廷虎
【期刊名称】《机械科学与技术(江苏)》
【年(卷),期】1997(000)005
【摘要】从结构化编程的要求,介绍了MCS-51单片机浮点运算库及其与PL/M-51高级语言的接口的开发、特点及应用。
【总页数】4页(P32-35)
【作者】毛玉良;颜廷虎
【作者单位】东南大学;东南大学
【正文语种】中文
【中图分类】TP311.52
【相关文献】
1.MCS—51单片机实现的快速浮点多字节BCD乘除运算 [J], 陈宇;毕淑艳
2.MCS—51单片机浮点数数制转换 [J], 郭万里;李彬生
3.MCS-96/196三字节浮点库 [J], 李杰
4.MCS—96/196三字节浮点库 [J], 李杰
5.用牛顿迭代法实现MCS51单片机浮点除法运算 [J], 陆庭恕
因版权原因,仅展示原文概要,查看原文内容请购买。
51单片机汇编程序集(二)
辛普生积分程序内部RAM数据排序程序(升序)外部RAM数据排序程序(升序)外部RAM浮点数排序程序(升序)BCD小数转换为二进制小数(2位)BCD小数转换为二进制小数(N位)BCD整数转换为二进制整数(1位)BCD整数转换为二进制整数(2位)BCD整数转换为二进制整数(3位)BCD整数转换为二进制整数(N位)二进制小数(2位)转换为十进制小数(分离BCD码)二进制小数(M位)转换为十进制小数(分离BCD码)二进制整数(2位)转换为十进制整数(分离BCD码)二进制整数(2位)转换为十进制整数(组合BCD码)二进制整数(3位)转换为十进制整数(分离BCD码)二进制整数(3位)转换为十进制整数(组合BCD码)二进制整数(M位)转换为十进制整数(组合BCD码)三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7;辛普生积分程序;入口: DPTR,N,COUNT;占用资源: ACC,R3,R4,R6,R7;堆栈需求: 2字节;出口: R3,R4SJF : MOV R7,NMOVX A,@DPTRINC DPTRMOV R4,AMOV R3,#00HDEC R7SJF1 : MOVX A,@DPTRINC DPTRCLR CRLC AMOV R6,ACLR ARLC AJNB ACC.0,SJF2XCH A,R6RLC AXCH A,R6XCH A,R7RLC AXCH A,R7SJF2 : XCH A,R7XCH A,R6ADD A,R4MOV R4,AMOV A,R6ADDC A,R3MOV R3,ADJNZ R7,SJF1SJF3 : MOVX A,@DPTR ADD A,R4MOV R4,ACLR AADDC A,R3MOV R3,AMOV R7,#COUNT LCALL NMUL21MOV A,NMOV B,#03HMUL ABMOV R7,ALCALL NDIV31RETNMUL21 : MOV A,R4 MOV B,R7MUL ABMOV R4,AMOV A,BXCH A,R3MOV B,R7ADD A,R3MOV R3,ACLR AADDC A,BMOV R2,ACLR OVRETNDIV31 : MOV B,#10H NDV311 : CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV F0,CCLR CSUBB A,R7JB F0,NDV312JC NDV313NDV312 : MOV R2,AINC R4NDV313 : DJNZ B,NDV311 RET;内部RAM数据排序程序(升序) ;入口: R0(起始地址),N(数据个数) ;占用资源: ACC,B,R5,R6,R7;堆栈需求: 2字节;出口: R0ISELSORT : MOV R7,NDEC R7ISST1: MOV A,R7MOV R6,AMOV R1,AMOV R2,AMOV B,@R1ISST2: INC R1MOV A,@R1CLR CSUBB A,BJC ISST3MOV A,R1MOV R2,AMOV B,@R1ISST3: DJNZ R6,ISST2MOV A,BXCH A,@R1MOV B,R2MOV R1,BMOV @R1,ADJNZ R7,ISST1RET;外部RAM数据排序程序(升序);入口: ADDPH,ADDPL(起始地址),N(数据个数) ;占用资源: ACC,B,R0,R1,R5,R7;堆栈需求: 2字节;出口: ADDPH-ADDPLESELSORT : MOV R7,NDEC R7ESST1: MOV A,R7MOV R6,AMOV DPL,ADDPLMOV R1,DPLMOV DPH,ADDPHMOV R0,DPHMOVX A,@DPTRMOV B,AESST2: INC DPTRMOVX A,@DPTRCLR CSUBB A,BJC ESST3MOV R0,DPLMOV R1,DPHMOVX A,@DPTRMOV B,AESST3: DJNZ R6,ESST2MOVX A,@DPTRXCH A,BMOVX @DPTR,AMOV DPL,R0MOV DPH,R1MOV A,BMOVX @DPTR,ADJNZ R7,ESST1RET;外部RAM浮点数排序程序(升序);入口: ADDPH,ADDPL(起始地址),N(数据个数);占用资源: ACC,B,R0,R1,R2,R3,R4,R5,R6,R7,NCNT ;堆栈需求: 5字节;出口: ADDPH,ADDPLFSORT: MOV A,NMOV NCNT,ADEC NCNTFST1 : MOV B,NCNTMOV DPL,ADDPLMOV R1,DPLMOV DPH,ADDPHMOV R0,DPHMOVX A,@DPTRMOV R2,AINC DPTRMOVX A,@DPTRMOV R3,AINC DPTRMOVX A,@DPTRFST2 : INC DPTR MOVX A,@DPTR MOV R5,AINC DPTRMOVX A,@DPTR MOV R6,AINC DPTRMOVX A,@DPTR MOV R7,APUSH BLCALL FCMPPOP BJNC FST4MOV A,DPLCLR CSUBB A,#02HMOV R1,AMOV R0,DPHJNC FST3DEC R0FST3 : MOV A,R5 MOV R2,AMOV A,R6MOV R3,AMOV A,R7MOV R4,AFST4 : DJNZ B,FST2 MOV A,DPLCLR CSUBB A,#02HMOV DPL,AJNC FST5DEC DPHFST5 : MOV A,R2 MOVX @DPTR,A INC DPTRMOVX @DPTR,AINC DPTRMOV A,R4MOVX @DPTR,AMOV A,R0MOV P2,AMOV A,R5MOVX @R1,AINC R1MOV A,R6MOVX @R1,AINC R1MOV A,R7MOVX @R1,ADJNZ NCNT,FST1RET;BCD小数转换为二进制小数(2位) ;入口: R0(低位首址),R7;占用资源: ACC,B,R5;堆栈需求: 2字节;出口: R3,R4PDTB : CLR AMOV R3,AMOV R4,APDB1 : MOV A,R3MOV B,#9AHMUL ABMOV R5,BXCH A,R4MOV B,#19HMUL ABADD A,R4MOV A,R5ADDC A,BMOV R5,AMOV A,@R0MOV B,#9AHMUL ABADD A,R5MOV R4,ACLR AADDC A,BXCH A,R3MOV B,#19HMUL ABADD A,R4MOV R4,AMOV A,BADDC A,R3MOV R3,AMOV A,@R0MOV B,#19HMUL ABADD A,R3MOV R3,ADEC R0DJNZ R7,PDB1RET;BCD小数转换为二进制小数(N位) ;入口: R1(低位首址),M,N;占用资源: ACC,B,R2,R3,R7;堆栈需求: 2字节;出口: R0PDTBMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV B,NCLR APDBMN1 : MOV @R0,AINC R0DJNZ B,PDBMN1MOV A,NRR AMOV R7,APDBMN2 : MOV A,R2MOV R0,AMOV A,R3MOV R1,AMOV B,MCLR CPDBMN3 : MOV A,@R1 ADDC A,@R1DA AJNB ACC.4,PDBMN4SETB CCLR ACC.4PDBMN4 : MOV @R1,AINC R1DJNZ B,PDBMN3MOV B,NPDBMN5 : MOV A,@R0RLC AMOV @R0,AINC R0DJNZ B,PDBMN5DJNZ R7,PDBMN2MOV A,R2MOV R0,ARET;BCD整数转换为二进制整数(1位) ;入口: R0(高位地址),R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R4IDTB1: CLR AMOV R4,AIDB11: MOV A,R4MOV B,#0AHADD A,@R0INC R0MOV R4,ADJNZ R7,IDB11RET;BCD整数转换为二进制整数(2位) ;入口: R0(高位地址),R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R3,R4IDTB2: CLR AMOV R3,AMOV R4,AIDB21: MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,AMOV A,R4ADD A,@R0INC R0MOV R4,ACLR AADDC A,R3MOV R3,ADJNZ R7,IDB21RET;BCD整数转换为二进制整数(3位) ;入口: R0(高位地址),R7;占用资源: ACC,B;堆栈需求: 2字节;出口: R2,R3,R4IDTB3: CLR AMOV R2,AMOV R3,AMOV R4,AIDB31: MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,ACLR AADDC A,BXCH A,R2MOV B,#0AHMUL ABADD A,R2MOV R2,AMOV A,R4ADD A,@R0INC R0MOV R4,ACLR AADDC A,R3MOV R3,ACLR AADDC A,R2MOV R2,ADJNZ R7,IDB31RET;BCD整数转换为二进制整数(N位) ;入口: R1(高位地址),M,N;占用资源: ACC,B,R2,R7,NCNT,F0;出口: R0IDTBMN : MOV A,R0MOV R2,AMOV B,NCLR AIDBMN1 : MOV @R0,AINC R0DJNZ B,IDBMN1MOV A,R2MOV R0,AMOV A,MMOV NCNT,AIDBMN2 : MOV R7,NCLR ACLR F0IDBMN3 : XCH A,@R0MOV B,#0AHMUL ABMOV C,F0ADDC A,@R0MOV F0,CMOV @R0,AINC R0MOV A,BDJNZ R7,IDBMN3MOV A,R2MOV R0,AMOV A,@R1INC R1ADD A,@R0MOV @R0,ADJNZ NCNT,IDBMN2RET;二进制小数(2位)转换为十进制小数(分离BCD码) ;入口: R3,R4,R7;占用资源: ACC,B;出口: R0PBTD : MOV A,R7PUSH APBD1 : MOV A,R4MOV B,#0AHMUL ABMOV R4,AMOV A,BXCH A,R3MOV B,#0AHMUL ABADD A,R3MOV R3,ACLR AADDC A,BMOV @R0,AINC R0DJNZ R7,PBD1POP AMOV R7,AMOV A,R0CLR CSUBB A,R7MOV R0,ARET;二进制小数(M位)转换为十进制小数(分离BCD码) ;入口: R1,M,N;占用资源: ACC,B,R2,R3,R7,NCNT;堆栈需求: 2字节;出口: R0PBTDMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV A,NMOV NCNT,APBDMN1 : MOV R7,MCLR ACLR F0PBDMN2 : XCH A,@R1MOV B,#0AHMUL ABMOV C,F0ADDC A,@R1MOV F0,CMOV @R1,AINC R1MOV A,BDJNZ R7,PBDMN2ADDC A,#00HMOV @R0,AINC R0MOV A,R3MOV R1,ADJNZ NCNT,PBDMN1MOV A,R2MOV R0,ARET;二进制整数(2位)转换为十进制整数(分离BCD码) ;入口: R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD21 : MOV NCNT,#00HMOV R2,#00HIBD211 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINC R0INC NCNTMOV A,R3ORL A,R4JNZ IBD211MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(2位)转换为十进制整数(组合BCD码) ;入口: R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD22 : MOV A,R0PUSH AMOV R7,#03HCLR AIBD221 : MOV @R0,AINC R0DJNZ R7,IBD221POP AMOV R0,AMOV R7,#10HIBD222 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV B,#03HIBD223 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD223POP AMOV R0,ADJNZ R7,IBD222RET;二进制整数(3位)转换为十进制整数(分离BCD码) ;入口: R2,R3,R4;占用资源: ACC,R2,NDIV31;堆栈需求: 5字节;出口: R0,NCNTIBTD31 : CLR AMOV NCNT,AIBD311 : MOV R7,#0AHLCALL NDIV31MOV A,R7MOV @R0,AINC R0INC NCNTMOV A,R2ORL A,R3ORL A,R4JNZ IBD311MOV A,R0CLR CSUBB A,NCNTMOV R0,ARET;二进制整数(3位)转换为十进制整数(组合BCD码) ;入口: R2,R3,R4;占用资源: ACC,B,R7;堆栈需求: 3字节;出口: R0IBTD32 : MOV A,R0PUSH AMOV R7,#04HCLR AIBD321 : MOV @R0,AINC R0DJNZ R7,IBD321MOV R0,AMOV R7,#18HIBD322 : PUSH ACLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV B,#04HIBD323 : MOV A,@R0ADDC A,@R0DA AMOV @R0,AINC R0DJNZ B,IBD323POP AMOV R0,ADJNZ R7,IBD322RET;二进制整数(M位)转换为十进制整数(组合BCD码) ;入口: R1,M,N;占用资源: ACC,B,R2,R3,R7;堆栈需求: 2字节;出口: R0IBTDMN : MOV A,R0MOV R2,AMOV A,R1MOV R3,AMOV B,NCLR AIBDMN1 : MOV @R0,ADJNZ B,IBDMN1MOV A,MSWAP ARR ACLR CMOV R7,AIBDMN2 : MOV A,R2MOV R0,AMOV A,R3MOV R1,AMOV B,MIBDMN3 : MOV A,@R1RLC AMOV @R1,AINC R1DJNZ B,IBDMN3MOV B,NIBDMN4 : MOV A,@R0ADDC A,@R0DA AJNB ACC.4,IBDMN5SETB CCLR ACC.4IBDMN5 : MOV @R0,AINC R0DJNZ B,IBDMN4DJNZ R7,IBDMN2MOV A,R2MOV R0,ARET;三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7 ;入口: R2,R3,R4,R7;占用资源: ACC,B,F0;堆栈需求: 3字节;出口: (R2),R3,R4,R7,OVNDIV31 : MOV A,R2MOV B,R7DIV ABPUSH AMOV R2,BMOV B,#10HNDV311 : CLR CMOV A,R4RLC AMOV R4,AMOV A,R3RLC AMOV R3,AMOV A,R2RLC AMOV R2,AMOV F0,CCLR CSUBB A,R7JB F0,NDV312JC NDV313NDV312 : MOV R2,AINC R4NDV313 : DJNZ B,NDV311 POP ACLR OVJZ NDV314SETB OVNDV314 : XCH A,R2MOV R7,ARET。
双精度浮点数51汇编程序
双精度浮点数51汇编程序概述双精度浮点数(Double Precision Floating-Point Number)是一种用于表示大范围和高精度数值的数据类型。
在51汇编程序中,我们可以使用一系列指令和算法来进行双精度浮点数的计算和操作。
本文将详细介绍双精度浮点数的定义、表示方式以及在51汇编程序中的应用。
双精度浮点数的定义双精度浮点数是一种由符号位、指数位和尾数位组成的数据类型。
在51汇编程序中,双精度浮点数通常使用64位(8字节)的存储空间来表示。
其中,符号位用于表示数值的正负,指数位用于表示数值的位移量,而尾数位则用于表示数值的精度。
双精度浮点数的表示方式在51汇编程序中,双精度浮点数通常使用IEEE 754标准来进行表示。
按照IEEE 754标准,双精度浮点数的表示方式如下:1.符号位(1位):用于表示数值的正负。
0表示正数,1表示负数。
2.指数位(11位):用于表示数值的位移量。
通过对指数位进行偏移和解码,可以得到数值的真实位移量。
3.尾数位(52位):用于表示数值的精度。
尾数位的每一位都代表一个二进制小数位,通过对尾数位进行解码和计算,可以得到数值的真实精度。
双精度浮点数的运算在51汇编程序中,我们可以使用一系列指令和算法来进行双精度浮点数的运算。
以下是一些常见的双精度浮点数运算指令:1.加法指令(ADD):用于将两个双精度浮点数相加,并将结果保存到目标寄存器中。
2.减法指令(SUB):用于将两个双精度浮点数相减,并将结果保存到目标寄存器中。
3.乘法指令(MUL):用于将两个双精度浮点数相乘,并将结果保存到目标寄存器中。
4.除法指令(DIV):用于将两个双精度浮点数相除,并将结果保存到目标寄存器中。
除了基本的运算指令,我们还可以使用一些高级的算法来进行双精度浮点数的运算,例如牛顿迭代法、二分法等。
这些算法可以提高计算的精度和效率。
双精度浮点数的应用双精度浮点数在计算机科学和工程中有广泛的应用。
STC51单片机开发板计算器LCD1602显示浮点计算设计报告
嵌入式系统原理及应用课程设计报告姓名:学号:指导老师:目录引言 (3)第一章硬件介绍 (4)1.1单片机介绍 (4)1.2 设计所用开发板的介绍 (5)1.3 LCD1602的原理及其应用 (7)1.3.1开发板硬件连接关系 (7)1.3.2液晶屏LCD1602的功能及应用 (8)1.3.31602LCD的指令说明及时序 (9)1.3.4 1602LCD的RAM地址映射及标准字库表 (11)1.4开发板矩阵键盘原理及应用 (12)第二章设计思路、仿真及调试 (15)2.1 设计方法 (15)2.2 硬件简介 (15)2.3 软件设计 (15)2.3.1 矩阵键盘 (15)2.3.2 LCD1602 (22)第三章设计结果 (24)第四章设计总结 (27)附录 (28)引言目前单片机渗透到我们生活的各个领域.几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置.飞机上各种仪表的控制.计算机的网络通讯与数据传输.工业自动化过程的实时控制和数据处理.广泛使用的各种智能IC卡.民用豪华轿车的安全保障系统.录像机、摄像机、全自动洗衣机的控制.以及程控玩具、电子宠物等等.这些都离不开单片机。
更不用说自动控制领域的机器人、智能仪表、医疗器械了。
因此.单片机的学习、开发与应用将造就一批计算机应用与智能化控制的科学家、工程师。
单片机广泛应用于仪器仪表、家用电器、医用设备、航空航天、专用设备的智能化管理及过程控制等领域.大致可分如下几个范畴:(1)在智能仪器仪表上的应用(2)在工业控制中的应用(3)在家用电器中的应用(4)在计算机网络和通信领域中的应用(5)单片机在医用设备领域中的应用(6)在各种大型电器中的模块化应用(7)单片机在汽车设备领域中的应用此外.单片机在工商.金融.科研、教育.国防航空航天等领域都有着十分广泛的用途。
随着智能化的逐步提高.单片机在我们生活中得到了越来越广泛的应用.其是一种集成在电路芯片.是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
c51单片机浮点数及其汇编程序设计
c51 单片机浮点数及其汇编程序设计
在单片机应用系统的数据处理过程中,经常会遇到小数的运算问题,如求解BCD 的增量算式、线性化处理等。
因此,需要用二进制数来表示小数。
表示小数的方法一般有两种,定点数和浮点数。
定点数结构简单,与整数的运算过程相同,运算速度快。
但随着所表示数的范围的扩大,其位数成倍增加,给运算和存储带来不便,而且也不能保证相对精度不变。
浮点数的结构相对复杂,但它能够以固定的字节长度保持相对精度不变,用较少的字节表示很大的数的范围,便于存储和运算,在处理的数据范围较大和要求精度较高时,采用浮点数。
浮点数的概念
常用的科学计数法来表示一个十进制数如
l234.75=1.23475E3=1.23475 乘以103
在数据很大或很小时,采用科学计数避免了在有效数字前加0 来确定小数点的位置,突出了数据的有效数字的位数,简化了数据的表示。
可以认为,科学计数法就是十进制数的浮点数表示方法。
在二进制效中,也可以用类似的方法来表示一个数,如
1234.75=10011010010.11(二进制)=0.1001101001011 乘以211。
51单片机函数库
《MCS-51单片机实用子程序库(96年版)》;; 周航慈;;; 目前已有若干版本的子程序库公开发表,它们各有特色。
笔者在1988年也编制了两个;子程序库(定点子程序库和浮点子程序库),并在相容性、透明性、容错性和算法优化方;面作了一些工作。
本程序库中的开平方算法为笔者研究的快速逼近算法,它能达到牛顿迭;代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
经过八年来全国;广大用户的实际使用,反馈了不少信息,陆续扩充了一些新的子程序,纠正了一些隐含错;误,成为现在这个最新版本。
; 本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:; (1)按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定,将原子程序库;的标号和位地址进行了调整,读者不必再进行修改,便可直接使用。
; (2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮;点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
; (3)新增添了若干个浮点子程序(传送、比较、清零、判零等),使编写数据处理;程序的工作变得更简单直观。
; 在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈;需求,各项目的意义请参阅《单片机应用程序设计技术》第六章 6.3.7 节的内容。
程序;清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
; 子程序库的使用方法如下:; 1.将子程序库全部内容链接在应用程序之后,统一编译即可。
优点是简单方便,缺;点是程序太长,大量无关子程序也包含在其中。
; 2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。
有些子程;序需要调用一些低级子程序,这些低级子程序也应该包含在内。
优点是程序紧凑,缺点是;需要对子程序库进行仔细删节。
; (一)MCS-51定点运算子程序库及其使用说明;;; 定点运算子程序库文件名为DQ51.ASM,为便于使用,先将有关约定说明如下:; 1.多字节定点操作数:用[R0]或[R1]来表示存放在由R0或R1指示的连续单元中的数;据。
MCS 51单片机实用子程序库(一)
MCS 51单片机实用子程序库(一)mcs-51单片机实用子程序库(一)目前已有若干版本的子程序库公开发表,它们各有特色。
本程序库中的开平方算法为快速逼近算法,它能达到牛顿迭代法同样的精度,而速度加快二十倍左右,超过双字节定点除法的速度。
本子程序库对《单片机应用程序设计技术》一书附录中的子程序库作了重大修订:(1)按当前盛行的以ibmpc为主机的研发系统对汇编语言的规定,读者不必再展开修正,便可以轻易采用。
(2)对浮点运算子程序库进行了进一步的测试和优化,对十进制浮点数和二进制浮点数的相互转换子程序进行了彻底改写,提高了运算精度和可靠性。
(3)崭新平添了若干个浮点子程序(传输、比较、清零、判零等),并使撰写数据处理程序的工作显得更直观直观。
在使用说明中开列了最主要的几项:标号、入口条件、出口信息、影响资源、堆栈需求,各项目的意义请参阅《单片机应用程序设计技术》第六章6.3.7节的内容。
程序清单中开列了四个栏目:标号、指令、操作数、注释。
为方便读者理解,注释尽力详细。
子程序库的使用方法如下:1.将子程序库全部内容链接在应用程序之后,统一编程即可。
优点就是直观便利,缺点就是程序太短,大量毫无关系子程序也涵盖在其中。
2.仅将子程序库中的有关部分内容链接在应用程序之后,统一编译即可。
有些子程序需要调用一些低级子程序,这些低级子程序也应该包含在内。
优点是程序紧凑,缺点是需要对子程序库进行仔细删节。
(一)mcs-51定点运算子程序库及其使用说明定点运算子程序库文件名为dq51.asm,为易于采用,先将有关签订合同表明如下:1.多字节定点操作数:用[r0]或[r1]去则表示存放在由r0或r1命令的已连续单元中的数据。
地址大的单元存放数据的高字节。
比如:[r0]=123456h,若(r0)=30h,则(30h)=12h,(31h)=34h,(32h)=56h。
2.运算精度:单次定点运算精度为结果最低位的当量值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机浮点运算子程序库时间:2007-11-14 来源: 作者: 点击:4020 字体大小:【大中小】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,1EHMOV 1FH,CEQ1: 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,R6MOV R3,AJNC AS2LJMP RR1 ;有进位,右规一次AS5: CLR C ;比较绝对值大小MOV A,R4SUBB A,R7MOV B,AMOV A,R3JC 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,R3RLC AMOV 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 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,R4JZ MUL6MOV A,R6 ;第二尾数为零否?ORL A,R7JZ MUL5MOV A,R7 ;计算R3R4×R6R7-→R3R4MOV 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,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,ALCALL RL1MUL2: 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字节MOV 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-→R0R1MOV 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 ;将结果存回R3R4 MOV R4,ACLR AADDC A,R0MOV R3,APOP ACC ;恢复R0R1R2 MOV R2,APOP ACCMOV R1,APOP ACCMOV R0,AMOV A,R2 ;计算商的阶码CLR CLCALL 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,@R1DEC 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 R0DEC 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,@R0MOV 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]中。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字节MOV 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指针(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,#0E3H MOV R4,#80H SJMP SQR3SQR1: MOV B,#0B2H MOV R4,#0A0H SJMP 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 A,R3MOV 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,R1XCH A,R0CLR A ;清第一工作区MOV R2,AMOV R3,AMOV R4,APLN1: 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为底求对数RET ;如溢出则停止计算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,ADEC R0MOV 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 R0BTF1: SUBB A,#19JC BTF2MOV A,#3FH ;大于1E19时封顶。MOV C,1DHMOV ACC.7,CMOV @R0,AINC R0MOV @R0,#0FFHINC R0MOV @R0,#0FFHDEC R0DEC 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,#80HBTF4: MOV DPTR,#BTFL;准备查表得到十进制阶码对应的浮点数。MOV A,@R0ADD A,#19 ;计算表格偏移量。MOV B,#3MUL ABADD 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,CCLR ACC.7MOV @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,R4JC FTB2JNZ 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,#10HINC R5FTB6: 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-12DB 5CH,0AFH,0ECH ;1.0000E-11DB 5FH,0DBH,0E7H ;1.0000E-10DB 63H,89H,70H ;1.0000E-9DB 66H,0ABH,0CCH ;1.0000E-8DB 69H,0D6H,0C0H ;1.0000E-7BFLN: DB 6DH,86H,38H ;1.0000E-6DB 70H,0A7H,0C6H ;1.0000E-5DB 73H,0D1H,0B7H ;1.0000E-4DB 77H,83H,12H ;1.0000E-3DB 7AH,0A3H,0D7H ;1.0000E-2DB 7DH,0CCH,0CDH ;1.0000E-1BFL0: 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.0000E12DB 2CH,91H,85H ;1.0000E13DB 2FH,0B5H,0E6H ;1.0000E14DB 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,CMOV @R0,ARET(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,CMOV @R0,ARET(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。