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_();
}
}