51单片机程序

51单片机程序,第1张

名称:

IO

口高低电平控制

功能:点亮

P1

口的一个

LED

说明:该程序是学习单片机入门的第一个程序

就像我们学习英语时第一个要学字母

A

通过程序了解如何控制端口的高低电平

QQ

1278088276

日期:

2012.8

------------------------------------------------*/

#include<reg52.h>//

头文件,无需改动。时间学久了就会明白它的作用了。

//

就好比我们走路时一定要先穿双鞋。

sbit LED=P1^0

// sbit

是系统默认的一个关键字,

LED

则是自己给

P1^0

端口取的名字

//

这句话的功能就是给

P1^0

取个名字叫

LED

unsigned char i,j

//

定义变量

/*------------------------------------------------

主函数

------------------------------------------------*/

void main (void)

{

while (1)

//

主循环

{

For(i=1000i>0i--)

{

LED=1

//

P1.0

口赋值

1

,对外输出高电平

,

若二极管共阴,则点亮

//

二极管

}

For(i=1000i>0i--)

{

LED=0

//

P1.0

口赋值

0

,对外输出低电平

}

}

}

程序

2

:点亮一个二极管的第二个方法

/*-----------------------------------------------

名称:

IO

口高低电平控制

功能:点亮

P1

口的一个

LED

说明:该程序是学习单片机入门的第一个程序

就像我们学习英语时第一个要学字母

A

通过程序了解如何控制端口的高低电平

QQ

1278088276

日期:

2012.8

------------------------------------------------*/

#include<reg52.h>

/*------------------------------------------------

主函数

------------------------------------------------*/

void main (void)

{

P1 = 0xFF

//P1

口全部为高电平,对应的

LED

灯全灭掉,

//FF

换算成二进制是

1111 1111

P1 = 0xFE

//P1

口的最低位点亮,可以更改数值是其他的灯点亮

//0xfe

16

进制,

0x

开头表示

16

进制数,

//fe

换算成二进制是

1111 1110

while (1)

//

主循环

{

//

主循环中添加其他需要一直工作的程序

}

}

程序

3

:点亮多个二极管

/*-----------------------------------------------

名称:点亮多个二极管

功能:点亮多个二极管

说明:该程序是学习单片机入门的第一个程序

就像我们学习英语时第一个要学字母

A

通过程序了解如何控制端口的高低电平

QQ

1278088276

日期:

2012.8

#include<reg52.h>

sbit LED0=P1^0//

sbit

关键字

定义

LED

P1.0

端口,

sbit LED1=P1^1//LED

是自己任意定义且容易记忆的符号

sbit LED2=P1^2

sbit LED3=P1^3

sbit LED4=P1^4

sbit LED5=P1^5

sbit LED6=P1^6

sbit LED7=P1^7

/*------------------------------------------------

主函数

------------------------------------------------*/

void main (void)

{

LED0=0

//

P1.0

口赋值

0

,对外输出低电平

LED1=1

//

P1.1

口赋值

1

,对外输出低电平

LED2=0

LED3=1

LED4=0

LED5=1

LED6=0

LED7=1

while (1)

//

主循环

{

//

主循环中添加其他需要一直工作的程序

}

}

51单片机的一个简单程序如下:

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

MOV A,P0

ANL A,#1EH

CJNE A,#02H,MAIN1

SETB P1.1

CLR P1.2

CLR P1.8

SJMP MAIN

MAIN1:

CJNE A,#04H,MAIN2

CLR P1.1

SETB P1.2

CLR P1.8

SJMP MAIN

MAIN2:

CJNE A,#1EH,MAIN3

CLR P1.1

CLR P1.2

SETB P1.8

SJMP MAIN

MAIN3:

CLR P1.1

CLR P1.2

CLR P1.8

LJMP MAIN

END

给些子程序吧

好的就加分,其实我也是收藏别人的

嵌入式系统>51单片机浮点运算子程序库

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.4b=0.7577c=56.34d=1.276它们分别存放在30H?33H?36H?39H开始的连续三个单元中?用BCD码浮点数表示时,分别为a=831234Hb=007577Hc=025634Hd=011276H?

求解过程:通过调用BTOF子程序,将各变量转换成二进制浮点 *** 作数,再进行各

种运算,最后调用FTOB子程序,还原成十进制形式,供输出使用?程序如下:

TEST: MOV R0,#39H 指向BCD码浮点 *** 作数d

