AVR单片机程序设计

上传人:公**** 文档编号:497948536 上传时间:2023-08-06 格式:DOC 页数:15 大小:79.01KB
返回 下载 相关 举报
AVR单片机程序设计_第1页
第1页 / 共15页
AVR单片机程序设计_第2页
第2页 / 共15页
AVR单片机程序设计_第3页
第3页 / 共15页
AVR单片机程序设计_第4页
第4页 / 共15页
AVR单片机程序设计_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《AVR单片机程序设计》由会员分享,可在线阅读,更多相关《AVR单片机程序设计(15页珍藏版)》请在金锄头文库上搜索。

1、浮点数运算程序设计5.1 四字节浮点格式进行数值运算时,采用定点数运算往往不能满足要求。例短整数(8位带符号数)表示数的范围为-128+127;整数(16位带符号数)表示数的范围为-32768+32767;长整数(32位带符号数)表示数的范围为-231(231-1)。每增加或减少1个数字单位恒为1,这样在绝对值很小的时候,表示的数的精度就很低。为了满足数的范围和精度的要求,常采用浮点数的格式。二进制浮点数一般采用M2E的形式表示。其中M为尾数,是定点数(无符号数),为数符,E为指数。若用1位二进制数表示符号位,0为正,1为负;23位 23位 24位二进制数表示尾数 0.10000.1111 8

2、位二进制数表示指数,取-125+128 则表示数的范围就可以扩大为(0.52-1251.02128)即(1.210-383.41038),精度为2-24即5.910-8。我们采用的IEEE提出的四字节浮点数标准,恰好能很好表示这个范围的浮点数,其格式为:数符尾数阶码 31位 30 23 22 0 最高位(第31位)为数符位,0为正,1为负;低23位(022位)为尾数,实际尾数为23位 0.10000.111123位 第2330位这8位为阶码。由于指数取值范围为-125+128,可正可负,为简单起见,阶码采用指数的移码,阶码=指数+$7E。这样阶码恒为正。 阶码为0即浮点数为0(小于1.210-

3、38);阶码为$78,指数为$78-$7E=-6;阶码为$88,指数为$88-$7E=10;阶码为$FF,指数为$ff-$7E=$81超出四字节浮点数的表示范围,表示溢出(即绝对值大于3.4*1038)。为了方便理解该符点数的格式,下面举几个实际例子。例:十进制数1=0.5*21,数符为0;阶码为1+$7E=$7F;尾数0.5=0.1000b,去掉最高位1,000(23位);四字节浮点数为0011 1111 100b 即为$3F 80 00 00例:0.5=0.5*20,数符为0;阶码为$7E;尾数去掉最高位1为00000b(23位); 四字节浮点数为0011 1111 00000b 即为$3

4、F 00 00 00。例:5=101=0.101*23数符为1;阶码为3+$7E=$81;尾数去掉最高位1为01000b(23位);四字节浮点数为 1100 0000 1010 00000b 即为$C0 A0 00 00。5.2 四字节浮点运算子程序库AVR32FP.INC 该浮点运算子程序主要有最基本的数值计算(加、减、乘、除运算)和整数到浮点、浮点到整数的转换。该浮点运算子程序库占353个字。共使用寄存器16个并使用了SRAM五个字节。注意:调用加减乘除子程序前必须将Y寄存器置初值,使用的SRAM五个字节的地址为Y-5、Y-4、Y-3、Y-2、Y-1。且应使这五个字节与堆栈区和SRAM其它

5、工作区不要重复。浮点运算子程序库中包含以下八个子程序:INT2FP16位整数转换成四字节浮点数运算子程LONG2FP32位长整数转换成四字节浮点数运算子程FP2INT四字节浮点数转换成16位整数运算子程FP2LONG四字节浮点数转换成32位长整数运算子程ADD32F四字节浮点加法运算子程SUB32F四字节浮点减法运算子程DIV32F四字节浮点除法运算子程MPY32F四字节浮点乘法运算子程 由于这八个浮点子程序都是常用的。所以将这些子程序编写在一块,各有自己的入口,又有一些共同的程序段。这样编写可以节省程序存储单元,浮点程序库总共只占353个字,还不到AT90S8535内部Flash的十分之一,

