信號發生器的設計(期末課程設計)


題目:信號發生器的設計

設計一個信號源,可以輸出三種波形(正弦波,方波,三角波),通過按鍵可以改變輸出波形,也可以改變波形的頻率,並且頻率可以通過數碼管顯示出來(頻率顯示到個位,大概正確就好,不用太准確)。

1、實現正弦波的輸出,並且能夠改變頻率,5

(1)實現正弦波的輸出,2分

(2)能夠改變頻率,1分

(3)能夠顯示頻率,2分

2、實現方波的輸出,並且能夠改變頻率,5

(1)實現方波的輸出,2分

(2)能夠改變頻率,1分

(3)能夠顯示頻率,2分

3、實現三角波的輸出,並且能夠改變頻率,5

(1)實現三角波的輸出,2分

(2)能夠改變頻率,1分

(3)能夠顯示頻率,2分

提問環節:教師提問有關信號源的3個問題,根據學生回答情況給分,每個問題5,滿分15

使用的單片機:

注意事項:

1.頻率只顯示到個位,所以在周期 t上做了一些限制(見代碼注釋)。
2.按按鈕時,按下要停一段時間(等待一個周期走完),按鈕才會起作用。

參考代碼:

說明:次程序用單片機上的LED燈來模擬波的輸出。

     K1:切換輸出波
     K2:頻率降低
     K3:頻率提高
     默認頻率:方波f1=5, 三角波f2=1, sin正弦波f3=1

代碼注釋寫的比較細,便於大家理解,但是老師會考的很簡單,不會針對某一語句問你問題的。比如會問你dispFre()那一塊的代碼是實現什么功能的, 頻率計算公式為什么這樣寫等等。

  1 //hill20200709
  2 #include<reg52.h> //頭文件
  3 #include<intrins.h> //左右移函數頭文件
  4 #define uchar unsigned char  //宏定義變量,相當於起個別名
  5 #define uint unsigned int
  6 
  7 //按鍵聲明
  8 sbit K1=P3^4; 
  9 sbit K2=P3^5; 
 10 sbit K3=P3^6;  
 11 
 12 //3種波的周期t
 13 int t1=100; //單位為ms
 14 int t2=2;
 15 int t3=2;
 16 
 17 //數碼管顯示時需要的數組,數組元素對應顯示的狀態
 18 uchar code table[]={
 19 0x3f,0x06,0x5b,0x4f,
 20 0x66,0x6d,0x7d,0x07,
 21 0x7f,0x6f,0x77,0x7c,
 22 0x39,0x5e,0x79,0x71};
 23 
 24 //數碼管顯示時需要的位聲明
 25 sbit DU =P2^6;
 26 sbit WE =P2^7; 
 27 
 28 //形成sin的波形用到的數組
 29 uchar code tosin[256]=
 30 {0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5 ,
 31     0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5 ,
 32     0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd ,
 33     0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda ,
 34     0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99 ,
 35     0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51 ,
 36     0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16 ,
 37     0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00 ,
 38     0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02 ,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15 ,
 39     0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e , 
 40   0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66 ,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80 }; 
 41 
 42 char n;
 43 
 44 //延時函數
 45 void delayms(uint ms)    
 46 {
 47     uint k,l;
 48     for(k=ms;k;k--)    
 49         for(l=110;l;l--);    //約1ms
 50 }
 51 
 52 //顯示頻率函數 (很重要)
 53 void dispFre(uint flag){ //參數flag判斷是哪種波形
 54 
 55     int f,num;
 56 
 57     if(flag==0){ //flag=0判斷是方波
 58         f=1000/((2*t1)); //頻率計算公式(自動類型轉化為整型)
 59     }
 60     else if(flag==1){//flag=1判斷是三角波
 61         f=1000/(400*t2); //頻率計算公式
 62     }
 63     else{//flag=2(其他) 判斷是正弦波
 64         f=1000/(256*t3); //頻率計算公式
 65     }
 66 
 67     num=f%10; //只要個位
 68 
 69     DU=1;
 70     P0=table[num]; 
 71     DU=0;
 72     WE=1;      
 73     P0=0xdf;      //1101 1111  只要第6個數碼管亮
 74     WE=0;
 75     delayms(2);//延時函數
 76 }
 77 
 78 
 79 void square() //方波
 80 {
 81         P1=0; //LED全滅
 82         delayms(t1);//延時函數
 83 
 84         P1=255; //LED全亮
 85         delayms(t1);//延時函數
 86 }
 87 
 88 void triangle() //三角波
 89 {
 90     int a,x,y;
 91     for(x=200;x;x--)
 92     {
 93         a++;
 94         delayms(t2); //200個循環,每個循環a加一
 95         P1=a;
 96     }
 97     for(y=200;y;y--)
 98     {        
 99         a--;
100         delayms(t2); //200個循環,每個循環a減一
101         P1=a;
102     }
103 }
104 
105 void sin() //正弦波
106 {
107     int i;
108     for(i=0;i<=255;i++)
109     {
110         P1=tosin[i];  //調用數組,形成sin的波形
111         delayms(t3);
112     }
113 }
114 
115 void key_switch() //定義切換波形的按鍵函數
116 {
117     if(K1==0) //定義負責K1的函數
118     {
119         delayms(10); //防抖,下面同理
120         if(K1==0){
121             n++;
122             if(n==3){
123                 n=0;
124             }
125             while(!K1); //K1按下去了就一直運行空循環
126         }
127     }    
128 }
129 void key_plus(){ //定義負責K2的函數實現周期t加,f減
130     if(K2==0){
131         delayms(10);
132         if(t1<520){      //t1=500時,f=1; 等於520時f=0
133             t1=t1+20;
134         }
135         else{     //f減到0時,自動復位到初始的5
136             t1=100;
137         }
138         if(t2<3){ //t2加到3時 f=0
139             t2++;
140         }
141         else{
142             t2=2;
143         }
144         if(t3<4){ //t3加到4時 f=0
145             t3++;
146         }
147         else{
148             t3=2;
149         }
150         while(!K2);
151     }
152 }
153 void key_minus(){ //定義負責K3的函數實現周期t減,f加
154     if(K3==0){ //時間出現負數的時候程序會卡死,且數碼管就1位,所以要對t限制
155         delayms(10);
156         if(t1>60){      //t1=60時,f=8; 等於40時f=12
157             t1=t1-20;
158         }
159         else{     //f加到8時,自動復位到5
160             t1=100;
161         }
162         if(t2>0){ //t2
163             t2--;
164         }
165         else{
166             t2=2;
167         }
168         if(t3>0){ //t3
169             t3--;
170         }
171         else{
172             t3=2;
173         }
174         while(!K3);
175     }
176         
177 }
178 
179 void main()
180 {
181 
182     while(1)
183     {
184         key_switch();//實現切換波形的函數
185         key_plus(); //實現周期增加、頻率減小的函數
186         key_minus(); //實現周期減小、頻率增加的函數
187         dispFre(n); //顯示頻率到數碼管
188         
189         //下面的代碼(非常重要)實現判斷需要輸出那種波形
190         if(n==0){
191             square(); //方波
192         }
193         else if(n==1){
194             triangle(); //三角波
195             
196         }
197         else{
198             sin(); //正弦波
199             
200         }
201 
202         
203     }
204 }

 三種波及頻率計算(原理結合代碼)

本人單片機初學者,多多關照!文章內容肯定有不當之處,敬請指出改正。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM