51单片机控制DAC0832产生正弦波,如何用定时器改变频率,求代码!

#include <reg51.h>
unsigned int i;
code unsigned char 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};
main()
{
while(1)
{
i++;
if(i==128)i=0;
P1=Sin[i];
}
}

可以用一个定时器中断,在中断服务程序里面,直接把对应的正弦采样数据置入P1口,通过修改定时器的中断间隔,达到调整输出频率的目的;
假设你的采样数据的原始采样率为1KHz, 被采样正弦波频率为100Hz,当Timer中断间隔为1ms时,DAC那里输出处理后输出即为100Hz, 如果中断间隔为500us,输出就是200Hz

static unsigned char byIndex=0;
中断函数里面包含如下两句

P1 = Sin[byIndex++];
byIndex &= 0x7f;
温馨提示:内容为网友见解,仅供参考
第1个回答  推荐于2016-01-19
DAC0832转换时间为1uS,一个正弦周期输出32个点的话,最高输出信号频率可达31.25kHz。
如果采用单片机产生,具体还与单片机的速度有关。采用RISC指令集的单片机,指令周期与晶振周期相同,采用16MHZ晶振的话,可以达到上述要求。
先确定每个周期输出的点数,假设是32个点。
DAC0832输出分辨率为8位,DAC0832输出以半电压上下对称的正弦波,峰值对应±128,那么,分别计算出32个点的正弦值,制作一个表格存储在单片机的程序空间或EEPROM空间。
根据信号频率设置定时器的溢出周期,定时器溢出周期为信号周期的1/32,定时器溢出时,依次输出32个点的正弦值至DAC0832的数字量输入端口。
最后,DAC0832的输出经运放电路转变为正负对称的正弦波,再经一个积分器或低通滤波器可输出平滑的正弦波。
#include<reg52.h>
unsigned char i;
unsigned char code sin_tab[] = //正弦波输出表
{
0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,
0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,
0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,
0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,
0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDA,
0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,
0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,
0x80,0x7C,0x79,0x76,0x72,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,
0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,
0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,
0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,
0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,
0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x7E
};
sbit W=P2^0;
sbit CS=P2^1;
void delay(x)
{
int i,j;
for(j=x;j>0;j--)
for(i=1111;i>0;i--);
}
void main()
{
W=0;
CS=0;
while(1)
{
/*for(i=0;i<256;i++)
{
P1=sin_tab[i];
if(i==256)
i=0;
} */
P1=0xff;
while(1);
//delay(10);
//P1=0x00;
//delay(10);
}
}

如何用51单片机控制DAC0832产生不同频率正弦波,键盘改变频率,求具体的...
假设你把一个正弦波的一周期分成180个点,那么每个点相差是2度,那么每个点是有一个对应的SIN值的,比如SIN0 SIN2 SIN4等。假设1ms发送一个点(即单片机向DA写一个该SIN值所对应的电压大小), 那么写完一个正弦波,要180ms。如果2ms写一个点,这就改变了正弦波的频率了。一周期所分的点越...

51 单片机和DAC0832输出方波、矩形波和正弦波由液晶1602显示的C语言程 ...
sbit DA_S1= P2^0; \/\/ 控制DAC0832的8位输入寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存 sbit DA_S2= P2^1; \/\/ 控制DAC0832的8位DAC寄存器,仅当都为0时,可以输出数据(处于直通状态),否则,输出将被锁存 sbit key= P3^2;uchar wavecount; \/\/'抽...

利用单片机和DAC0832控制输出方形波,锯齿波,三角波,并通过示波器显示...
unsigned char i,sqar_num=128; \/\/最大值100,默认值50 unsigned char cho=0; \/\/0:正弦波。1:方波。2:三角波。3:锯齿波。unsigned char num=0;unsigned char TIME0_H=0xff,TIME0_L=0xd9; \/\/定时器0的初值设置;全局变量.对应正弦波,锯齿波50HZ sbit chg= P1^0; \/\/...

DAC0832+单片机输出正弦波频率最大值问题
DAC0832转换时间为1uS。采用单片机控制的话,转换速度已经够快了,采用查表法输出,假设单片机主频为1MHz(传统51,晶振12MHz为例),那么,采用汇编语言的话,效率较高的话,输出一个数据点大约需要20uS。假设一个周期输出64个数据点,大约1280uS,大约可输出1kHz的频率。如果采用较高速度单片机(如AVR系...

...一段程序,使用查表的方式使单片机控制DAC0832产生一个电压值在0~5V...
ET0=1; \/\/打开定时器允许中断开关 TR0=1; \/\/打开定时器定时开关}void display() \/\/显示函数{ uchar qian,bai,shi,ge; \/\/定义变量用于显示 qian=pinlv\/1000; \/\/将频率值拆成一位的数据,将数据除以1000,得到的商是一位数,赋值给qian bai=pinlv%1000\/100; \/\/将频率除以1000的余数再除以100就得到了频...

寻求一篇数学专业关于点集拓扑的大学毕业论文,题目“连续映射的等价条件...
摘要:在电子和通信产品中往往需要高精度的正弦信号,而传统的正弦信号发生器往往在低频输出时的频率的稳定度和精度等指标都不高。文中介绍了Micro Linear公司的一款单片正弦信号发生芯片ML2035,它可以在几乎不需要其它外围器件的条件下,产生从直流到25kHz的正弦信号,并利用此芯片完成了简易正弦信号发生器电路的设计。

设计并制作一个信号发生器要能产生正弦波周期性波形还能显示当前频率值...
本次课程设计使用的AT89S51 单片机构成的发生器可产生锯齿波、三角波、正弦波等多种波形,波形的周期可以用程序改变,并可根据需要选择单极性输出或双极性输出,具有线路简单、结构紧凑等优点。在本设计的基础上,加上按钮控制和LED显示器,则可通过按钮设定所需要的波形频率,并在LED上显示频率、幅值电压,...

51单片机输出电压随输入电压变化,如何实现
1、对于问题解决应该采取最简单有效的方法,说一下我的观点:对于大部分网友采用AD配合DA来实现,个人觉得是多此一举。如果是保留采用AD来采集的话,我们大可以使用定时器控制输出频率可变的方波至外界电阻上(PWM实现DA输出的方法,这里采用定时器模拟PWM输出)实现可变的电压输出。2、问题很直白,我们这样...

怎么用单片机产生2路正弦波信号相位相差120度(用2片dac0832)
提供一点思路,用两个定时器产生PWM信号,第一个定时器工作到交流电半周期的三分之二启动第二个定时器。

如何用单片机控制产生的波形输出电压可调,步进0.1v,0-5v
用PWM,即脉宽调制。我使用1个定时器中断做周期,在中断服务程序中用DJNZ指令循环比较做占空比实现步进电机的电流控制的。占空多了,电流就弱。要控制电压可能需要电路转换一下,如:在主回路串接PWM控制的开关管和电感,输出并电容。ORG 000BH;---T0---PWM CLR ET0 LJMP PWM ;---T0--...

相似回答