6、一般不至于影响存放用户程序。以下简单介绍一下各浮点子程序的程序思想:1定点长整数(或整数)转换成浮点数:若为整数先将其转换成长整数(正数高16位添0,负数高16位添1);取出符号位及绝对值(正数绝对值不变,负数绝对值取补);将31位绝对值左移至最高位为1,其后23位数即为浮点数尾数(不足23位用0补足);浮点数的阶码为$9d减去左移次数。2浮点数取长整(或取整):先判断阶码是否小于$7f,若小于$7f则结果为0;再看阶码是否大于$9d(或$8d),若大于则溢出,正数取$7fffffff(或$7fff),负数取$80000000(或$8000);否则尾数最高位补1,右移24位尾数($96-阶码)

7、次,即可求得尾数绝对值;取补即得到长整数(或整数)。注:($96-阶码)为负时为低位补0次数。3浮点加减法运算:减法可对减数改变符号作加法运算;如一个加数为零或两数的阶码值相差大于尾数长度(24位),则可忽略较小的加数,之和取较大的加数;作加法运算前先对阶,小阶对大阶,较小的数尾数右移阶码之差次;尾数作加法运算;结果再浮点规格化,转化成24位尾数最高位刚好为1,化成规定浮点格式。 4浮点乘法运算:不需要对准小数点,只要把阶码相加,再减去$7e;尾数相乘;符号相异或;然后对结果进行必要的规格化。5浮点数除法运算:在执行浮点数除法时,应先调整被除数的阶码,使被除数的尾数小于除数的尾数(使商不大于1

8、),然后把阶码相减,再加上$7e;尾数相除;符号相异或。 一般浮点库使用者不必详细了解浮点子程的编写原理,只要求正确使用这些浮点子程,注意入口、出口、使用的寄存器(必要时这些寄存器应加以保护)和使用的内部SRAM地址(应使这些SRAM不作其他常期保留数据的空间和远离堆栈区)。浮点子程序库(AVR32FP.INC)清单:INT2FP16位整数转换成四字节浮点数运算子程入口: r17:r16; 出口:r19:r18:r17:r16使用的寄存器:r16,r17,r18,r19,r20,r26。LONG2FP32位长整数转换成四字节浮点数运算子程入口:r19:r18:r17:r16; 出口:r19:r

9、18:r17:r16;使用的寄存器:r16,r17,r18,r19,r20,r26。FP2INT四字节浮点数转换成16位整数运算子程入口: r19:r18:r17:r16 ;出口:r19:r18;使用的寄存器:r16,r17,r18,r19,r20,r26。FP2LONG四字节浮点数转换成32位长整数运算子程入口:r19:r18:r17:r16 ; 出口:r19:r18:r17:r16;使用的寄存器:r16,r17,r18,r19,r20,r26。ADD32F四字节浮点加法运算子程入口:r19:r18:r17:r16 + r24:r23:r22:r21;出口:r19:r18:r17:r16;使

10、用的寄存器:r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29;使用的SRAM:Y-5,Y-4,Y-3,Y-2,Y-1。SUB32F四字节浮点减法运算子程入口:r19:r18:r17:r16 - r24:r23:r22:r21; 出口:r19:r18:r17:r16;使用的寄存器:r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29;使用的SRAM:Y-5,Y-4,Y-3,Y-2,Y-1。DIV32F四字节浮点除法运算子程入口:r19:r18:r17:r16 / r24:r23:r22:r21

11、; 出口:r19:r18:r17:r16;使用的寄存器:r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29;使用的SRAM: Y-1。MPY32F四字节浮点乘法运算子程入口:r19:r18:r17:r16 / r24:r23:r22:r21;出口:r19:r18:r17:r16;使用的寄存器:r13,r14,r15,r16,r17,r18,r19,r20,r21,r22,r23,r24,r25,r26,r28,r29;使用的SRAM: Y-1。INT2FP: ; 16位整数转换成四字节浮点数运算子程 CLR R18 S

12、BRC R17,7 ; R17:R16为待转换的整数 COM R18 CLR R19 ; 16位整数按数符位扩展成32位长整数 SBRC R18,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:R1

13、7:R16是否全零 OR R26,R17 OR R26,R18 OR R26,R19 BRNE LONG2FP_2 ; 不为零跳至LONG2FP_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: AND R19,R19 ; 判高位是否为零 BRNE LONG2FP_3 ; 不为零,右移一位,阶码加 1 LONG2FP_5: AND R18,R18 ; 判次高位是否为零 BRNE LONG2FP_7 SUBI R26,$08 ; 为零,阶码减 8 MOV R18,R17 ;数左

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 综合/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号