最近幫別人設計一個畢業設計,作一個多種信號發生器(四種波形:方波、三角波、鋸齒波、梯形波),如今貼上來給你們參考,若是有錯誤的地方,望指出~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接口須要接地
修改完畢以後的結果就會比較完美了,下面上傳一個三角波的波形