51单片机+DAC0832的信号发生器Proteus仿真设计(附仿真文件+Word文档+C程序
设计要求:
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资源如下:内容不全已经删除
赞 (0)