mcu5i51 发表于 2011-10-21 09:33

太好了,帮顶

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
        作者      :许意义
        21icID    :LAOXU
        中颖论坛    : bbs.21ic.com   
****************************************************************************************/
#ifndef                _GLOBAL_H
#define                _GLOBAL_H

#pragmaMODDP2                          // 打开中颖单片机双DPTR功能,加速数据传送
//#pragmaNOMODDP2                  // 关闭中颖单片机双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        uint16mul8(uint8 value1, uint8 value2);      //8位* 8位-->16位(无符号二进制乘法)
externuint32         mul16_8(uint16 value1,uint8 value2);       // 16位* 8位-->32位(无符号二进制乘法)
externuint32         mul16(uint16 value1,uint16 value2);               // 16位*16位-->32位(无符号二进制乘法)
externuint32         mul32_8(uint32 value1,uint8 value2);       // 32位* 8位-->32位(无符号二进制乘法)
externuint32         mul32_16(uint32 value1,uint16 value2);       // 32位*16位-->32位(无符号二进制乘法)
externuint32         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位(无符号二进制除法)
externuint16div16(uint16 value1,uint16 value2);               // 16位/16位-->16位(无符号二进制除法)
externuint32         div32_8(uint32 value1,uint8 value2);       // 32位/ 8位-->32位(无符号二进制除法)
externuint32         div32_16(uint32 value1,uint16 value2);       // 32位/16位-->32位(无符号二进制除法)
externuint32         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        uint16div16_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        int16smul8(int8 value1, int8 value2);          //8位* 8位-->16位(有符号二进制补码乘法)
externint32smul16_8(int16 value1,int8 value2);             // 16位* 8位-->32位(有符号二进制补码乘法)
externint32smul16(int16 value1,int16 value2);             // 16位*16位-->32位(有符号二进制补码乘法)
externint32smul32_8(int32 value1,int8 value2);             // 32位* 8位-->32位(有符号二进制补码乘法)
externint32smul32_16(int32 value1,int16 value2);   // 32位*16位-->32位(有符号二进制补码乘法)
externint32smul32(int32 value1,int32 value2);             // 32位*32位-->32位(有符号二进制补码乘法)
extern        int8   sdiv8(int8 value1, int8 value2);          //8位/ 8位--> 8位(有符号二进制补码除法)
extern        int16sdiv16_8(int16 value1,int8 value2);              // 16位/ 8位-->16位(有符号二进制补码除法)
externint16sdiv16(int16 value1,int16 value2);             // 16位/16位-->16位(有符号二进制补码除法)
externint32sdiv32_8(int32 value1, int8 value2);             // 32位* 8位-->32位(有符号二进制补码乘法)          
externint32sdiv32_16(int32 value1,int16 value2);   // 32位/16位-->32位(有符号二进制补码除法)
externint32sdiv32(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        int16smod16(int16 value1,int16 value2);             // 16位%16位-->16位(有符号二进制补码取余数)
extern        int8   smod32_8(int32 value1,int8 value2);              // 32位% 8位--> 8位(有符号二进制补码取余数)
extern        int16smod32_16(int32 value1,int16 value2);   // 32位%16位-->16位(有符号二进制补码取余数)
extern        int32smod32(int32 value1,int32 value2);             // 32位%32位-->32位(有符号二进制补码取余数)   
extern        int8   sdiv8m(int8 value1, int8 value2, int8 data *p);      //8位/ 8位--> 8位(有符号二进制除法及取余数,8位余数存*p)
extern        int16sdiv16_8m(int16 value1,int8 value2,int8 data *p);        // 16位/ 8位-->16位(有符号二进制除法及取余数,8位余数存*p)
extern        int16sdiv16m(int16 value1,int16 value2,int16 data *p);        // 16位/16位-->16位(有符号二进制除法及取余数,16位余数存*p)
extern        int32sdiv32_8m(int32 value1,int8 value2,int8 data *p);         // 32位/ 8位--> 8位(有符号二进制除法及取余数,8位余数存*p)
extern        int32sdiv32_16m(int32 value1,int16 value2,int16 data *p); // 32位/16位-->16位(有符号二进制除法及取余数,16位余数存*p)
extern        int32sdiv32m(int32 value1,int32 value2,int32 data *p);        // 32位/32位-->32位(有符号二进制除法及取余数,32位余数存*p)   

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

extern         voidld_pdata(int8 addr1, int8 addr2, int8 len);               //@PDATA --> @IDATA(len字节PDATA读入片内IDATA RAM)       
extern         voidst_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        uint16uidiv(uint32 value1,uint16 value2);              // 16位/16位-->16位(无符号二进制除法)   
extern        uint32   lmul(uint32 value1,uint32 value2);                 // 32位*32位-->32位(无符号二进制乘法)   
extern        uint32uldiv(uint32 value1,uint32 value2);              // 32位/32位-->32位(无符号二进制除法)   
extern        float   fpmul(float value1, float value2);                  // 二进制浮点数快速乘法
extern        float   fpdiv(float value1, float value2);                  // 二进制浮点数快速除法
*/

#endif

Cortex-M0 发表于 2011-10-21 16:21

highgear 发表于 2011-10-21 21:20

再顶

ranqingfa 发表于 2011-12-1 21:20

我也不会用,领教了……研究研究

lovebaby8848 发表于 2011-12-6 11:23

看不懂。。。。

autopccopy 发表于 2011-12-6 20:53

COOL! :victory:

yixing2003 发表于 2011-12-8 12:37

数年前用汇编写过科学计算器的人

liuhongyu_2408 发表于 2012-9-4 07:57

中颖专用乘除库 在哪呢??

原野之浪 发表于 2012-9-4 21:59

坚决不用, 佩服啊

timeriverhao 发表于 2012-10-9 16:45

extern float   fpmul(float value1, float value2);         // 二进制浮点数快速乘法
extern float   fpdiv(float value1, float value2);         // 二进制浮点数快速除法
在对以上两个浮点型函数进行定以后出现的问题:
使用keil提供的库函数sqrt做根号运算会跑死,请确认是否存有此问题。

Cortex-M0 发表于 2012-10-9 17:59

请提供简单的测试程序。

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

highgear 发表于 2012-10-9 21:26

再再顶!!!

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 https://bbs.21ic.com/images/common/back.gif


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

缥缈九哥 发表于 2012-10-19 11:38

顶一下。楼主辛苦了。

yytpy2008 发表于 2012-10-19 13:13

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

yytpy2008 发表于 2012-10-19 14:40

对《中颖快速浮点乘、除法程库》作了简单的测试,在仿真模式,用01.png和02.png的程序做了测试。发现P10的低电平时间都是2MS。没有体现出《中颖快速浮点乘、除法程库》的优点,是我测试的中哪里出问题了还是?????请教大师。

Cortex-M0 发表于 2012-10-19 16:26

你这个测试是无效的,
abc = 1234567.3/142857.0
在keilC51编译时,直接优化成
abc = 8.6419797
上下两个程序范本中,编译结果是一样的,根本没用到浮点数运算。
所以仿真结果一样。


如想测试,应改成。

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

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

yytpy2008 发表于 2012-10-19 16:47

谢谢真是太大意了。我是硬件仿真的。。

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_();
        }
}
页: 1 [2] 3
查看完整版本: 最据山寨特色的《中颖快速浮点乘、除法程库》!!!