从上图可以看出,sin求解程序很简单,超级山寨,只需指定 FX 值,编译运行后,程序输出两个值,fy为定点小数求解sin值,再转换成浮点数供观看,fy1为调用标准的C51浮点函数库计算sin, 供测试结果对比验证用。
/***************************************************************************************
Model : main.c
Description : 中颖单片机C51定点小数 SIN((PI/2) * X)运算函数,DEMO测试程序。
SIN((PI/2) * X) = 0.07185 * X^5 - 0.64215 * X^3 + 1.57036 * X
= X + (0.57036 - (0.64215 -0.07185 * X^2) * X^2) * X
X 取值范围:0 <= X < 1
Author : CLR
Create Time : 2011-10-11
Version ID : 1.5
用 途 :中颖SH79/88/89F51系列MCU
作 者 :许意义
21ic ID :LAOXU
中颖论坛 : bbs.21ic.com
****************************************************************************************/
#include <DEFINE51.H>
#include <global.h>
#include <intrins.h>
#include <math.h>
#include <Sinowealth\SH88F4051.H>
#define FX 1.234567L
#define K0 37379 // 0.57036
#define K1 42084 // 0.64215
#define K2 4709 // 0.07185
#define PI 3.1415926L
#define X (FX * 2 / PI) * 0x10000
uint16 y;
float fy, fy1;
uint16 dsin(uint16 x) //SIN((PI/2) * X) = X + (K0 - (K1 - K2 * X^2) * X^2) * X
{ uint16 a, b;
if(x<0xfe88)
{ a = dmul16(x, x);
b = K1 - dmul16(K2, a);
b = K0 - dmul16(b, a);
x += dmul16(b, x);
}
else
{ x = 0xffff;
}
return(x);
}
void main(void)
{ // 中颖单片机C51定点小数 SIN((PI/2) * X)运算函数,DEMO测试程序。
// 调用中颖单片机C51专用运算库函数,加速运算速度
y = dsin(X);
fy = (float)y / 0x10000;
fy1 = sin(FX);
_nop_();
while(1);
}
测试程序打包上传:
sin.rar
(32.91 KB)
|