DAC0832的波形訊號發生器Proteus模擬設計,正弦波、三角波、方波和鋸齒波
設計要求
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 幅值為6V,頻率為60Hz的三角波輸出訊號
圖4 幅值為10V,頻率為80Hz的正弦波輸出訊號
部分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的訊號發生器設計論文完整版;
(2)Proteus模擬檔案
(3)Keil C語言程式檔案
(4)DAC0832 技術手冊
(5)Visio繪製的流程圖
資源截圖
由於本設計為作者原創設計,
獲取完整的論文、Proteus模擬、Keil C程式、Visio流程圖檔案和技術手冊等資料。
請搜尋關注公眾號(公眾號請見頭像處或個人簡介,謝謝!)