ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:31.28KB ,
资源ID:22317236      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22317236.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第五篇AVR单片机浮点数运算程序设计Word文件下载.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第五篇AVR单片机浮点数运算程序设计Word文件下载.docx

1、注意:挪用加减乘除子程序前必需将Y寄放器置初值,利用的SRAM五个字节的地址为Y-五、Y-4、Y-3、Y-二、Y-1。且应使这五个字节与堆栈区和SRAM其它工作区不要重复。浮点运算子程序库中包括以下八个子程序:INT2FP16位整数转换成四字节浮点数运算子程LONG2FP32位长整数转换成四字节浮点数运算子程FP2INT四字节浮点数转换成16位整数运算子程FP2LONG四字节浮点数转换成32位长整数运算子程ADD32F四字节浮点加法运算子程SUB32F四字节浮点减法运算子程DIV32F四字节浮点除法运算子程MPY32F四字节浮点乘法运算子程 由于这八个浮点子程序都是常常利用的。所以将这些子程序

2、编写在一块,各有自己的入口,又有一些一路的程序段。如此编写能够节省程序存储单元,浮点程序库总共只占353个字,还不到AT90S8535内部Flash的十分之一,一般不至于影响寄存用户程序。以下简单介绍一下各浮点子程序的程序思想:1定点长整数(或整数)转换成浮点数:若为整数先将其转换成长整数(正数高16位添0,负数高16位添1);掏出符号位及绝对值(正数绝对值不变,负数绝对值取补);将31位绝对值左移至最高位为1,其后23位数即为浮点数尾数(不足23位用0补足);浮点数的阶码为$9d减去左移次数。2浮点数取长整(或取整):先判断阶码是不是小于$7f,若小于$7f则结果为0;再看阶码是不是大于$9

3、d(或$8d),若大于则溢出,正数取$7fffffff(或$7fff),负数取$(或$8000);不然尾数最高位补1,右移24位尾数($96-阶码)次,即可求得尾数绝对值;取补即取得长整数(或整数)。注:($96-阶码)为负时为低位补0次数。3浮点加减法运算:减法可对减数改变符号作加法运算;如一个加数为零或两数的阶码值相差大于尾数长度(24位),则可忽略较小的加数,之和取较大的加数;作加法运算前先对阶,小阶对大阶,较小的数尾数右移阶码之差次;尾数作加法运算;结果再浮点规格化,转化成24位尾数最高位恰好为1,化成规定浮点格式。4浮点乘法运算:不需要对准小数点,只要把阶码相加,再减去$7e;尾数相

4、乘;符号相异或;然后对结果进行必要的规格化。5浮点数除法运算:在执行浮点数除法时,应先调整被除数的阶码,使被除数的尾数小于除数的尾数(使商不大于1),然后把阶码相减,再加上$7e;尾数相除;符号相异或。一般浮点库利用者没必要详细了解浮点子程的编写原理,只要求正确利用这些浮点子程,注意入口、出口、利用的寄放器(必要时这些寄放器应加以保护)和利用的内部SRAM地址(应使这些SRAM不作其他常期保留数据的空间和远离堆栈区)。浮点子程序库()清单:入口: r17:r16; 出口:r19:r18:r17:r16利用的寄放器:r16,r17,r18,r19,r20,r26。 r19:r16 ;出口:r18

5、;r16 + r24:r23:r22:r21;r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29;利用的SRAM:Y-5,Y-4,Y-3,Y-2,Y-1。r16 - r24:r16 / r24:r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29; Y-1。INT2FP: ; 16位整数转换成四字节浮点数运算子程 CLR R18 SBRC R17,7 ; R17:R16为待转换的整数 COM R18 CLR R19 ; 16位整数按数符位扩展成32位长整数 SBRC R

6、18,7 ; 为正,R19,R18清零 COM R19 ; 为负,R19,R18置为$FFFFLONG2FP: ; 32位长整数转换成四字节浮点数运算子程 CLR R20 ; 清符号位R20 AND R19,R19 ; 先判+/- BRPL LONG2FP_1 ; 为正,跳至LONG2FP_1 RCALL QUBU ; 为负,调QUBU子程取补 COM R20 ; 符号位R20取反 LONG2FP_1: MOV R26,R16 ; 再判R19:R18:R17:R16是不是全零 OR R26,R17 OR R26,R18 OR R26,R19 BRNE LONG2FP_2 ; 不为零跳至LONG

7、2FP_2 RJMP JGW0 ; 为零跳至JGW0结果为零LONG2FP_2: LDI R26,$16 ; 令R26 = 22 RJMP LONG2FP_4 LONG2FP_3: INC R26 LSR R19 ROR R18 ROR R17 ROR R16LONG2FP_4: 判高位是不是为零 BRNE LONG2FP_3 ; 不为零,右移一名,阶码加 1 LONG2FP_5: AND R18,R18 ; 判次高位是不是为零 BRNE LONG2FP_7 SUBI R26,$08 ; 为零,阶码减 8 MOV R18,R17 ;数左移 8 位 MOV R17,R16 LDI R16,$00

8、 ; 低位以 $00 填充 RJMP LONG2FP_5 LONG2FP_6: DEC R26 ADD R16,R16 ADC R17,R17 ADC R18,R18LONG2FP_7: BRPL LONG2FP_6 ; R18第7为0,再左移一名 MOV R19,R26 ; 阶码减 1 ,直到R18第7位为1 RJMP GGH FP2INT: 四字节浮点数转换成16位整数运算子程 LDI R26,$0E ; 令R26 = 14 RJMP FP2LONG_1 ; 跳至FP2LONG_1 FP2LONG: 四字节浮点数转换成32位长整数运算子程 LDI R26,$1E ; 令R26 = 30 F

9、P2LONG_1: RCALL FP2LONG_11 ; 调FP2LONG_11子程 BREQ FP2LONG_4 ;相等,即阶码为 0 ,按 0 处置 SUB R26,R19 ;R26(14)-阶码差值 BREQ FP2LONG_2 ;为 0 ,则跳至FP2LONG_2 BRPL FP2LONG_5 ;为正, 则跳至FP2LONG_5无溢出FP2LONG_2:有溢出 AND R20,R20 ;符号为正, BRMI FP2LONG_3 ;符号为负,则跳至FP2LONG_3 LDI R16,$FF LDI R17,$FF LDI R18,$FF LDI R19,$7F RET ;正向溢出,结果置

10、为 $7F FF FF FFFP2LONG_3: LDI R16,$00 LDI R17,$00 LDI R18,$00 LDI R19,$80 负向溢出,结果置为 $80 00 00 00FP2LONG_4: LDI R18,$00 LDI R19,$00 结果为 0 ,置为 $00 00 00 00FP2LONG_5:无溢出 INC R19 ;阶码差值 + 1 BRMI FP2LONG_4 ;为负,即(阶码 $7E)按零处置 LDI R19,$00 ;清R19 R26(14-阶码差值) -8 BRPL FP2LONG_7 ;为正转FP2LONG_7 SUBI R26,$F8 ;不够减则加

11、8 MOV R19,R18 ;左移 8 位 MOV R18,R17 LDI R16,$7F ;低位以 $7F 填充 RJMP FP2LONG_8 ;跳至 FP2LONG_8 FP2LONG_6: MOV R16,R17 ;右移 8 位 MOV R17,R18 LDI R18,$00 ;高位以 $00 填充 SUBI R26,$08 ;R26-8 FP2LONG_7: CPI R26,$08 ;R26值与 8 相较较 BRCC FP2LONG_6 ;有借位,跳至FP2LONG_6 FP2LONG_8:无借位 AND R26,R26 BREQ FP2LONG_10 FP2LONG_9: LSR R

