基於51單片機+DAC0832的信號發生器

最近幫別人設計一個畢業設計,作一個多種信號發生器(四種波形:方波、三角波、鋸齒波、梯形波),如今貼上來給你們參考,若是有錯誤的地方,望指出~spa

下面先貼上仿真的電路圖(仿真的軟件是Protuse,上傳一個大點的圖,方便你們看的清楚點):設計

原件清單:STC89C52單片機X一、DAC0832轉換器X一、12M晶振X一、電容22pfX二、10uf的電容X一、1nf陶瓷電容X一、獨立按鍵X四、10千歐排阻X一、10KΩ電阻X五、LM358                 單電源運放X1。仿真就須要這些原件,具體的硬件設計你們定好了在製做~code

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

Source文件(.c文件):接口

1\main.c文件:it

 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;//計數器
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);//每次退出當前while時記得復原Period和Count的數據
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;
51 }

2\init.c文件:io

 1 #include "reg52.h"
 2 sbit CS_DAC=P1^5;//DAC0832的片選端口
 3 sbit WR_DAC=P1^6;//DAC0832的數據寫入端口
 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;//一直寫入數據到DAC0832
12 }

3\single.c文件class

 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<Per/2)
 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<Per/2)
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<Per)
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<Per/2)
41     {
42         DATA=*Count;
43     }    
44     else if(*Count==Per/2)
45     {
46         delay(100);    
47     }
48     else if(*Count<Per)
49     {
50         DATA=Per-*Count;
51     }    
52     else if(*Count==Per)
53     {
54         delay(100);
55     }
56 }

4\Key.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         }
51     }
52     while(key4==0);
53     if(Per<0)
54     {
55         Per=256;
56     }
57     return Per;        
58 }

5\delay.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文件):

1\init.h文件:

1 extern void init(void);

2\single.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);

3\Key.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);

4\delay.h文件:

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

所用的工程文件我都已經上傳嘍~,下面來看看仿真的結果:(你們在電路設計的時候能夠進行一下濾波處理,而後對信號進行放大處理,這樣的話效果可能會更好點哦~)

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

你們轉載請註明出處!謝謝!

在這裏要感謝GISPALAB實驗室的各位老師和學長學姐的幫助!謝謝~

 

你們注意下,電路有個小問題,因爲本人的失誤,DAC0832的Iout1和Iout2的輸出接口的接法應該按以下的接入方式:

須要修改的地方有:

一、電源改爲雙電源

二、Iout接口須要接地

修改完畢以後的結果就會比較完美了,下面上傳一個三角波的波形

相關文章
相關標籤/搜索