|
設計要求:
1.輸出4種波形:方波、鋸齒波、三角波、正弦波;
2.幅值可調節范圍為2V~10V;
3.頻率可調節范圍為20Hz~80Hz;
設計思路:
通過Keil平臺下的C語言編程,單片機控制輸出的數字信號經工作在直通方式下的DAC0832數模轉換,輸出方波、正弦波、鋸齒波、三角波4種電壓波形,且波形幅值、頻率可調。波形的切換、頻率和幅值的增減可通過按鍵模塊實現,同時當前的波形信息可實時更新在LCD12864顯示模塊上,波形形象可通過示波器測量模塊展現。整個設計由Proteus仿真實現,并能滿足設計內容及要求。
程序思路:
仿真結果:
1.幅值為4V,頻率為20Hz的方波輸出信號
2.幅值為5V,頻率為50Hz的鋸齒波輸出信號
3.幅值為6V,頻率為60Hz的三角波輸出信號
4.幅值為10V,頻率為80Hz的正弦波輸出信號
由以上四圖看出,信號發生器仿真設計結果滿足設計要求,LCD液晶顯示的波形信息與示波器上的波形一一對應。
程序代碼:
- intmain(void)
- {
- uchar data i=0;
- uchar idata strtemp[35];
- SP=0xA0;
- for(i=0; i<7; i++)
- {
- //從20Hz開始,到80Hz,步長為10Hz,共7個頻率數據,最高只能做到80Hz,同時由于啟動中斷會占用一定時間,所以補償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;
- }
復制代碼
word資源如下:內容不全已經刪除
|
評分
-
查看全部評分
|