注:获取全套设计资源,请见文末说明…
设计要求
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的三角波输出信号
部分程序
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绘制的流程图
资源截图
资源获取方法
资源获取方法
资源获取方法
重要的事情说三遍!!!!!!!!!!!
由于本设计为作者原创设计,
获取完整的Word论文报告、Proteus仿真、Keil C程序、Visio流程图文件和技术手册等资料。请搜索关注我的公众号:交院小智