我想用51单片机产生一个1khz的正弦波,程序应该怎么写,下图的程序怎样看出它的幅值与频率

#include<reg52.h>#include<absacc.h>#defineDAC0832XBYTE[0x7fff]sbitdawr=P3^6;//DA写数据sb... #include<reg52.h>
#include<absacc.h>

#define DAC0832 XBYTE[0x7fff]

sbit dawr=P3^6; //DA写数据
sbit csda=P2^7; //DA片选

unsigned char code sin[128]={64,67,70,73,76,79,82,85,88,91,94,96,99,102,104,106,
109,111,113,115,117,118,120,121,123,124,125,126,126,
127,127,127,127,127,127,127,126,126,125,124,123,121,
120,118,117,115,113,111,109,106,104,102,99,96,94,91,
88,85,82,79,76,73,70,67,64,60,57,54,51,48,45,42,39,
36,33,31,28,25,23,21,18,16,14,12,10,9,7,6,4,3,2,1,
1,0,0,0,0,0,0,0,1,1,2,3,4,6,7,9,10,12,14,16,18,21,23,
25,28,31,33,36,39,42,45,48,51,54,57,60};

void delay()
{
unsigned char i;
for(i=0;i<=30;i++)
{};

}

void main(void)
{

unsigned char j;
csda=0;
dawr=0;

while(1)
{
for(j=0;j<128;j++)
DAC0832 = sin[j];
delay();
}
}
展开
 我来答
雨田丫
2013-05-16 · TA获得超过822个赞
知道小有建树答主
回答量:235
采纳率:100%
帮助的人:163万
展开全部

根据DAC0832 = sin[j];可知,数组值直接赋给了DAC,数组中,最大值为127,最小值为0,这就是幅值 0~127。如果要电压幅值,这与电路有关。设数据255(0xFF)对应输出5V,数据0对应输出0V,则0~127对应的电压幅值为0~2.5V。

频率决定于delay()的延时量,这个又与单片机的时钟有关,所以看你的程序是确这不了的。

另外:

===============================

(1)SIN[ ]数组的值 可以用EXCEL简单地算出。如图,A2开始以0,1,2,3,4....向下填充直到359,在B2输入公式(如图),公式向下复制,直到B360。算出的值就是上面数组SIN[]的值。这个更精确。

(2)然后

for(j=0;j<360;j++){
DAC0832 = sin[j];
delay();

}

可得正弦波输出。但频率用delay()不精确,只能设试确定。

(3)可以用定时中断。中断时间为1/(360*1000)秒。每次中断程序中:

DAC0832 = sin[j++];

if(j==360)j=0;

这就可得1000Hz的正弦波。

做而论道
高能答主

2013-05-17 · 把复杂的事情简单说给你听
知道大有可为答主
回答量:3万
采纳率:80%
帮助的人:1.2亿
展开全部
幅值,和电路有关。
频率,和单片机的晶振频率、延时函数,有关。
可以用示波器来观察波形,验证你的理论计算。

波形观察方法,可参考:
http://hi.baidu.com/do_sermon/item/a4ad641a9b8102ffddeeca30
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式