单片机 外接AD转换芯片 再加运放 通让清过一定的控制程姿卖序就可迹滑逗产生正弦波。
实现方法:
1、通过单片机DA来实现,需要通过查表法;
2、通过PWM方式实现;
不过都需要加硬件滤波电路来实现正弦波的平滑。
源代码如下:
#include#include#define EX 0.000001
#define PI 3.14159265
int main()
{
double x=0.0, temp=1.0, sin=0.0
int i
printf("Please input a degree:")
scanf("%lf",&x)
x=x*PI/180
temp=xi=0
while ( fabs(temp) >EX ) ...{
sin += temp
i += 2
temp = (-1) * temp*x*x/( (i+1)*(i) )
}
printf("sin(%lf) = %lf ",x,sin)
printf("The number is %d ",i)
return 0
}
扩展资料春逗
C语言编写一个程序输出一个正方形裤嫌的源代码如下:
#include
int main()
{
int i,j,n
scanf("%d",&n)
for(i=0i
printf("*")
else
printf(" 扒纯卖")
}
printf("\n")
}
return 0
}
首先,我要声明一点,单片机的浮点数处理能力非常弱的,你这个程序,基础可以用数组查表的方法来做,当然,你这么错不是不行,初学者可以扮仿燃用来做实验,但是高手可不会这么错。言归正传,我来给你讲解一下这个do里面的思路。我们分步来看,先看sin(x),从 -3.1415---+3.1415
sin(x)的数值是多少?答案是0到-1再到0再到1再到0,这么个过程,这是高中的数学知识,如果你不明白,我就没有办法了。
搞明白了sin(x)的变化范围,我们就不难明白,如果不加以限制的,直接用 255*sin(x),那么,这个结果就会出现负数,变化范围是 0----(-255)---(0)----(255)---0,因为你需要把这个数值赋值给P1口,那么,你知道如果把一个负数赋值给 P1口是什么结果吗?因为负数在单片机里是用补码表示的,所以,把一个负数表示成无符号的数,它是很大的,所以P1口就会乱。
所以,为了避免负数,就要把sin(x)里产生的负数抵消去,怎么抵消?我们知道,sin(x)最小值是 -1,所以,只要 (1 + sin(x)),那么大掘,这个结果就永远不可能小于0,这个的变化范围是
1----0----1----2----1
最大的数值是2,最小的是0
然后乘以 255再给P1口送去,我们又知道,P1口最大只能到 255,而你的式子(1 + sin(x))
最大是2,(1 + sin(x))*255最大得到的厅虚是 510,那为了不失真,所以,要把(1 + sin(x))*255再除以一个2,就得到你上面的结果了。
如果你是用的DA转换器,通过示波器,你可以看到一个如下公式的波形:
f = 2.5*sin(2*3.1415926*f) + 2.5
这样的函数波形。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)