| 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 单片机与信号处理的教学意义,也能在工程调试与小型实验中作为实用信号源使用。
 ————————————————
 版权声明:本文为CSDN博主「清风666666」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
 原文链接:https://blog.csdn.net/xuezhang666666/article/details/150696198
 
 
 |