新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 基于51單片機(jī)+DAC0832的信號發(fā)生器

基于51單片機(jī)+DAC0832的信號發(fā)生器

作者: 時間:2017-01-12 來源:網(wǎng)絡(luò) 收藏

  最近幫別人設(shè)計一個畢業(yè)設(shè)計,做一個多種信號發(fā)生器(四種波形:方波、三角波、鋸齒波、梯形波),現(xiàn)在貼上來給大家參考,如果有錯誤的地方,望指出~

本文引用地址:http://m.butianyuan.cn/article/201701/342829.htm

  下面先貼上仿真的電路圖(仿真的軟件是Protuse,上傳一個大點(diǎn)的圖,方便大家看的清楚點(diǎn)):

  原件清單:STC89C52單片機(jī)X1、轉(zhuǎn)換器X1、12M晶振X1、電容22pfX2、10uf的電容X1、1nf陶瓷電容X1、獨(dú)立按鍵X4、10千歐排阻X1、10KΩ電阻X5、LM358 單電源運(yùn)放X1。仿真就需要這些原件,具體的硬件設(shè)計大家定好了在制作~

 

  下面上傳一下C程序吧~(使用的IDE環(huán)境是Keil 4,語言是C語言)

  Source文件(.c文件):

  1main.c文件:

  1 #include "reg52.h"

  2 #include "init.h"

  3 #include "single.h"

  4 #include "delay.h"

  5 #include "Key.h"

  6 int main(void)

  7 {

  8 unsigned char Model=0;//0-方波 1-三角波 2-鋸齒波 3-正弦波

  9 unsigned int Count=0;//計數(shù)器

  10 unsigned int Squ_Per=256;

  11 unsigned int Tri_Per=256;

  12 unsigned int Saw_Per=256;

  13 unsigned int Sin_Per=256;

  14 init();

  15 while(1)

  16 {

  17 while(Model==0)

  18 {

  19 Square_wave(Squ_Per,&Count);

  20 Count+=4;

  21 Squ_Per=Key_Plus(Squ_Per);

  22 Squ_Per=Key_Subc(Squ_Per);

  23 Model=Key_Model(Model,&Squ_Per,&Count);//每次退出當(dāng)前while時記得復(fù)原Period和Count的數(shù)據(jù)

  24 }

  25 while(Model==1)

  26 {

  27 Triangle_wave(Tri_Per,&Count);

  28 Count+=4;

  29 Tri_Per=Key_Plus(Tri_Per);

  30 Tri_Per=Key_Subc(Tri_Per);

  31 Model=Key_Model(Model,&Tri_Per,&Count);

  32 }

  33 while(Model==2)

  34 {

  35 Sawtooth_wave(Saw_Per,&Count);

  36 Count+=4;

  37 Saw_Per=Key_Plus(Saw_Per);

  38 Saw_Per=Key_Subc(Saw_Per);

  39 Model=Key_Model(Model,&Saw_Per,&Count);

  40 }

  41 while(Model==3)

  42 {

  43 Sin_wave(Sin_Per,&Count);

  44 Count+=4;

  45 Sin_Per=Key_Plus(Sin_Per);

  46 Sin_Per=Key_Subc(Sin_Per);

  47 Model=Key_Model(Model,&Sin_Per,&Count);

  48 }

  49 }

  50 return 0;

   }

  2init.c文件:

  1 #include "reg52.h"

  2 sbit CS_DAC=P1^5;//的片選端口

  3 sbit WR_DAC=P1^6;//的數(shù)據(jù)寫入端口

  4 extern void init(void)

  5 {

  6 P0=0xff;

  7 P1=0xff;

  8 P2=0xff;

  9 P3=0xff;

  10 CS_DAC=0;//一直片選中DAC0832,低電平有效啊~

  11 WR_DAC=0;//一直寫入數(shù)據(jù)到DAC0832

  12 }

  3single.c文件

  1 #include "reg52.h"

  2 #include "single.h"

  3 #include "delay.h"

  4 #define DATA P0

  5 void Square_wave(unsigned int Per,unsigned int *Count)

  6 {

  7 if(*Count>=Per) *Count=0;

  8 if(*Count

  9 {

  10 DATA=0x00;

  11 }

  12 else

  13 {

  14 DATA=0xFF;

  15 }

  16 }

  17 void Triangle_wave(unsigned int Per,unsigned int *Count)

  18 {

  19 if(*Count>=Per) *Count=0;

  20 if(*Count

  21 {

  22 DATA=*Count;

  23 }

  24 else

  25 {

  26 DATA=Per-*Count;

  27 }

  28 }

  29 void Sawtooth_wave(unsigned int Per,unsigned int *Count)

  30 {

  31 if(*Count>=Per) *Count=0;

  32 if(*Count

  33 {

  34 DATA=*Count;

  35 }

  36 }

  37 void Sin_wave(unsigned int Per,unsigned int *Count)

  38 {

  39 if(*Count>Per) *Count=0;

  40 if(*Count

  41 {

  42 DATA=*Count;

  43 }

  44 else if(*Count==Per/2)

  45 {

  46 delay(100);

  47 }

  48 else if(*Count

  49 {

  50 DATA=Per-*Count;

   }

  52 else if(*Count==Per)

  53 {

  54 delay(100);

  55 }

  56 }

  4Key.c文件:

  1 #include "Key.h"

  2 #include "delay.h"

  3 sbit key2=P3^3; //wave Change

  4 sbit key3=P3^4; //Fre plus

  5 sbit key4=P3^5; //Fre subc

  6 unsigned char Key_Model(unsigned char Model,unsigned int *Pre,unsigned int *Count)

  7 {

  8 if(key2==0)

  9 {

  10 delay(10);

  11 if(key2==0)

  12 {

  13 Model=Model+1;

  14 *Pre=256;

  15 *Count=0;

  16 }

  17 }

  18 while(key2==0);

  19 if(Model>3)

  20 {

  21 Model=0;

  22 }

  23 return Model;

  24 }

  25 unsigned int Key_Plus(unsigned int Per)

  26 {

  27 if(key3==0)

  28 {

  29 delay(10);

  30 if(key3==0)

  31 {

  32 Per=Per+8;

  33 }

  34 }

  35 while(key3==0);

  36 if(Per>256)

  37 {

  38 Per=0;

  39 }

  40 return Per;

  41 }

  42 unsigned int Key_Subc(unsigned int Per)

  43 {

  44 if(key4==0)

  45 {

  46 delay(10);

  47 if(key4==0)

  48 {

  49 Per=Per-8;

  50 }

   }

  52 while(key4==0);

  53 if(Per<0)

  54 {

  55 Per=256;

  56 }

  57 return Per;

  58 }

  5delay.c文件:

  1 void delay(unsigned int r)

  2 {

  3 unsigned int i,j;

  4 for(i=r;i>0;i--)

  5 for(j=110;j>0;j--);

  6 }

  Header文件(.h文件):

  1init.h文件:

  1 extern void init(void);

  2single.h文件:

  1 void Square_wave(unsigned int Per,unsigned int *Count);

  2 void Triangle_wave(unsigned int Per,unsigned int *Count);

  3 void Sawtooth_wave(unsigned int Per,unsigned int *Count);

  4 void Sin_wave(unsigned int Per,unsigned int *Count);

  3Key.h文件:

  1 #include "reg52.h"

  2 unsigned char Key_Model(unsigned char Model,unsigned int *Pre,unsigned int *Count);

  3 unsigned int Key_Plus(unsigned int Per);

  4 unsigned int Key_Subc(unsigned int Per);

  4delay.h文件:

  1 #include

  2 void delay(unsigned int r);

  3 #define NOP() _nop_()

  所用的工程文件我都已經(jīng)上傳嘍~,下面來看看仿真的結(jié)果:(大家在電路設(shè)計的時候可以進(jìn)行一下濾波處理,然后對信號進(jìn)行放大處理,這樣的話效果可能會更好點(diǎn)哦~)

  方波: 三角波: 鋸齒波: 梯形波:

  在這里要感謝GISPALAB實(shí)驗(yàn)室的各位老師和學(xué)長學(xué)姐的幫助!謝謝~

  大家注意下,電路有個小問題,由于本人的失誤,DAC0832的Iout1和Iout2的輸出接口的接法應(yīng)該按如下的接入方式:

  需要修改的地方有:

  1、電源改成雙電源

  2、Iout接口需要接地

 
       修改完畢之后的結(jié)果就會比較完美了,下面上傳一個三角波的波形  
 

  感謝GISPALAB實(shí)驗(yàn)室的老師和同學(xué)們的幫助和支持~



關(guān)鍵詞: DAC0832 51

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