打印

最据山寨特色的《中颖快速浮点乘、除法程库》!!!

[复制链接]
楼主: Cortex-M0
手机看帖
扫描二维码
随时随地手机跟帖
21
太好了,帮顶

使用特权

评论回复
22
Cortex-M0|  楼主 | 2011-10-21 16:20 | 只看该作者
最近更新,增加了一些实用小程序,完善库函数。

上传最新库,附带全部源程序~~~


/***************************************************************************************
        Model                : global.h
        Description        : Head file of defining global variable.
        Author                : CLR
        Create Time        : 2011-09-29
        Version ID  : 1.3

        用  途      :中颖SH79/88/89F51系列MCU
        作  者      :许意义
        21ic  ID    :LAOXU
        中颖论坛    : bbs.21ic.com   
****************************************************************************************/
#ifndef                _GLOBAL_H
#define                _GLOBAL_H

#pragma  MODDP2                          // 打开中颖单片机双DPTR功能,加速数据传送
//#pragma  NOMODDP2                  // 关闭中颖单片机双DPTR功能

/*--------------------------------------------------------------------------------------*/
/*                                                Resource - math.asm                                                                                                */
/*--------------------------------------------------------------------------------------*/

extern         uint8        ascii_hex(uint8 value1);                                 //  1位 ASCII        --> 1位 HEX(低半字节)
extern         uint8        hex_ascii(uint8 value1);                                 //  1位 HEX(低半字节)--> 1位 ASCII

extern         uint8        bcd8_hex(uint8 value1);                                     //  8位 BCD --> 8位 HEX
extern        uint16         bcd16_hex(uint16 value1);                             // 16位 BCD -->16位 HEX
extern        uint32         bcd32_hex(uint32 value1);                             // 32位 BCD -->32位 HEX      
extern         uint16        hex8_bcd(uint8 value1);                                     //  8位 HEX -->16位 BCD
extern        uint32         hex16_bcd(uint16 value1);                             // 16位 HEX -->32位 BCD
extern        uint32         hex32_bcd(uint32 value1);                             // 32位 HEX -->32位 BCD      
extern        uint32         bin16_bcd(uint16 value1);                             // 16位 HEX -->32位 BCD(DengMiao'非典'算法)
extern        uint32         bin32_bcd(uint32 value1);                             // 32位 HEX -->32位 BCD(DengMiao'250'算法)      
extern        uint16  mul8(uint8 value1, uint8 value2);        //  8位* 8位-->16位(无符号二进制乘法)
extern  uint32         mul16_8(uint16 value1,uint8 value2);         // 16位* 8位-->32位(无符号二进制乘法)  
extern  uint32         mul16(uint16 value1,uint16 value2);                 // 16位*16位-->32位(无符号二进制乘法)
extern  uint32         mul32_8(uint32 value1,uint8 value2);         // 32位* 8位-->32位(无符号二进制乘法)  
extern  uint32         mul32_16(uint32 value1,uint16 value2);         // 32位*16位-->32位(无符号二进制乘法)  
extern  uint32         mul32(uint32 value1,uint32 value2);             // 32位*32位-->32位(无符号二进制乘法)  
extern        uint8   div8(uint8 value1, uint8 value2);        //  8位/ 8位--> 8位(无符号二进制除法)  
extern        uint16         div16_8(uint16 value1,uint8 value2);          // 16位/ 8位-->16位(无符号二进制除法)
extern  uint16  div16(uint16 value1,uint16 value2);                 // 16位/16位-->16位(无符号二进制除法)
extern  uint32         div32_8(uint32 value1,uint8 value2);         // 32位/ 8位-->32位(无符号二进制除法)
extern  uint32         div32_16(uint32 value1,uint16 value2);         // 32位/16位-->32位(无符号二进制除法)
extern  uint32         div32(uint32 value1,uint32 value2);             // 32位/32位-->32位(无符号二进制除法)
extern        uint8   mod8(uint8 value1, uint8 value2);        //  8位% 8位--> 8位(无符号二进制取余数)
extern        uint8         mod16_8(uint16 value1,uint8 value2);         // 16位% 8位--> 8位(无符号二进制取余数)
extern        uint16         mod16(uint16 value1,uint16 value2);                 // 16位%16位-->16位(无符号二进制取余数)  
extern        uint8          mod32_8(uint32 value1,uint8 value2);          // 32位% 8位--> 8位(无符号二进制取余数)
extern        uint16        mod32_16(uint32 value1,uint16 value2);   // 32位%16位-->16位(无符号二进制取余数)  
extern        uint32        mod32(uint32 value1,uint32 value2);             // 32位%32位-->32位(无符号二进制取余数)   
extern        uint8   div8m(uint8 value1, uint8 value2, uint8 data *p);      //  8位/ 8位--> 8位(无符号二进制除法及取余数,8位余数存*p)
extern        uint16  div16_8m(uint16 value1,uint8 value2,uint8 data *p);           // 16位/ 8位-->16位(无符号二进制除法及取余数,8位余数存*p)
extern        uint16         div16m(uint16 value1,uint16 value2,uint16 data *p);           // 16位/16位-->16位(无符号二进制除法及取余数,16位余数存*p)
extern        uint32         div32_8m(uint32 value1,uint8 value2,uint8 data *p);    // 32位/ 8位--> 8位(无符号二进制除法及取余数,8位余数存*p)
extern        uint32        div32_16m(uint32 value1,uint16 value2,uint16 data *p); // 32位/16位-->16位(无符号二进制除法及取余数,16位余数存*p)
extern        uint32        div32m(uint32 value1,uint32 value2,uint32 data *p);           // 32位/32位-->32位(无符号二进制除法及取余数,32位余数存*p)   