LCALL BTOF 将其转换成二进制浮点 *** 作数

MOV R0,#36H 指向BCD码浮点 *** 作数c

LCALL BTOF 将其转换成二进制浮点 *** 作数

MOV R0,#33H 指向BCD码浮点 *** 作数b

LCALL BTOF 将其转换成二进制浮点 *** 作数

MOV R0,#30H 指向BCD码浮点 *** 作数a

LCALL BTOF 将其转换成二进制浮点 *** 作数

MOV R1,#33H 指向二进制浮点 *** 作数b

LCALL FMUL 进行浮点乘法运算

MOV R1,#36H 指向二进制浮点 *** 作数c

LCALL FDIV 进行浮点除法运算

MOV R1,#39H 指向二进制浮点 *** 作数d

LCALL FADD 进行浮点加法运算

LCALL FSIN 进行浮点正弦运算

LCALL FABS 进行浮点绝对值运算

LCALL FSQR 进行浮点开平方运算

LCALL FLN 进行浮点对数运算

LCALL FTOB 将结果转换成BCD码浮点数

STOP: LJMP STOP

END

运行结果,[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 A

XRL A,@R1

MOV C,ACC.7

ASN: MOV 1EH,C 将第二 *** 作数的有效符号存入位1EH中

XRL A,@R0 与第一 *** 作数的符号比较

RLC A

MOV F0,C 保存比较结果

LCALL MVR0 将[R0]传送到第一工作区中

LCALL AS1 在工作寄存器中完成代数运算

MOV0: INC R0 将结果传回到[R0]中的子程序入口

INC R0

MOV A,R4 传回尾数的低字节

MOV @R0,A

DEC R0

MOV A,R3 传回尾数的高字节

MOV @R0,A

DEC R0

MOV A,R2 取结果的阶码

MOV C,1FH 取结果的数符

MOV ACC.7,C 拼入阶码中

MOV @R0,A

CLR ACC.7 不考虑数符

CLR OV 清除溢出标志

CJNE A,#3FH,MV01阶码是否上溢?

SETB OV 设立溢出标志

MV01: MOV A,@R0 取出带数符的阶码

RET

MVR0: MOV A,@R0 将[R0]传送到第一工作区中的子程序

MOV C,ACC.7 将数符保存在位1FH中

MOV 1FH,C

MOV C,ACC.6 将阶码扩充为8bit补码

MOV ACC.7,C

MOV R2,A 存放在R2中

INC R0

MOV A,@R0 将尾数高字节存放在R3中

MOV R3,A

INC R0

MOV A,@R0 将尾数低字节存放在R4中

MOV R4,A

DEC R0 恢复数据指针

DEC R0

RET

MVR1: MOV A,@R1 将[R1]传送到第二工作区中的子程序

MOV C,ACC.7 将数符保存在位1EH中

MOV 1EH,C

MOV C,ACC.6 将阶码扩充为8bit补码

MOV ACC.7,C

MOV R5,A 存放在R5中

INC R1

MOV A,@R1 将尾数高字节存放在R6中

MOV R6,A

INC R1

MOV A,@R1 将尾数低字节存放在R7中

MOV R7,A

DEC R1 恢复数据指针

DEC R1

RET

AS1: MOV A,R6 读取第二 *** 作数尾数高字节

ORL A,R7

JZ AS2 第二 *** 作数为零,不必运算

MOV A,R3 读取第一 *** 作数尾数高字节

ORL A,R4

JNZ EQ1

MOV A,R6 第一 *** 作数为零,结果以第二 *** 作数为准

MOV R3,A

MOV A,R7

MOV R4,A

MOV A,R5

MOV R2,A

MOV C,1EH

MOV 1FH,C

AS2: RET

EQ1: MOV A,R2 对阶,比较两个 *** 作数的阶码

XRL A,R5

JZ AS4 阶码相同,对阶结束

JB ACC.7,EQ3阶符互异

MOV A,R2 阶符相同,比较大小

CLR C

SUBB A,R5

JC EQ4

EQ2: CLR C 第二 *** 作数右规一次

MOV A,R6 尾数缩小一半

RRC A

MOV R6,A

MOV A,R7

RRC A

MOV R7,A

INC R5 阶码加一

ORL A,R6 尾数为零否?

JNZ EQ1 尾数不为零,继续对阶

MOV A,R2 尾数为零,提前结束对阶

MOV R5,A

SJMP AS4

EQ3: MOV A,R2 判断第一 *** 作数阶符

JNB ACC.7,EQ2如为正,右规第二 *** 作数

EQ4: CLR C

LCALL RR1 第一 *** 作数右规一次

ORL A,R3 尾数为零否?

JNZ EQ1 不为零,继续对阶

MOV A,R5 尾数为零,提前结束对阶

MOV R2,A

AS4: JB F0,AS5 尾数加减判断

MOV A,R4 尾数相加

ADD A,R7

MOV R4,A

MOV A,R3

ADDC A,R6

MOV R3,A

JNC AS2

LJMP RR1 有进位,右规一次

AS5: CLR C 比较绝对值大小

MOV A,R4

SUBB A,R7

MOV B,A

MOV A,R3

SUBB A,R6

JC AS6

MOV R4,B 第一尾数减第二尾数

MOV R3,A

LJMP RLN 结果规格化

AS6: CPL 1FH 结果的符号与第一 *** 作数相反

CLR C 结果的绝对值为第二尾数减第一尾数

MOV A,R7

SUBB A,R4

MOV R4,A

MOV A,R6

SUBB A,R3

MOV R3,A

RLN: MOV A,R3 浮点数规格化

ORL A,R4 尾数为零否?

JNZ RLN1

MOV R2,#0C1H阶码取最小值

RET

RLN1: MOV A,R3

JB ACC.7,RLN2尾数最高位为一否?

CLR C 不为一,左规一次

LCALL RL1

SJMP RLN 继续判断

RLN2: CLR OV 规格化结束

RET

RL1: MOV A,R4 第一 *** 作数左规一次

RLC A 尾数扩大一倍

MOV R4,A

MOV A,R3

RLC A

MOV R3,A

DEC R2 阶码减一

CJNE R2,#0C0H,RL1E阶码下溢否?

CLR A

MOV R3,A 阶码下溢, *** 作数以零计

MOV R4,A

MOV R2,#0C1H

RL1E: CLR OV

RET

RR1: MOV A,R3 第一 *** 作数右规一次

RRC A 尾数缩小一半

MOV R3,A

MOV A,R4

RRC A

MOV R4,A

INC R2 阶码加一

CLR OV 清溢出标志

CJNE R2,#40H,RR1E阶码上溢否?

MOV R2,#3FH 阶码溢出

SETB OV

RR1E: RET

(4) 标号:FMUL 功能:浮点数乘法

入口条件:被乘数在[R0]中,乘数在[R1]中?

出口信息:OV=0时,积仍在[R0]中,OV=1时,溢出?

影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求:6字节

FMUL: LCALL MVR0 将[R0]传送到第一工作区中

MOV A,@R0

XRL A,@R1 比较两个 *** 作数的符号

RLC A

MOV 1FH,C 保存积的符号

LCALL MUL0 计算积的绝对值

LJMP MOV0 将结果传回到[R0]中

MUL0: LCALL MVR1 将[R1]传送到第二工作区中

MUL1: MOV A,R3 第一尾数为零否?

ORL A,R4

JZ MUL6

MOV A,R6 第二尾数为零否?

ORL A,R7

JZ MUL5

MOV A,R7 计算R3R4×R6R7-→R3R4

MOV B,R4

MUL AB

MOV A,B

XCH A,R7

MOV B,R3

MUL AB

ADD A,R7

MOV R7,A

CLR A

ADDC A,B

XCH A,R4

MOV B,R6

MUL AB

ADD A,R7

MOV R7,A

MOV A,B

ADDC A,R4

MOV R4,A

CLR A

RLC A

XCH A,R3

MOV B,R6

MUL AB

ADD A,R4

MOV R4,A

MOV A,B

ADDC A,R3

MOV R3,A

JB ACC.7,MUL2积为规格化数否?

MOV A,R7 左规一次

RLC A

MOV R7,A

LCALL RL1

MUL2: MOV A,R7

JNB ACC.7,MUL3

INC R4

MOV A,R4

JNZ MUL3

INC R3

MOV A,R3

JNZ MUL3

MOV R3,#80H

INC R2

MUL3: MOV A,R2 求积的阶码

ADD A,R5

MD: MOV R2,A 阶码溢出判断

JB ACC.7,MUL4

JNB ACC.6,MUL6

MOV R2,#3FH 阶码上溢,设立标志

SETB OV

RET

MUL4: JB ACC.6,MUL6

MUL5: CLR A 结果清零(因子为零或阶码下溢)

MOV R3,A

MOV R4,A

MOV R2,#41H

MUL6: CLR OV

RET

(5) 标号: FDIV 功能:浮点数除法

入口条件:被除数在[R0]中,除数在[R1]中?

出口信息:OV=0时,商仍在[R0]中,OV=1时,溢出?

影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 5字节

FDIV: INC R0

MOV A,@R0

INC R0

ORL A,@R0

DEC R0

DEC R0

JNZ DIV1

MOV @R0,#41H被除数为零,不必运算

CLR OV

RET

DIV1: INC R1

MOV A,@R1

INC R1

ORL A,@R1

DEC R1

DEC R1

JNZ DIV2

SETB OV 除数为零,溢出

RET

DIV2: LCALL MVR0 将[R0]传送到第一工作区中

MOV A,@R0

XRL A,@R1 比较两个 *** 作数的符号

RLC A

MOV 1FH,C 保存结果的符号

LCALL MVR1 将[R1]传送到第二工作区中

LCALL DIV3 调用工作区浮点除法

LJMP MOV0 回传结果

DIV3: CLR C 比较尾数的大小

MOV A,R4

SUBB A,R7

MOV A,R3

SUBB A,R6

JC DIV4

LCALL RR1 被除数右规一次

SJMP DIV3

DIV4: CLR A 借用R0R1R2作工作寄存器

XCH A,R0 清零并保护之

PUSH ACC

CLR A

XCH A,R1

PUSH ACC

MOV A,R2

PUSH ACC

MOV B,#10H 除法运算,R3R4/R6R7-→R0R1

DIV5: CLR C

MOV A,R1

RLC A

MOV R1,A

MOV A,R0

RLC A

MOV R0,A

MOV A,R4

RLC A

MOV R4,A

XCH A,R3

RLC A

XCH A,R3

MOV F0,C

CLR C

SUBB A,R7

MOV R2,A

MOV A,R3

SUBB A,R6

ANL C,/F0

JC DIV6

MOV R3,A

MOV A,R2

MOV R4,A

INC R1

DIV6: DJNZ B,DIV5

MOV A,R6 四舍五入

CLR C

RRC A

SUBB A,R3

CLR A

ADDC A,R1 将结果存回R3R4

MOV R4,A

CLR A

ADDC A,R0

MOV R3,A

POP ACC 恢复R0R1R2

MOV R2,A

POP ACC

MOV R1,A

POP ACC

MOV R0,A

MOV A,R2 计算商的阶码

CLR C

SUBB A,R5

LCALL MD 阶码检验

LJMP RLN 规格化

(6) 标号: FCLR 功能:浮点数清零

入口条件: *** 作数在[R0]中?

出口信息: *** 作数被清零?

影响资源:A 堆栈需求: 2字节

FCLR: INC R0

INC R0

CLR A

MOV @R0,A

DEC R0

MOV @R0,A

DEC R0

MOV @R0,#41H

RET

(7) 标号: FZER 功能:浮点数判零

入口条件: *** 作数在[R0]中?

出口信息:若累加器A为零,则 *** 作数[R0]为零,否则不为零?

影响资源:A 堆栈需求: 2字节

FZER: INC R0

INC R0

MOV A,@R0

DEC R0

ORL A,@R0

DEC R0

JNZ ZERO

MOV @R0,#41H

ZERO: RET

(8) 标号: FMOV 功能:浮点数传送

入口条件:源 *** 作数在[R1]中,目标地址为[R0]?

出口信息:[R0]=[R1],[R1]不变?

影响资源:A 堆栈需求: 2字节

FMOV: INC R0

INC R0

INC R1

INC R1

MOV A,@R1

MOV @R0,A

DEC R0

DEC R1

MOV A,@R1

MOV @R0,A

DEC R0

DEC R1

MOV A,@R1

MOV @R0,A

RET

(9) 标号: FPUS 功能:浮点数压栈

入口条件: *** 作数在[R0]中?

出口信息: *** 作数压入栈顶?

影响资源:A?R2?R3 堆栈需求: 5字节

FPUS: POP ACC 将返回地址保存在R2R3中

MOV R2,A

POP ACC

MOV R3,A

MOV A,@R0 将 *** 作数压入堆栈

PUSH ACC

INC R0

MOV A,@R0

PUSH ACC

INC R0

MOV A,@R0

PUSH ACC

DEC R0

DEC R0

MOV A,R3 将返回地址压入堆栈

PUSH ACC

MOV A,R2

PUSH ACC

RET 返回主程序

(10) 标号: FPOP 功能:浮点数出栈

入口条件: *** 作数处于栈顶?

出口信息: *** 作数d至[R0]中?

影响资源:A?R2?R3 堆栈需求: 2字节

FPOP: POP ACC 将返回地址保存在R2R3中

MOV R2,A

POP ACC

MOV R3,A

INC R0

INC R0

POP ACC 将 *** 作数d出堆栈,传送到[R0]中

MOV @R0,A

DEC R0

POP ACC

MOV @R0,A

DEC R0

POP ACC

MOV @R0,A

MOV A,R3 将返回地址压入堆栈

PUSH ACC

MOV A,R2

PUSH ACC

RET 返回主程序

(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,@R1

JNB ACC.7,CMP2

MOV A,@R0 两数异号,以[R0]数符为准

RLC A

MOV A,#0FFH

RET

CMP2: MOV A,@R1 两数同号,准备比较阶码

MOV C,ACC.6

MOV ACC.7,C

MOV B,A

MOV A,@R0

MOV C,ACC.7

MOV F0,C 保存[R0]的数符

MOV C,ACC.6

MOV ACC.7,C

CLR C 比较阶码

SUBB A,B

JZ CMP6

RLC A 取阶码之差的符号

JNB F0,CMP5

CPL C [R0]为负时,结果取反

CMP5: MOV A,#0FFH 两数不相等

RET

CMP6: INC R0 阶码相同时,准备比较尾数

INC R0

INC R1

INC R1

CLR C

MOV A,@R0

SUBB A,@R1

MOV B,A 保存部分差

DEC R0

DEC R1

MOV A,@R0

SUBB A,@R1

DEC R0

DEC R1

ORL A,B 生成是否相等信息

JZ CMP7

JNB F0,CMP7

CPL 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,@R0

INC R0

ORL A,@R0

DEC R0

DEC R0

JNZ SGN

RET 尾数为零,结束

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,R3

ORL A,R4

JNZ INTA

CLR 1FH 尾数为零,阶码也清零,结束取整

MOV R2,#41H

RET

INTA: MOV A,R2

JZ INTB 阶码为零否?

JB ACC.7,INTB阶符为负否?

CLR C

SUBB A,#10H 阶码小于16否?

JC INTD

RET 阶码大于16,已经是整数

INTB: CLR A 绝对值小于一,取整后正数为零,负数为负一

MOV R4,A

MOV C,1FH

RRC A

MOV R3,A

RL A

MOV R2,A

JNZ INTC

MOV R2,#41H

INTC: RET

INTD: CLR F0 舍尾标志初始化

INTE: CLR C

LCALL RR1 右规一次

ORL C,F0 记忆舍尾情况

MOV F0,C

CJNE R2,#10H,INTE阶码达到16(尾数完全为整数)否?

JNB F0,INTF 舍去部分为零否?

JNB 1FH,INTF *** 作数为正数否?

INC R4 对于带小数的负数,向下取整

MOV A,R4

JNZ INTF

INC R3

INTF: LJMP RLN 将结果规格化

(15) 标号: FRCP 功能:浮点倒数函数

入口条件: *** 作数在[R0]中?

出口信息:OV=0时,结果仍在[R0]中,OV=1时,溢出?

影响资源:PSW?A?B?R2~R7?位1EH?1FH 堆栈需求: 5字节

FRCP: MOV A,@R0

MOV C,ACC.7

MOV 1FH,C 保存数符

MOV C,ACC.6 绝对值传送到第二工作区

MOV ACC.7,C

MOV R5,A

INC R0

MOV A,@R0

MOV R6,A

INC R0

MOV A,@R0

MOV R7,A

DEC R0

DEC R0

ORL A,R6

JNZ RCP

SETB OV 零不能求倒数,设立溢出标志

RET

RCP: MOV A,R6

JB ACC.7,RCP2 *** 作数格式化否?

CLR C 格式化之

MOV A,R7

RLC A

MOV R7,A

MOV A,R6

RLC A

MOV R6,A

DEC R5

SJMP RCP

RCP2: MOV R2,#1 将数值1.00传送到第一工作区

MOV R3,#80H

MOV R4,#0

LCALL 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 ACC

MOV R1,A 恢复R1指针

RET

(17) 标号: FSQR 功能:浮点数开平方(快速逼近算法)

入口条件: *** 作数在[R0]中?

出口信息:OV=0时,平方根仍在[R0]中,OV=1时,负数开平方出错?

影响资源:PSW?A?B?R2~R7 堆栈需求: 2字节

FSQR: MOV A,@R0

JNB ACC.7,SQR

SETB OV 负数开平方,出错

RET

SQR: INC R0

INC R0

MOV A,@R0

DEC R0

ORL A,@R0

DEC R0

JNZ SQ

MOV @R0,#41H尾数为零,不必运算

CLR OV

RET

SQ: MOV A,@R0

MOV C,ACC.6 将阶码扩展成8bit补码

MOV ACC.7,C

INC A 加一

CLR C

RRC A 除二

MOV @R0,A 得到平方根的阶码,回存之

INC R0 指向被开方数尾数的高字节

JC SQR0 原被开方数的阶码是奇数吗?

MOV A,@R0 是奇数,尾数右规一次

RRC A

MOV @R0,A

INC R0

MOV A,@R0

RRC A

MOV @R0,A

DEC R0

SQR0: MOV A,@R0

JZ SQR9 尾数为零,不必运算

MOV R2,A 将尾数传送到R2R3中

INC R0

MOV A,@R0

MOV R3,A

MOV A,R2 快速开方,参阅定点子程序说明

ADD A,#57H

JC SQR2

ADD A,#45H

JC SQR1

ADD A,#24H

MOV B,#0E3H

MOV R4,#80H

SJMP SQR3

SQR1: MOV B,#0B2H

MOV R4,#0A0H

SJMP SQR3

SQR2: MOV B,#8DH

MOV R4,#0D0H

SQR3: MUL AB

MOV A,B

ADD A,R4

MOV R4,A

MOV B,A

MUL AB

XCH A,R3

CLR C

SUBB A,R3

MOV R3,A

MOV A,B

XCH A,R2

SUBB A,R2

MOV R2,A

SQR4: SETB C

MOV A,R4

RLC A

MOV R6,A

CLR A

RLC A

MOV R5,A

MOV A,R3

SUBB A,R6

MOV B,A

MOV A,R2

SUBB A,R5

JC SQR5

INC R4

MOV R2,A

MOV R3,B

SJMP SQR4

SQR5: MOV A,R4

XCH A,R2

RRC A

MOV F0,C

MOV A,R3

MOV R5,A

MOV R4,#8

SQR6: CLR C

MOV A,R3

RLC A

MOV R3,A

CLR C

MOV A,R5

SUBB A,R2

JB F0,SQR7

JC SQR8

SQR7: MOV R5,A

INC R3

SQR8: CLR C

MOV A,R5

RLC A

MOV R5,A

MOV F0,C

DJNZ R4,SQR6

MOV A,R3 将平方根的尾数回传到[R0]中

MOV @R0,A

DEC R0

MOV A,R2

MOV @R0,A

SQR9: 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 DPL

XCH A,R0 R0?R1交换角色,自变量在[R1]中

XCH A,R1

XCH A,R0

CLR A 清第一工作区

MOV R2,A

MOV R3,A

MOV R4,A

CLR 1FH

PLN1: CLR A 读取一个系数,并装入第二工作区

MOVC A,@A+DPTR

MOV C,ACC.7

MOV 1EH,C

MOV C,ACC.6

MOV ACC.7,C

MOV R5,A

INC DPTR

CLR A

MOVC A,@A+DPTR

MOV R6,A

INC DPTR

CLR A

MOVC A,@A+DPTR

MOV R7,A

INC DPTR 指向下一个系数

MOV C,1EH 比较两个数符

RRC A

XRL A,23H

RLC A

MOV F0,C 保存比较结果

LCALL AS1 进行代数加法运算

CLR A 读取下一个系数的第一个字节

MOVC A,@A+DPTR

CJNE A,#40H,PLN2是结束标志吗?

XCH A,R0 运算结束,恢复R0?R1原来的角色

XCH A,R1

XCH A,R0

LCALL MOV0 将结果回传到[R0]中

CLR A

INC DPTR

JMP @A+DPTR 返回主程序

PLN2: MOV A,@R1 比较自变量和中间结果的符号

XRL A,23H

RLC A

MOV 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,LOG

RET 如溢出则停止计算

LOG: MOV R5,#0FFH系数0.43430(1/Ln10)

MOV R6,#0DEH

MOV R7,#5CH

LCALL MUL1 通过相乘来换底

LJMP MOV0 传回结果


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/11091101.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存