1 系统功能介绍
本设计的题目是 基于 51 单片机的信号发生器函数发生器设计。在电子实验、测量、信号处理与教学中,信号发生器是一类常用的仪器,它能够输出具有特定波形、幅度与频率的电信号。传统信号发生器多采用模拟电路实现,而本设计通过 AT89S52 单片机 + DAC0832 数模转换器 + 运算放大器 的组合方式,实现了可编程、可调节的数字化函数信号发生器。
该系统主要功能包括:
- 多波形输出:可产生 正弦波、方波、三角波、锯齿波 等常见信号波形。
- 频率可调:通过单片机程序控制定时器和波形数据输出的速率,实现信号频率的调节。
- 幅度调节:借助运算放大器电路和电位器调节,实现输出信号幅度的调节。
- 稳定性高:数字控制方式有效避免传统模拟电路中的漂移与失真问题。
- 扩展性强:通过修改程序,可方便地增加新的波形,或将波形参数存储于单片机内存中。
本系统不仅可作为实验室基础教学的信号源,还能在中小型测试与调试场景中使用,具有良好的实用价值与推广意义。
2 系统电路设计
系统电路主要由 单片机控制电路、数模转换电路(DAC0832)、运算放大器电路、按键与调节电路、电源电路 等部分组成。
2.1 单片机核心电路
-
本设计采用 AT89S52 单片机,它是一款兼容 MCS-51 指令系统的单片机,内置 8KB Flash 程序存储器,具有丰富的 I/O 资源。
-
单片机的主要任务是:
- 根据程序中的查找表输出正弦、三角等波形数据。
- 通过定时器控制数据更新速率,从而调节信号的频率。
- 接收按键输入,进行模式切换(波形选择)与参数调整(频率、幅度)。
-
单片机通过并行口向 DAC0832 发送 8 位数字量,实现模拟波形输出。
2.2 数模转换器 DAC0832 电路
- DAC0832 是一款常用的 8 位数模转换芯片,具有并行输入接口,可直接与单片机的 I/O 口相连。
- DAC0832 将单片机输出的数字信号转换为相应的模拟电压信号,形成波形的原始模拟版本。
- DAC0832 的输出电流信号经过电阻转换为电压,作为运算放大器的输入端。
- 通过 DAC 的快速转换能力,可以保证信号在较高频率下的稳定输出。
2.3 运算放大器电路
- DAC0832 输出的电压范围有限,且驱动能力不足,因此需要运算放大器进行缓冲与放大。
- 运放采用常见的 LM324 或 OP07,构成电压跟随器与放大电路。
- 电位器调节运放的放大倍数,从而实现 输出信号幅度可调。
- 运放输出端接负载(如示波器或实验电路),保证信号具备足够的驱动能力与稳定性。
2.4 按键与调节电路
-
系统设计了若干个按键:
- 按键 1:切换波形(正弦 → 方波 → 三角波 → 锯齿波 → 循环)。
- 按键 2:增加频率。
- 按键 3:降低频率。
-
按键通过上拉电阻与单片机 P3 口连接,程序内通过扫描实现检测,并加入软件延时去抖动处理。
2.5 电源电路
- 系统采用 +5V 稳压电源,供给 AT89S52 单片机与 DAC0832。
- 运算放大器部分根据型号不同,可能需要 ±12V 双电源供电。
- 电源部分增加退耦电容,保证电路稳定,减少纹波与干扰。
3 程序设计
程序部分是本设计的核心,通过 查表法 与 定时器控制 来输出标准波形。整体程序分为 主程序、定时器中断服务程序、波形查表程序、按键扫描程序、DAC 输出程序 等模块。
3.1 主程序框架
#include <reg52.h>
#include "dac0832.h"
#include "key.h"
#include "wave.h"
unsigned char waveType = 0; // 0-正弦 1-方波 2-三角 3-锯齿
unsigned int freq = 1000; // 初始频率
void main(void)
{
Timer0_Init(); // 初始化定时器
DAC_Init(); // 初始化 DAC0832
Key_Init(); // 按键初始化
EA = 1; // 开总中断
ET0 = 1; // 开定时器中断
while(1)
{
Key_Scan(); // 扫描按键,改变波形或频率
}
}
3.2 定时器中断服务程序
unsigned char index = 0;
void Timer0_ISR(void) interrupt 1
{
TH0 = (65536 - freq) / 256; // 重装定时器高位
TL0 = (65536 - freq) % 256; // 重装定时器低位
switch(waveType)
{
case 0: DAC_Output(Sin_Table[index]); break;
case 1: DAC_Output(Square_Table[index]); break;
case 2: DAC_Output(Triangle_Table[index]); break;
case 3: DAC_Output(Saw_Table[index]); break;
}
index++;
if(index >= 64) index = 0; // 查表循环
}
3.3 波形查找表程序
code unsigned char Sin_Table[64] = {
128,140,153,165,177,188,198,206,
213,218,222,224,225,224,222,218,
213,206,198,188,177,165,153,140,
128,115,102, 90, 78, 67, 57, 49,
42, 37, 33, 31, 30, 31, 33, 37,
42, 49, 57, 67, 78, 90,102,115
};
code unsigned char Square_Table[64] = {
255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
code unsigned char Triangle_Table[64] = {
0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,
128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,
248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,
120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0
};
code unsigned char Saw_Table[64] = {
0,4,8,12,16,20,24,28,32,36,40,44,48,52,56,60,
64,68,72,76,80,84,88,92,96,100,104,108,112,116,120,124,
128,132,136,140,144,148,152,156,160,164,168,172,176,180,184,188,
192,196,200,204,208,212,216,220,224,228,232,236,240,244,248,252
};
3.4 按键扫描程序
void Key_Scan(void)
{
if(KEY1 == 0) // 切换波形
{
Delay_ms(20);
if(KEY1 == 0)
{
waveType++;
if(waveType > 3) waveType = 0;
}
while(!KEY1); // 松手检测
}
if(KEY2 == 0) // 增加频率
{
Delay_ms(20);
if(KEY2 == 0)
{
if(freq > 200) freq -= 50;
}
while(!KEY2);
}
if(KEY3 == 0) // 降低频率
{
Delay_ms(20);
if(KEY3 == 0)
{
if(freq < 5000) freq += 50;
}
while(!KEY3);
}
}
3.5 DAC 输出程序
void DAC_Output(unsigned char value)
{
P1 = value; // P1口接DAC0832
WR = 0;
WR = 1;
}
4 总结
本文设计了一款 基于 51 单片机的信号发生器函数发生器,通过 AT89S52 + DAC0832 + 运放 的组合方式实现了数字化信号合成。系统能够产生 正弦波、方波、三角波、锯齿波 四种常见波形,用户可通过按键调节频率和波形,输出信号稳定可靠。
本设计的优势在于:
- 数字化控制,易于扩展和修改波形。
- 成本低廉,适合教学和实验室应用。
- 功能实用,具备多波形输出与频率调节能力。
- 可扩展性强,未来可增加 LCD 显示界面,或通过串口与上位机通信,实现更高级的控制与显示功能。
该设计不仅具有学习 51 单片机与信号处理的教学意义,也能在工程调试与小型实验中作为实用信号源使用。