extern        int16  smul8(int8 value1, int8 value2);          //  8位* 8位-->16位(有符号二进制补码乘法)  
extern  int32  smul16_8(int16 value1,int8 value2);             // 16位* 8位-->32位(有符号二进制补码乘法)  
extern  int32  smul16(int16 value1,int16 value2);             // 16位*16位-->32位(有符号二进制补码乘法)
extern  int32  smul32_8(int32 value1,int8 value2);             // 32位* 8位-->32位(有符号二进制补码乘法)  
extern  int32  smul32_16(int32 value1,int16 value2);     // 32位*16位-->32位(有符号二进制补码乘法)  
extern  int32  smul32(int32 value1,int32 value2);             // 32位*32位-->32位(有符号二进制补码乘法)  
extern        int8   sdiv8(int8 value1, int8 value2);          //  8位/ 8位--> 8位(有符号二进制补码除法)  
extern        int16  sdiv16_8(int16 value1,int8 value2);              // 16位/ 8位-->16位(有符号二进制补码除法)
extern  int16  sdiv16(int16 value1,int16 value2);             // 16位/16位-->16位(有符号二进制补码除法)
extern  int32  sdiv32_8(int32 value1, int8 value2);             // 32位* 8位-->32位(有符号二进制补码乘法)          
extern  int32  sdiv32_16(int32 value1,int16 value2);     // 32位/16位-->32位(有符号二进制补码除法)
extern  int32  sdiv32(int32 value1,int32 value2);             // 32位/32位-->32位(有符号二进制补码除法)
extern        int8   smod8(int8 value1, int8 value2);          //  8位% 8位--> 8位(有符号二进制补码取余数)
extern        int8   smod16_8(int16 value1,int8 value2);             // 16位% 8位--> 8位(有符号二进制补码取余数)
extern        int16  smod16(int16 value1,int16 value2);             // 16位%16位-->16位(有符号二进制补码取余数)  
extern        int8   smod32_8(int32 value1,int8 value2);              // 32位% 8位--> 8位(有符号二进制补码取余数)
extern        int16  smod32_16(int32 value1,int16 value2);     // 32位%16位-->16位(有符号二进制补码取余数)  
extern        int32  smod32(int32 value1,int32 value2);             // 32位%32位-->32位(有符号二进制补码取余数)   
extern        int8   sdiv8m(int8 value1, int8 value2, int8 data *p);      //  8位/ 8位--> 8位(有符号二进制除法及取余数,8位余数存*p)
extern        int16  sdiv16_8m(int16 value1,int8 value2,int8 data *p);        // 16位/ 8位-->16位(有符号二进制除法及取余数,8位余数存*p)
extern        int16  sdiv16m(int16 value1,int16 value2,int16 data *p);        // 16位/16位-->16位(有符号二进制除法及取余数,16位余数存*p)
extern        int32  sdiv32_8m(int32 value1,int8 value2,int8 data *p);         // 32位/ 8位--> 8位(有符号二进制除法及取余数,8位余数存*p)
extern        int32  sdiv32_16m(int32 value1,int16 value2,int16 data *p); // 32位/16位-->16位(有符号二进制除法及取余数,16位余数存*p)
extern        int32  sdiv32m(int32 value1,int32 value2,int32 data *p);        // 32位/32位-->32位(有符号二进制除法及取余数,32位余数存*p)   

extern        uint16  isqrt(uint16 value1);                    // 16位整数开平方
extern        uint32         lsqrt(uint32 value1);                                 // 32位整数开平方
extern  uint16         dmul(uint16 value1,uint16 value2);             // 16位*16位-->16位(无符号二进制小数乘法)
extern  uint16  dsin(uint16 value1);                                         // Y = SIN((PI/2)*X) (16位无符号二进制小数求sin)
                                                                                                                 //   X 取值范围:  0 <= X < 1

extern         void  ld_pdata(int8 addr1, int8 addr2, int8 len);                 //  @PDATA --> @IDATA(len字节PDATA读入片内IDATA RAM)       
extern         void  st_pdata(int8 addr1, int8 addr2, int8 len);                 //  @IDATA --> @PDATA(len字节片内IDATA RAM存入PDATA)

/*  中颖单片机C51定点库内部调用函数          
extern         int32        st_r03_r47(void);                                         //  R0R1R2R3 ---> R4R5R6R7
extern         int16        neg(void);                                                 //  -(R6R7)  ---> R6R7
*/

/*  中颖单片机C51定点库、浮点库自动调用专用运算库函数,合适有效地插入了中颖SH79/88/89系列的特色----准16位乘除指令,对所有
    关联到的无符号、有符号int型,无符号、有符号long型 和 float型变量的乘除运算,均作了运算速度大幅度提升,为方便使用,以外
        挂库形式加入,实行对C51内库自动替换,无缝嵌入,其中最具有特色的是float型的除法运算,用中颖SH79/88/89系列的准16位乘除指
        令,代替原Keil C51的加减法模拟除法程序,大幅度地提升了原float型的除法的运算速度,解决了原51浮点除法特慢的通病。

extern        uint16   imul(uint16 value1,uint16 value2);                 // 16位*16位-->16位(无符号二进制乘法)   
extern        uint16  uidiv(uint32 value1,uint16 value2);              // 16位/16位-->16位(无符号二进制除法)   
extern        uint32   lmul(uint32 value1,uint32 value2);                 // 32位*32位-->32位(无符号二进制乘法)   
extern        uint32  uldiv(uint32 value1,uint32 value2);              // 32位/32位-->32位(无符号二进制除法)   
extern        float   fpmul(float value1, float value2);                  // 二进制浮点数快速乘法  
extern        float   fpdiv(float value1, float value2);                  // 二进制浮点数快速除法  
*/

#endif

使用特权

评论回复
23
Cortex-M0|  楼主 | 2011-10-21 16:21 | 只看该作者
lib_sh88f51.rar (179.55 KB)

使用特权

评论回复
24
highgear| | 2011-10-21 21:20 | 只看该作者
再顶

使用特权

评论回复
25
ranqingfa| | 2011-12-1 21:20 | 只看该作者
我也不会用,领教了……研究研究

使用特权

评论回复
26
lovebaby8848| | 2011-12-6 11:23 | 只看该作者
看不懂。。。。

使用特权

评论回复
27
autopccopy| | 2011-12-6 20:53 | 只看该作者
COOL! :victory:

使用特权

评论回复
28
yixing2003| | 2011-12-8 12:37 | 只看该作者
数年前用汇编写过科学计算器的人

使用特权

评论回复
29
liuhongyu_2408| | 2012-9-4 07:57 | 只看该作者
中颖专用乘除库 在哪呢??

使用特权

评论回复
30
原野之浪| | 2012-9-4 21:59 | 只看该作者
坚决不用, 佩服啊

使用特权

评论回复
31
timeriverhao| | 2012-10-9 16:45 | 只看该作者
extern float   fpmul(float value1, float value2);           // 二进制浮点数快速乘法  
extern float   fpdiv(float value1, float value2);           // 二进制浮点数快速除法  
在对以上两个浮点型函数进行定以后出现的问题:
使用keil提供的库函数sqrt做根号运算会跑死,请确认是否存有此问题。

使用特权

评论回复
32
Cortex-M0|  楼主 | 2012-10-9 17:59 | 只看该作者
请提供简单的测试程序。

请注意,一定要将程序下载到 中颖51单片机下实时仿真或运行,在Keil C51模拟仿真环境下,无法得到预期结果。

使用特权

评论回复
33
highgear| | 2012-10-9 21:26 | 只看该作者
再再顶!!!

使用特权

评论回复
34
Cortex-M0|  楼主 | 2012-10-13 01:59 | 只看该作者
extern float   fpmul(float value1, float value2);           // 二进制浮点数快速乘法  
extern float   fpdiv(float value1, float value2);           // 二进制浮点数快速除法  
在对以上两个浮点型函数进行定以后出现的问题:
使用keil提供的库函数sqrt做根号运算会跑死,请确认是否存有此问题。...
timeriverhao 发表于 2012-10-9 16:45



更新过的库,修正了 除法 和 库函数sqrt 的内部变量 DPH 的冲突,请测试。

lib_20121010.rar

195.84 KB

使用特权

评论回复
35
缥缈九哥| | 2012-10-19 11:38 | 只看该作者
顶一下。楼主辛苦了。

使用特权

评论回复
36
yytpy2008| | 2012-10-19 13:13 | 只看该作者
只要在编译时加入 math_sh88f51.lib ,  将自动替代原 Keil C51内部库函数,实现无缝嵌入,在实际使用中,你根本不需要管这些库函数的存在。
例如:  int  a,b,c;
         float  x,y,z;
         c = a * b / c;
         z = x * y / z;
Keil C51将自动调用上述SH88F51专用库函数,替代原 Keil C51内部库函数,实现无缝嵌入。
对于这句话的理解是这样的:也就是说我用这个单片机编程时。就是还像以前的方法写就好了。对于浮点型的变量的除法用自动调用SH88F51专用库函数。实现高效运用对不对 ??

使用特权

评论回复
37
yytpy2008| | 2012-10-19 14:40 | 只看该作者
对《中颖快速浮点乘、除法程库》作了简单的测试,在仿真模式,用01.png和02.png的程序做了测试。发现P10的低电平时间都是2MS。没有体现出《中颖快速浮点乘、除法程库》的优点,是我测试的中哪里出问题了还是?????请教大师。

01.png (17.54 KB )

01.png

02.png (20.86 KB )

02.png

使用特权

评论回复
38
Cortex-M0|  楼主 | 2012-10-19 16:26 | 只看该作者
你这个测试是无效的,
abc = 1234567.3/142857.0
在keil  C51编译时,直接优化成
abc = 8.6419797
上下两个程序范本中,编译结果是一样的,根本没用到浮点数运算。
所以仿真结果一样。


如想测试,应改成。

float  a=1234567.3f;
float  b=142857.0f;
.......
abc = a/b; 或 abc = a*b;
.......

友情提示:
《中颖快速浮点乘、除法程库》在Keil C51环境下无法实现软件仿真,且仿真结果也是错的。
必须下载到 中颖51单片机中,实时仿真或运行,才能保证结果的正确性。

使用特权

评论回复
39
yytpy2008| | 2012-10-19 16:47 | 只看该作者
谢谢真是太大意了。我是硬件仿真的。。

使用特权

评论回复
40
liuhongyu_2408| | 2012-10-29 12:51 | 只看该作者
乘法、除法、快速返回三个文件我都加进去编译,然后主函数中我这样调用为什么总是不行呢?

extern        float   FPMUL(float value1, float value2);                  // 二进制浮点数快速乘法  
extern        float   FPDIV(float value1, float value2);                  // 二进制浮点数快速除法

float e ;
void main(void)
{
        while(1)
        {
                e = 0;       
                e = FPMUL(6543.21456,1234.56789);
                e = FPDIV(6543.21456,1234.56789);
                _nop_();
        }
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则