您的位置:首页 > 其它

基于51单片机+DAC0832的信号发生器

2016-05-25 22:45 302 查看
最近帮别人设计一个毕业设计,做一个多种信号发生器(四种波形:方波、三角波、锯齿波、梯形波),现在贴上来给大家参考,如果有错误的地方,望指出~

下面先贴上仿真的电路图(仿真的软件是Protuse,上传一个大点的图,方便大家看的清楚点):

原件清单:STC89C52单片机X1、DAC0832转换器X1、12M晶振X1、电容22pfX2、10uf的电容X1、1nf陶瓷电容X1、独立按键X4、10千欧排阻X1、10KΩ电阻X5、LM358 单电源运放X1。仿真就需要这些原件,具体的硬件设计大家定好了在制作~



下面上传一下C程序吧~(使用的IDE环境是Keil 4,语言是C语言)

Source文件(.c文件):

1\main.c文件:

#include "reg52.h"
#include "init.h"
#include "single.h"
#include "delay.h"
#include "Key.h"
int main(void)
{
unsigned char Model=0;//0-方波 1-三角波 2-锯齿波 3-正弦波
unsigned int Count=0;//计数器
unsigned int Squ_Per=256;
unsigned int Tri_Per=256;
unsigned int Saw_Per=256;
unsigned int Sin_Per=256;
init();
while(1)
{
while(Model==0)
{
Square_wave(Squ_Per,&Count);
Count+=4;
Squ_Per=Key_Plus(Squ_Per);
Squ_Per=Key_Subc(Squ_Per);
Model=Key_Model(Model,&Squ_Per,&Count);//每次退出当前while时记得复原Period和Count的数据
}
while(Model==1)
{
Triangle_wave(Tri_Per,&Count);
Count+=4;
Tri_Per=Key_Plus(Tri_Per);
Tri_Per=Key_Subc(Tri_Per);
Model=Key_Model(Model,&Tri_Per,&Count);
}
while(Model==2)
{
Sawtooth_wave(Saw_Per,&Count);
Count+=4;
Saw_Per=Key_Plus(Saw_Per);
Saw_Per=Key_Subc(Saw_Per);
Model=Key_Model(Model,&Saw_Per,&Count);
}
while(Model==3)
{
Sin_wave(Sin_Per,&Count);
Count+=4;
Sin_Per=Key_Plus(Sin_Per);
Sin_Per=Key_Subc(Sin_Per);
Model=Key_Model(Model,&Sin_Per,&Count);
}
}
return 0;
}


2\init.c文件:

#include "reg52.h"
sbit CS_DAC=P1^5;//DAC0832的片选端口
sbit WR_DAC=P1^6;//DAC0832的数据写入端口
extern void init(void)
{
P0=0xff;
P1=0xff;
P2=0xff;
P3=0xff;
CS_DAC=0;//一直片选中DAC0832,低电平有效啊~
WR_DAC=0;//一直写入数据到DAC0832
}


3\single.c文件

#include "reg52.h"
#include "single.h"
#include "delay.h"
#define DATA P0
void Square_wave(unsigned int Per,unsigned int *Count)
{
if(*Count>=Per) *Count=0;
if(*Count<Per/2)
{
DATA=0x00;
}
else
{
DATA=0xFF;
}
}
void Triangle_wave(unsigned int Per,unsigned int *Count)
{
if(*Count>=Per) *Count=0;
if(*Count<Per/2)
{
DATA=*Count;
}
else
{
DATA=Per-*Count;
}
}
void Sawtooth_wave(unsigned int Per,unsigned int *Count)
{
if(*Count>=Per) *Count=0;
if(*Count<Per)
{
DATA=*Count;
}
}
void Sin_wave(unsigned int Per,unsigned int *Count)
{
if(*Count>Per) *Count=0;
if(*Count<Per/2)
{
DATA=*Count;
}
else if(*Count==Per/2)
{
delay(100);
}
else if(*Count<Per)
{
DATA=Per-*Count;
}
else if(*Count==Per)
{
delay(100);
}
}


4\Key.c文件:

#include "Key.h"
#include "delay.h"
sbit key2=P3^3;    //wave Change
sbit key3=P3^4;    //Fre plus
sbit key4=P3^5;    //Fre subc
unsigned char Key_Model(unsigned char Model,unsigned int *Pre,unsigned int *Count)
{
if(key2==0)
{
delay(10);
if(key2==0)
{
Model=Model+1;
*Pre=256;
*Count=0;
}
}
while(key2==0);
if(Model>3)
{
Model=0;
}
return Model;
}
unsigned int Key_Plus(unsigned int Per)
{
if(key3==0)
{
delay(10);
if(key3==0)
{
Per=Per+8;
}
}
while(key3==0);
if(Per>256)
{
Per=0;
}
return Per;
}
unsigned int Key_Subc(unsigned int Per)
{
if(key4==0)
{
delay(10);
if(key4==0)
{
Per=Per-8;
}
}
while(key4==0);
if(Per<0)
{
Per=256;
}
return Per;
}


5\delay.c文件:

void delay(unsigned int r)
{
unsigned int i,j;
for(i=r;i>0;i--)
for(j=110;j>0;j--);
}


Header文件(.h文件):

1\init.h文件:

extern void init(void);


2\single.h文件:

void Square_wave(unsigned int Per,unsigned int *Count);
void Triangle_wave(unsigned int Per,unsigned int *Count);
void Sawtooth_wave(unsigned int Per,unsigned int *Count);
void Sin_wave(unsigned int Per,unsigned int *Count);


3\Key.h文件:

#include "reg52.h"
unsigned char Key_Model(unsigned char Model,unsigned int *Pre,unsigned int *Count);
unsigned int Key_Plus(unsigned int Per);
unsigned int Key_Subc(unsigned int Per);


4\delay.h文件:

#include <intrins.h>
void delay(unsigned int r);
#define NOP() _nop_()


所用的工程文件我都已经上传喽~,下面来看看仿真的结果:(大家在电路设计的时候可以进行一下滤波处理,然后对信号进行放大处理,这样的话效果可能会更好点哦~)

方波: 三角波: 锯齿波: 梯形波:









大家转载请注明出处!谢谢!

在这里要感谢GISPALAB实验室的各位老师和学长学姐的帮助!谢谢~

大家注意下,电路有个小问题,由于本人的失误,DAC0832的Iout1和Iout2的输出接口的接法应该按如下的接入方式:

需要修改的地方有:

1、电源改成双电源

2、Iout接口需要接地


修改完毕之后的结果就会比较完美了,下面上传一个三角波的波形

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: