单片机输出正弦函数中正弦表的计算

#include<iostream.h>
#include<math.h>
int n;
unsigned int y;
void main()
{
for(n=0;n<65;n++)
{
y=1+sin(2*3.14*n/64);
cout<<hex<<y;
}
}
一个周期分成64个点。大家说说有没有问题啊,为什么输出不是16进制的?
y我想用2个字节来存储,所以用的是unsigned int,但是好像存放得不够。

谢谢vbtraz 指教,应该是for(n=0;n<64;n++)

为什么输出不到16进制的数呢?
我想用表格code的形式,把数据输出到D/A输出正弦波

我用的是keil软件编译,就是用来给51单片机编程用的。在数据类型里,keil定义的int就是 2个byte。
确实y不是整数。我的意思是想让程序输出正弦信号的采样值。最后可以以0xxx这种方式16进制方式输出。如果用float型的话长度是4个字节,char是一个字节,到底哪个类型好呢?

看你用什么D/A了。8/12位D/A的话用char/int就好了。float不行,运算太慢了,又占空间。
你想VC得到数据,初始化为单片机数据,然后单片机查表实现?这是可行的方法。
#include <stdio.h>
#include <math.h>
#define PI (4*atan(1))
int main()
{
int i;
for(i=0;i<64;++i)
printf("0x%04x,",(short)(256*(1+sin(2*PI*i/64))));
return 0;
}

0x0100,0x0119,0x0131,0x014a,0x0161,0x0178,0x018e,0x01a2,
0x01b5,0x01c5,0x01d4,0x01e1,0x01ec,0x01f4,0x01fb,0x01fe,
0x0200,0x01fe,0x01fb,0x01f4,0x01ec,0x01e1,0x01d4,0x01c5,
0x01b5,0x01a2,0x018e,0x0178,0x0161,0x014a,0x0131,0x0119,
0x0100,0x00e6,0x00ce,0x00b5,0x009e,0x0087,0x0071,0x005d,
0x004a,0x003a,0x002b,0x001e,0x0013,0x000b,0x0004,0x0001,
0x0000,0x0001,0x0004,0x000b,0x0013,0x001e,0x002b,0x003a,
0x004a,0x005d,0x0071,0x0087,0x009e,0x00b5,0x00ce,0x00e6
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-07-04
你计算的是65个点

y=1+sin(2*3.14*n/64); int y存放这个?

你用的什么编译器啊,int还是2字节的? 而且问题不在几个字节,问题是它不是整数啊

如果你想用“定点数”的方式,你至少得乘一下再说吧,要不你直接把,比如说1.2存放在 unsigned int 里, 当然就是1了

short y;
y = sin(2* 3.14*n/64) * 32767;
第2个回答  2009-07-04
考虑一般da是八位,输出的电压是0-基准电压,数字在0-255
你必须把正弦函数的值+1,向上整体便宜,即0-2的值再对用到0-255上面去,da输出的值,经过放大就可以得到你想要的正弦。

不要使用复杂函数,单片机不会做的,及时做也很费时间和资源,建议做成表
第3个回答  2009-07-05
printf("%x",y);可以生成16进制的数了,另外用unsigned char也可以的

单片机输出正弦函数中正弦表的计算
你想VC得到数据,初始化为单片机数据,然后单片机查表实现?这是可行的方法。include <stdio.h> include <math.h> define PI (4*atan(1))int main(){ int i;for(i=0;i<64;++i)printf("0x%04x,",(short)(256*(1+sin(2*PI*i\/64)));return 0;} 0x0100,0x0119,0x0131,0x014a,0x...

单片机输出正弦波,那个数据表的数据是怎样计算得到的?有具体的计算过程...
直接sin(1.8*n)即可得出某个时刻的三角函数 值 将这个数值再乘以DA的最大数字量,8位是256,10位是1024 即可得到单片机要送往DA转换器的数字量

用51单片机产生正弦波,那个数据表怎么得到的?谢谢!
这个表是预先算好的,就是将标准正弦波上移1\/2幅值后模256。三角波和锯齿波也可以按相同方法计算得到对应的数值表。对一个周期取样256次,也就是说第0个取样点的弧度是0,第一个取样点的弧度值就是pi\/128,第二个取样点的弧度为(pi\/128)*2,依次类推。测峰峰值为256,所以f(x) = sin(x)*1...

用51单片机产生正弦波的查表方法
单相的从正弦涵数中从0度到90度范围中均匀取出n个数再用256的模转换成表格数。三相的只需从0度到30度取,可这会n要是三的公倍数。后在运行中按你的频率的不同从该表格中抽取就行了。这就是单牌机由PWM产生的正弦波中的那时间段的数。

利用单片机怎么产生正弦波信号
单片机 外接AD转换芯片 再加运放 通过一定的控制程序就可产生正弦波。实现方法:1、通过单片机DA来实现,需要通过查表法;2、通过PWM方式实现;不过都需要加硬件滤波电路来实现正弦波的平滑。

如何用单片机控制输出一个1KHz,5Ⅴ的正弦波?电路图
单片机内置 模数转换模块DA,参考电压 为5V 再利用正弦函数 算出从0-360度的值 假设5V 满量程为max. DA=sinX*(max\/2)+max\/2 (X为角度)给360 度每个角度都算遍 并且定个周期为 1Khz 输出模拟电压即可 换算方法 如 3度 sin(pi\/180 *3) 90度 sin(pi\/180 *90)以上表述 由于不...

请教各位如何在单片机内计算正弦反正弦余弦程序
用库函数,头文件是math.h,里面有sin,cos等函数。

单片机查表法输出正弦信号,如何连续或阶梯式调整输出信号幅度呢?_百度...
首先单片机需要接入一个DA来输出模拟电压。你查表得到的只是正弦幅值为1的时候的正弦信号波形,所以调整幅值的时候直接乘以你要输出的幅值就行了,比如:sin(90°)=1,查表的时候得到的就是在90°的位置是1,如果想输出0.5*sin(90)=0.5 那就直接在输出的时候乘以0.5就行了,如果输出2,道理...

如何利用单片机实现正弦函数运算?
用单片机C语言实现比较简单!1、增加头文件:#include<math.h> 2、使用sin(x),cos(y)等等实现;3、例如:int i,y;for(i=0;i<360;i++){ y= sin(i);}

单片机实现正弦波的C程序
在把PC上 用C语言 编写一个程序 生成 一个周期 正弦信号 的离散值 用一个字节 8位 表示 即 0 ~ 255 表示正弦 信号 -1 到 1之间的值 单片程序 把这组0 ~ 255的 数字 放在一个 数组里 用循环 向 某个 IO口输出 这个数组 IO口接 DAC数模转换 器 ...

相似回答