12、19 ;右移一名 ROR R18 ROR R17 ROR R16 DEC R26 ;R26-1,不为 0 跳至FP2LONG_9 BRNE FP2LONG_9 ;直到R26为 0 为止 FP2LONG_10:考虑符号位 SBRC R20,7 RJMP QUBU ;为负,则跳至QUBU取补 返回 为正,返回FP2LONG_11: MOV R20,R19 ; 取浮点数数符存于R20最高位 ANDI R20,$80 ADD R18,R18 ; 将阶码移至R19 ADC R19,R19 SUBI R19,$80 ; 阶码减 $80 存于R19 SEC ROR R18 ; 恢复尾数最高位 1 CPI R

13、19,$80 ; 阶码差值与 $80 相较较 RET ADD32F_1: 存储结果 MOV R20,R25 MOV R19,R24 MOV R18,R23 MOV R17,R22 MOV R16,R21ADD32F_2: RJMP GGH ; 跳至GGH处置结果SUB32F: 四字节浮点减法运算子程 SUBI R24,$80 ; 减数取反,视为浮点加法运算 ADD32F: 四字节浮点加法运算子程 RCALL YCL ; 调YCL子程 CPI R24,$80 ;先判加数是不是为 0 BREQ ADD32F_2 ;为 0 则和为被加数 跳至ADD32F_2再判被加数是不是为 0 BREQ ADD3

14、2F_1 ;为 0 则和为加数 跳至ADD32F_1ADD32F_3: MOV R26,R19 ;转存被加数阶码 SUB R26,R24 ;R26=被加数阶码 减 加数阶码 BRVS ADD32F_2 ;溢出,跳至ADD32F_2 即加数可忽略 BRMI ADD32F_4 ;为负,跳至ADD32F_4 BRNE ADD32F_5 ;不等,跳至ADD32F_5 CP R16,R21 CPC R17,R22 CPC R18,R23 BRCC ADD32F_5 ADD32F_4: RCALL ADD32F_16 ;调ADD32F_16,被加数和加数彼此换 RJMP ADD32F_3 ;跳至ADD32

15、F_3ADD32F_5: CPI R26,$18 ;阶码差值与 24 相较较 BRCS ADD32F_6 ;C=1,跳至ADD32F_6,即 24 加数清 0 CLR R22 CLR R23 ADD32F_6:阶码差值与 8 相较较 BRCS ADD32F_7 ;C=1,跳至ADD32F_7 (直至 8) MOV R21,R22 ;加数尾数右移 8 位 MOV R22,R23 ;高 8 位清 0 阶码差值再减 8 RJMP ADD32F_6 ;跳至ADD32F_6ADD32F_7: AND R26,R26 BREQ ADD32F_9 ;直至R26=0,跳至ADD32F_9 ADD32F_8:

16、LSR R23 ;加数尾数右移 1 位 ROR R22 ROR R21 阶码差值减 1 BRNE ADD32F_8 ;不为 0 跳至ADD32F_8ADD32F_9: MOV R26,R20 ;被加数和加数是不是同号 EOR R26,R25 BRMI ADD32F_10 ;异号,跳至ADD32F_10 RCALL ADD32F_13 ;同号,调ADD32F_13子程尾数相加 BRCC ADD32F_2 ;C=0,无溢出,跳至ADD32F_2 ROR R18 ;C=1,溢出,尾数右移 1 位 SUBI R19,$FF ;阶码加 1 BRVC ADD32F_2 ;无溢出,跳至ADD32F_2,处置

17、结果 RJMP JGZD ;溢出,跳至JGZD ,出结果ADD32F_10: RCALL ADD32F_14 ;调ADD32F_14子程尾数相减 BRNE ADD32F_11 ;不等,跳至ADD32F_11 RJMP JGW0 ;跳至JGW0 ,出结果 ADD32F_11: BRCC ADD32F_12 ;C=0,够减,跳至ADD32F_12 RCALL ADD32F_15 ;C=1,不够减,调ADD32F_15子程取补ADD32F_12: AND R18,R18 ;判R18最高位是不是位 1 BRMI ADD32F_2 ;为 1 ,跳至ADD32F_2,处置结果 ADD R16,R16 ;为

18、 0 ,尾数左移一名 ADC R17,R17 ADC R18,R18 SUBI R19,$01 ;阶码减 1 BRVC ADD32F_12 ;无溢出,跳至ADD32F_12 RJMP JGZD ;溢出,跳至JGZD ,出结果 ADD32F_13:尾数相加 ADD R16,R21 ADC R17,R22 ADC R18,R23 ADD32F_14:尾数相减 SUB R16,R21 SBC R17,R22 SBC R18,R23 ADD32F_15:结果取补 COM R17 NEG R16 SBCI R17,$FF SBCI R18,$FF ADD32F_16:两个数彼此换 ST -Y,R21 S

19、T -Y,R22 ST -Y,R23 ST -Y,R24 ST -Y,R25 MOV R24,R19 MOV R21,R16 MOV R22,R17 MOV R23,R18 MOV R25,R20 LD R20,Y+ LD R19,Y+ LD R18,Y+ LD R17,Y+ LD R16,Y+ RETYCL: MOV R20,R19 LDI R26,$80 ADD R18,R18 ADC R19,R19 ; EOR R19,R26 ; 阶码减 $80 存于R19 ADD R26,R26 ROR R18 ; 恢复尾数最高位 1 ANDI R20,$80 ;取浮点数数符存于R20最高位 MOV

20、R25,R24 LDI R26,$80 ADD R23,R23 ; 将阶码移至R24 ADC R24,R24 EOR R24,R26 ; 阶码减 $80 存于R24 ADD R26,R26 ROR R23 ; ANDI R25,$80 ;取浮点数数符存于R25最高位 CPI R19,$80 GGH: ;规格化 ADD R18,R18 ;隐含尾数最高位为 1 LDI R26,$80 ;考虑符号位 EOR R26,R19 ; ADD R20,R20 ROR R26 ; 右移R26,R18 MOV R19,R26 ;R26移至R19DIV32F_1: ST -Y,R26 ;转存R26 CLR R13

21、 ;清R15:R14:R13 CLR R14 CLR R15 LDI R26,$18 ;令R26=$18(24)DIV32F_2: CP R16,R21 ;被除数(余数)与除数两尾数相较 BRCS DIV32F_3 ;被除数(余数) 除数 SUB R16,R21 ;余数 = 被除数 - 除数 SBC R18,R23 SEC RJMP DIV32F_4 DIV32F_3: CLC ; 清除进位位DIV32F_4: ADC R13,R13 ; 商左移一名,并加上进位位 ADC R14,R14 ADC R15,R15 余数左移一名 DEC R26 ; R26-1 BRNE DIV32F_2 ;循环

22、24 次 MOV R16,R13 ;掏出商 MOV R17,R14 MOV R18,R15 LD R26,Y+ ;恢复R26DIV32F: 四字节浮点除法运算子程 AND R24,R24 BREQ DIV32F_7 ;跳至DIV32F_7,出结果 AND R19,R19 ;判被除数是不是为 0 BREQ JGW0 ;为 0 ,则结果为 0 RCALL YCL ;调YCL子程 跳至JGW0, 结果为 0 EOR R20,R25 ;取商的符号位存于R20 SBC R19,R24 ;掏出商的阶码 BRVS JGZD ;溢出,跳至JGZD LSR R23 ; ROR R22 ;将被除数与除数得尾数 ROR R21 ;右移一名,最高位置 0 LSR R18 RCALL DIV32F_1 ;调DIV32F_1子程,进行运算 AND R18,R18 ;判R18最高位是不是为 0 BRMI DIV32F_5 ;为 1 ADD R16,R16 ;为 0,左移被除数

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1