⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 单片机实用子程序.txt

📁 该程序用来测试89C51与IDE硬盘的接口
💻 TXT
📖 第 1 页 / 共 5 页
字号:

XR1: MOV R4,DPH ;保存数据块的首址
MOV R5,DPL
MOV A,R7 ;双字节计数器调整
JZ XR10
INC R6
XR10: MOV B,#0 ;校验和初始化
XR11: MOVX A,@DPTR ;读取一个数据

XRL B,A ;异或运算
INC DPTR ;指向下一个数据
DJNZ R7,XR11 ;双字节计数器减一
DJNZ R6,XR11
MOV DPH,R4 ;恢复数据首址
MOV DPL,R5
MOV A,B ;取校验和
RET

(33) 标号: XR2 功能:求双字节数据块的(异或)校验和

入口条件:数据块的首址在DPTR中,双字节数据总个数在R6、R7中。
出口信息:校验和在R2、R3中。
影响资源:PSW、A、R2~R7 堆栈需求: 2字节

XR2: MOV R4,DPH ;保存数据块的首址
MOV R5,DPL
MOV A,R7 ;双字节计数器调整

JZ XR20
INC R6
XR20: CLR A ;校验和初始化
MOV R2,A
MOV R3,A
XR21: MOVX A,@DPTR ;读取一个数据的高字节
XRL A,R2 ;异或运算
MOV R2,A
INC DPTR
MOVX A,@DPTR ;读取一个数据的低字节
XRL A,R3 ;异或运算
MOV R3,A
INC DPTR ;指向下一个数据
DJNZ R7,XR21 ;双字节计数器减一
DJNZ R6,XR21
MOV DPH,R4 ;恢复数据首址
MOV DPL,R5
RET

(34) 标号: SORT 功能:单字节无符号数据块排序(增序)

入口条件:数据块的首址在R0中,字节数在R7中。

出口信息:完成排序(增序)
影响资源:PSW、A、R2~R6 堆栈需求: 2字节

SORT: MOV A,R7
MOV R5,A ;比较次数初始化
SRT1: CLR F0 ;交换标志初始化
MOV A,R5 ;取上遍比较次数
DEC A ;本遍比上遍减少一次
MOV R5,A ;保存本遍次数
MOV R2,A ;复制到计数器中
JZ SRT5 ;若为零,排序结束
MOV A,R0 ;保存数据指针
MOV R6,A
SRT2: MOV A,@R0 ;读取一个数据
MOV R3,A
INC R0 ;指向下一个数据
MOV A,@R0 ;再读取一个数据
MOV R4,A

CLR C
SUBB A,R3 ;比较两个数据的大小
JNC SRT4 ;顺序正确(增序或相同),不必交换
SETB F0 ;设立交换标志
MOV A,R3 ;将两个数据交换位置
MOV @R0,A
DEC R0
MOV A,R4
MOV @R0,A
INC R0 ;指向下一个数据
SRT4: DJNZ R2,SRT2 ;完成本遍的比较次数
MOV A,R6 ;恢复数据首址
MOV R0,A
JB F0,SRT1 ;本遍若进行过交换,则需继续排序
SRT5: RET ;排序结束
END 

给ait2002发送email


访问ait2002的主页.

 
 RE: MCS-51单片机实用子程序 - 中山 / drifter 回复于2001-7-5 21:03:00 
正合我用,谢谢! 

给drifter发送email

 
 RE: MCS-51单片机实用子程序 - 杭州 / ait2002 回复于2001-7-5 21:41:00 
hao 

给ait2002发送email


访问ait2002的主页.

 
 RE: MCS-51单片机实用子程序 - 西安 / SHARKS 回复于2001-7-6 15:18:00 
俺还有个浮点库,顺便贴在这里了


给SHARKS发送email

 
 RE: MCS-51单片机实用子程序 - 西安 / SHARKS 回复于2001-7-6 15:21:00 
