波形发生器:(1)基础功能:采用DAC实现输出至少三种波形(三角波、矩形波、正弦波);(2)发挥部分:按键控制输出波的频率和幅度。
时间: 2024-01-19 19:05:05 浏览: 23
好的,以下是一个基于DAC的51单片机波形发生器程序,可供参考:
```c
#include <reg51.h>
#define FREQ_MIN 100 // 最小频率
#define FREQ_MAX 10000 // 最大频率
#define AMP_MIN 0 // 最小幅度
#define AMP_MAX 255 // 最大幅度
unsigned char sine_table[] = {
128, 131, 134, 137, 140, 143, 146, 149,
152, 155, 158, 161, 165, 168, 171, 174,
177, 180, 183, 186, 189, 192, 195, 198,
201, 204, 207, 210, 213, 216, 218, 221,
224, 227, 230, 233, 236, 239, 241, 244,
247, 250, 252, 255, 257, 260, 263, 265,
268, 270, 273, 275, 277, 280, 282, 284,
287, 289, 291, 293, 295, 297, 299, 301,
303, 304, 306, 308, 309, 311, 312, 314,
315, 316, 318, 319, 320, 321, 322, 323,
324, 325, 326, 326, 327, 327, 327, 327,
327, 327, 327, 326, 326, 325, 324, 323,
322, 321, 320, 319, 318, 316, 315, 314,
312, 311, 309, 308, 306, 304, 303, 301,
299, 297, 295, 293, 291, 289, 287, 284,
282, 280, 277, 275, 273, 270, 268, 265,
263, 260, 257, 255, 252, 250, 247, 244,
241, 239, 236, 233, 230, 227, 224, 221,
218, 216, 213, 210, 207, 204, 201, 198,
195, 192, 189, 186, 183, 180, 177, 174,
171, 168, 165, 161, 158, 155, 152, 149,
146, 143, 140, 137, 134, 131, 128, 124,
121, 118, 115, 112, 109, 106, 103, 100,
97, 94, 91, 88, 85, 81, 78, 75,
72, 69, 66, 63, 60, 57, 54, 51,
48, 45, 42, 39, 37, 34, 31, 28,
25, 22, 19, 16, 13, 10, 8, 5,
2, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
2, 5, 8, 10, 13, 16, 19, 22,
25, 28, 31, 34, 37, 39, 42, 45,
48, 51, 54, 57, 60, 63, 66, 69,
72, 75, 78, 81, 85, 88, 91, 94,
97, 100, 103, 106, 109, 112, 115, 118,
121, 124
};
unsigned char saw_table[] = {
0, 6, 12, 18, 24, 30, 36, 42,
48, 54, 60, 66, 72, 78, 84, 90,
96, 102, 108, 114, 120, 126, 132, 138,
144, 150, 156, 162, 168, 174, 180, 186,
192, 198, 204, 210, 216, 222, 228, 234,
240, 246, 252, 0, 6, 12, 18, 24,
30, 36, 42, 48, 54, 60, 66, 72,
78, 84, 90, 96, 102, 108, 114, 120,
126, 132, 138, 144, 150, 156, 162, 168,
174, 180, 186, 192, 198, 204, 210, 216,
222, 228, 234, 240, 246, 252, 0, 6,
12, 18, 24, 30, 36, 42, 48, 54,
60, 66, 72, 78, 84, 90, 96, 102,
108, 114, 120, 126, 132, 138, 144, 150,
156, 162, 168, 174, 180, 186, 192, 198,
204, 210, 216, 222, 228, 234, 240, 246,
252, 0, 6, 12, 18, 24, 30, 36,
42, 48, 54, 60, 66, 72, 78, 84,
90, 96, 102, 108, 114, 120, 126, 132,
138, 144, 150, 156, 162, 168, 174, 180,
186, 192, 198, 204, 210, 216, 222, 228,
234, 240, 246, 252
};
unsigned char square_table[] = {
0, 0, 0, 0, 0, 0, 0, 0,
255, 255, 255, 255, 255, 255, 255, 255
};
unsigned int freq = 1000; // 波形频率
unsigned char amp = 127; // 波形幅度
unsigned char wave_type = 0; // 波形类型:0-正弦波,1-三角波,2-矩形波
void delay() {
unsigned int i = 10000;
while (i--);
}
void dac_out(unsigned char val) {
P0 = val;
}
void main() {
unsigned char i = 0; // 波形数据计数器
unsigned char j = 0; // 按键扫描计数器
unsigned char k = 0; // 波形类型计数器
unsigned char key = 0; // 按键状态
TMOD = 0x01; // 定时器0工作在模式1
TH0 = 0 - (freq / 1000000.0 * 12 / 2); // 定时器0初始值
TL0 = TH0; // 定时器0初始值
TR0 = 1; // 启动定时器0
while (1) {
if (TF0) { // 定时器0溢出中断
TF0 = 0; // 清除