DAC0832的多功能信号/波形发生器Proteus仿真设计,4种波形(正弦、三角、方波、锯齿),附仿真+C程序+论文等

注:获取全套设计资源,请见文末说明…
设计要求
1.输出4种波形:方波、锯齿波、三角波和正弦波;
2.幅值调节范围为:2V-10V;
3.频率调节范围为:20Hz-80Hz;

内容简介
信号发生器仿真系统由51单片机最小系统、LCD12864液晶模块、DAC0832波形转换模块(包括波形幅值与频率转换)、按键控制模块以及示波器测量模块构成。通过Keil平台下的C语言编程,单片机控制输出的数字信号经工作在直通方式下的DAC0832数模转换,输出方波、正弦波、锯齿波、三角波4种电压波形,且波形幅值、频率可调。波形的切换、频率和幅值的增减可通过按键模块实现,同时当前的波形信息可实时更新在LCD12864显示模块上,波形形象可通过示波器测量模块展现。整个设计由Proteus仿真实现,并能满足设计内容及要求。

本设计内容详细,涵盖 单片机最小系统设计原理、按键与LCD12864液晶设计、DAC0832幅值控制电路、频率控制电路设计、频率控制算法原理、仿真结果分析 等内容。

整体的框架
在这里插入图片描述
系统仿真电路图
在这里插入图片描述
仿真运行分析
图1:幅值为4V,频率为20Hz的方波输出信号
在这里插入图片描述
在这里插入图片描述
图2 幅值为5V,频率为50Hz的锯齿波输出信号
在这里插入图片描述
在这里插入图片描述
图3 幅值为10V,频率为80Hz的正弦波输出信号
在这里插入图片描述
在这里插入图片描述
图4 幅值为6V,频率为60Hz的三角波输出信号
在这里插入图片描述
在这里插入图片描述
部分程序


```c
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[i]=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;
 }

分享内容
(1)基于51单片机与DAC0832的信号发生器Proteus仿真设计【完整版文档】
(2)Proteus仿真文件
(3)Keil C语言程序文件
(4)DAC0832 技术手册
(5)Visio绘制的流程图

资源截图
在这里插入图片描述
在这里插入图片描述
KEIL C程序
在这里插入图片描述
在这里插入图片描述
资源获取方法
资源获取方法
资源获取方法
重要的事情说三遍!!!!!!!!!!!
由于本设计为作者原创设计,
获取完整的Word论文报告、Proteus仿真、Keil C程序、Visio流程图文件和技术手册等资料。
请微信搜索关注公众号:交大小智

猜你喜欢

转载自blog.csdn.net/JiaoDaBoy/article/details/103092890