;单片机实用子程序库年版
;周 航 慈
;目 前已有若干版本的子程序库公开发表它们各有特色笔者在1988 年也
;编制了两个子程序库定点子程序库和浮点子程序库并在相容性透明性
;容错性和算法优化方面作了一些工作本程序库中的开平方算法为笔者研究的快
;速逼近算法它能达到牛顿迭代法同样的精度而速度加快二十倍左右超过双
;字节定点除法的速度经过八年来全国广大用户的实际使用反馈了不少信息
;陆续扩充了一些新的子程序纠正了一些隐含错误成为现在这个最新版本
;本子程序库对单片机应用程序设计技术一书附录中的子程序库作了重大修订
;按当前流行的以 IBM PC 为主机的开发系统对汇编语言的规定将原子程
;序库的标号和位地址进行了调整读者不必再进行修改便可直接使用
;对浮点运算子程序库进行了进一步的测试和优化对十进制浮点数和二进
;制浮点数的相互转换子程序进行了彻底改写提高了运算精度和可靠性
;新增添了若干个浮点子程序传送比较清零判零等使编写数据
;处理程序的工作变得更简单直观
;在使用说明中开列了最主要的几项标号入口条件出口信息影响资源堆
;栈需求各项目的意义请参阅单片机应用程序设计技术第六章 6.3.7 节的
;内容程序清单中开列了四个栏目标号指令操作数注释为方便读者理
;解注释尽力详细
;子程序库的使用方法如下
;将子程序库全部内容链接在应用程序之后统一编译即可优点是简单方便
;缺点是程序太长大量无关子程序也包含在其中
;仅将子程序库中的有关部分内容链接在应用程序之后统一编译即可有些
;子程序需要调用一些低级子程序这些低级子程序也应该包含在内优点是程序
;紧凑缺点是需要对子程序库进行仔细删节
;一 定点运算子程序库及其使用说明
;定点运算子程序库文件名为DQ51.ASM 为便于使用先将有关约定说明如下
;多字节定点操作数用[R0 ]或[R1 ]来表示存放在由R0 或R1 指示的连续单元
;中的数
;据地址小的单元存放数据的高字节例如[R0 ]=123456H 若(R0)=30H 则
;(30H)=12H.(31H)=34H (32H)=56H
;运算精度单次定点运算精度为结果最低位的当量值
;工作区数据工作区固定在PSW A B R2 R7 用户只要不在工作区中存
;放无关的或非消耗性的信息程序就具有较好的透明性


