我想用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();
}
} 展开
#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();
}
} 展开
2个回答
展开全部
根据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的正弦波。
展开全部
幅值,和电路有关。
频率,和单片机的晶振频率、延时函数,有关。
可以用示波器来观察波形,验证你的理论计算。
波形观察方法,可参考:
http://hi.baidu.com/do_sermon/item/a4ad641a9b8102ffddeeca30
频率,和单片机的晶振频率、延时函数,有关。
可以用示波器来观察波形,验证你的理论计算。
波形观察方法,可参考:
http://hi.baidu.com/do_sermon/item/a4ad641a9b8102ffddeeca30
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询