|
設(shè)計(jì)要求:
1.輸出4種波形:方波、鋸齒波、三角波、正弦波;
2.幅值可調(diào)節(jié)范圍為2V~10V;
3.頻率可調(diào)節(jié)范圍為20Hz~80Hz;
設(shè)計(jì)思路:
通過(guò)Keil平臺(tái)下的C語(yǔ)言編程,單片機(jī)控制輸出的數(shù)字信號(hào)經(jīng)工作在直通方式下的DAC0832數(shù)模轉(zhuǎn)換,輸出方波、正弦波、鋸齒波、三角波4種電壓波形,且波形幅值、頻率可調(diào)。波形的切換、頻率和幅值的增減可通過(guò)按鍵模塊實(shí)現(xiàn),同時(shí)當(dāng)前的波形信息可實(shí)時(shí)更新在LCD12864顯示模塊上,波形形象可通過(guò)示波器測(cè)量模塊展現(xiàn)。整個(gè)設(shè)計(jì)由Proteus仿真實(shí)現(xiàn),并能滿足設(shè)計(jì)內(nèi)容及要求。
程序思路:
51hei截圖20190807122921.jpg (22.46 KB, 下載次數(shù): 72)
下載附件
2019-8-7 12:30 上傳
仿真結(jié)果:
1.幅值為4V,頻率為20Hz的方波輸出信號(hào)
10.jpg (42.19 KB, 下載次數(shù): 60)
下載附件
2019-8-7 12:32 上傳
11.png (112.65 KB, 下載次數(shù): 67)
下載附件
2019-8-7 12:32 上傳
2.幅值為5V,頻率為50Hz的鋸齒波輸出信號(hào)
12.png (11.67 KB, 下載次數(shù): 69)
下載附件
2019-8-7 12:34 上傳
13.png (122.67 KB, 下載次數(shù): 66)
下載附件
2019-8-7 12:34 上傳
3.幅值為6V,頻率為60Hz的三角波輸出信號(hào)
15.png (10.02 KB, 下載次數(shù): 67)
下載附件
2019-8-7 12:35 上傳
16.png (125.19 KB, 下載次數(shù): 75)
下載附件
2019-8-7 12:36 上傳
4.幅值為10V,頻率為80Hz的正弦波輸出信號(hào)
17.png (10.6 KB, 下載次數(shù): 58)
下載附件
2019-8-7 12:37 上傳
18.png (122.93 KB, 下載次數(shù): 65)
下載附件
2019-8-7 12:38 上傳
由以上四圖看出,信號(hào)發(fā)生器仿真設(shè)計(jì)結(jié)果滿足設(shè)計(jì)要求,LCD液晶顯示的波形信息與示波器上的波形一一對(duì)應(yīng)。
程序代碼:
- intmain(void)
- {
- uchar data i=0;
- uchar idata strtemp[35];
- SP=0xA0;
- for(i=0; i<7; i++)
- {
- //從20Hz開(kāi)始,到80Hz,步長(zhǎng)為10Hz,共7個(gè)頻率數(shù)據(jù),最高只能做到80Hz,同時(shí)由于啟動(dòng)中斷會(huì)占用一定時(shí)間,所以補(bǔ)償25us。
- freq=65535-(1000000/(20+i*10)/256)+25;
- }
- TMOD=0x11;
- ET0=1;
- ET1=0;
- EA=1;
- TL0=freq[index_freq]%256;
- TH0=freq[index_freq]/256;
- TR0=1;
- IT0=0;
- EX0=1;
- LE1=0;
- P2=amplitude[index_amp];
- EA=0;
- LE1=1;
- LCDinit12864();
- LCD_DispStrWide(0x00,"波形:1方波");
- LCD_DispStrWide(0x10,"頻率:20Hz");
- LCD_DispStrWide(0x08,"幅值:2.0V");
- LCD_DispStrWide(0x18,"波形 頻率 +-");
- LE1=0;
- EA=1;
- while(1)
- {
- if(K_WAVE==1)
- {
- K_WAVE=0;
- C_WAVE++;
- if(C_WAVE>=4) C_WAVE=0; //0:方波1:鋸齒波 2:三角波3:正弦波
- sprintf(strtemp,"%s%s","波形:",disp_wave[C_WAVE]);
- LE1=1;
- EA=0;
- LCD_DispStrWide(0x00,strtemp);
- EA=1;
- LE1=0;
- }
- else if(K_FREQ_AMP==1)
- {
- K_FREQ_AMP=0;
- C_FREQ_AMP++;
- if(C_FREQ_AMP >= 2) C_FREQ_AMP=0;
- LE1=1;
- EA=0;
- if(C_FREQ_AMP == 0)
- LCD_DispStrWide(0x18,"波形 頻率 +-"); //0:頻率
- else
- LCD_DispStrWide(0x18,"波形 幅值 +-"); //1:幅值
- EA=1;
- LE1=0;
- }
- else if(K_ADD == 1)
- {
- K_ADD=0;
- if(C_FREQ_AMP == 0)
- {//在7種頻率之間切換 20Hz,30Hz,40Hz,50Hz,60Hz,70Hz,80Hz
- index_freq++;
- if(index_freq>=7) index_freq=0;
- sprintf(strtemp,"%s%d%s","頻率:",(int)(20+index_freq*10),"Hz");
- LE1=1;
- EA=0;
- LCD_DispStrWide(0x10,strtemp);
- EA=1;
- LE1=0;
- }
- else
- {
- //在9種幅值之間切換 1V,2V,3V,4V,5V,6V,7V,8V,9V,10V
- index_amp++;
- if(index_amp > 8) index_amp=0;
- sprintf(strtemp,"%s%.1f%s","幅值:",(float)(1+index_amp*0.5)*2,"V ");
- LE1=1;
- EA=0;
- LCD_DispStrWide(0x08,strtemp);
- LCD_DispStrWide(0x10,"頻");
- EA=1;
- LE1=0;
- P2=amplitude[index_amp];
- }
- }
- else if(K_REDUCE==1)
- {
- K_REDUCE=0;
- if(C_FREQ_AMP == 0)
- {
- if(index_freq > 0)
- index_freq--;
- sprintf(strtemp,"%s%d%s","頻率:",(int)(20+index_freq*10),"Hz");
- LE1=1;
- EA=0;
- LCD_DispStrWide(0x10,strtemp);
- EA=1;
- LE1=0;
- }
- else
- {
- if(index_amp > 0)
- index_amp--;
- sprintf(strtemp,"%s%.1f%s","幅值:",(float)(1+index_amp*0.5)*2,"V ");
- LE1=1;
- EA=0;
- LCD_DispStrWide(0x08,strtemp);
- LCD_DispStrWide(0x10,"頻");
- EA=1;
- LE1=0;
- P2=amplitude[index_amp];
- }
- }
- } return 0;
- }
復(fù)制代碼
word資源如下:內(nèi)容不全已經(jīng)刪除
|
評(píng)分
-
查看全部評(píng)分
|