;二 浮 点运算子程序库及其使用说明
;本浮点子程序库有三个不同层次的版本以便适应不同的应用场合
;小型库FQ51A.ASM 只包含浮点加减乘除子程序
;中型库FQ51B.ASM 在小型库的基础上再增加绝对值倒数比较平
;方 开平方数制转换等子程序
;大型库FQ51.ASM 包含本说明书中的全部子程序
;为便于读者使用本程序库先将有关约定说明如下
;双字节定点操作数用[R0 ]或[R1 ]来表示存放在由R0 或R1 指示的连续单元
;中的数
;据地址小的单元存放高字节如果[R0 ]=1234H 若(R0)=30H 则(30H)=12H
;(31H)=34H
;二进制浮点操作数用三个字节表示第一个字节的最高位为数符其余七
;位为
;阶码补码形式第二字节为尾数的高字节第三字节为尾数的低字节尾数
;用双字节
;纯小数原码来表示当尾数的最高位为时便称为规格化浮点数简称操
;作数在
;程序说明中也用[R0 ]或[R1 ]来表示R0 或R1 指示的浮点操作数例如当
;[R0 ]=-6.000 时
;则二进制浮点数表示为83C000H 若(R0)=30H 则
;(30H)=83H,(31H)=0C0H,(32H)=00H
;十进制浮点操作数用三个字节表示第一个字节的最高位为数符其余七
;位为
;阶码二进制补码形式第二字节为尾数的高字节第三字节为尾数的低字节
;尾数用
;双字节码纯小数原码来表示当十进制数的绝对值大于时阶码就
;等于整数
;部分的位数如 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
;运算精度单次定点运算精度为结果最低位的当量值单次二进制浮点算术
;运算
;的精度优于十万分之三单次二进制浮点超越函数运算的精度优于万分之一
;码浮
;点数本身的精度比较低万分之一到千分之一不宜作为运算的操作数仅用
;于输入或
;输出时的数制转换不管那种数据格式随着连续运算的次数增加精度都会下
;降
;工作区数据工作区固定在A B R2 R7 数符或标志工作区固定在PSW
;和23H 单
;元(位1CH 1FH)在浮点系统中R2 R3 R4 和位1FH 为第一工作区R5 R6
;R7 和位1EH
;为第二工作区用户只要不在工作区中存放无关的或非消耗性的信息程序就具
;有较好的
;透明性
;子程序调用范例由于本程序库特别注意了各子程序接口的相容性很容易
;采用
;积木方式或流水线方式完成一个公式的计算以浮点运算为例.计算=
;已知a=-123.4 b=0.7577 c=56.34 d=1.276 它 们分别存放在30H 33H
;;36H 39H 开始的连续三个单元中用码浮点数表示时分别为
;a=831234H
;b=007577H
;c=025634H d=011276H
;求解过程通过调用子程序将各变量转换成二进制浮点操作数再进
;行各
;种运算最后调用子程序还原成十进制形式供输出使用程序如下
TEST:MOV R0,#39H ;指向码浮点操作数
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#36H ;指向码浮点操作数
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#33H ;指向码浮点操作数
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R0,#30H ;指向码浮点操作数
LCALL BTOF ;将其转换成二进制浮点操作数
MOV R1,#33H ;指向二进制浮点操作数
LCALL FMUL ;进行浮点乘法运算
MOV R1,#36H ;指向二进制浮点操作数
LCALL FDIV ;进行浮点除法运算
MOV R1,#39H ;指向二进制浮点操作数
LCALL FADD ;进行浮点加法运算
LCALL FSIN ;进行浮点正弦运算
LCALL FABS ;进行浮点绝对值运算
LCALL FSQR 进行浮点开平方运算
LCALL FLN ;进行浮点对数运算
LCALL FTOB ;将结果转换成码浮点数
STOP:LJMP STOP
LCALL FRCP

;END
;运行结果[R0 ]=804915H 即=-0.4915 比较精确的结果应该是-0.491437
;标 号 功 能浮点数格式化
;入口条件待格式化浮点操作数在[R0 ]中
;出口信息已格式化浮点操作数仍在[R0 ]中
;影响资源PSW A R2 R3 R4 位1FH 堆栈需求 字节
FSDT:LCALL MVR0 ;将待格式化操作数传送到第一工作区中
LCALL RLN ;通过左规完成格式化
LJMP MOV0 ;将已格式化浮点操作数传回到[R0 ]中
;标 号 功 能浮点数加法
;入口条件被加数在[R0 ]中加数在[R1 ]中
;出口信息OV=0 时和仍在[R0 ]中OV=1 时溢出
;影响资源PSW A B R2 R7 位1EH 1FH 堆栈需求 字节
FADD:CLR F0 ;设立加法标志
SJMP AS ;计算代数和
;标 号 功 能浮点数减法
;入口条件被减数在[R0 ]中减数在[R1 ]中
;出口信息OV=0 时差仍在[R0 ]中OV=1 时溢出
;影响资源PSW A B R2 R7 位1EH 1FH 堆栈需求字节
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 ;将阶码扩充为补码
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 ;将阶码扩充为补码
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
;标 号 功 能浮点数乘法
;入口条件被乘数在[R0 ]中乘数在[R1 ]中
;出口信息OV=0 时积仍在[R0 ]中OV=1 时溢出
;影响资源PSW A B R2 R7 位1EH 1FH 堆栈需求字节
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
;标 号 功 能浮点数除法
;入口条件被除数在[R0 ]中除数在[R1 ]中
;出口信息OV=0 时商仍在[R0 ]中OV=1 时溢出
;影响资源PSW A B R2 R7 位1EH 1FH 堆栈需求 字节
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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -