[经验分享] 基于51单片机的信号发生器函数发生器设计

[复制链接]
1672|2
Jiangxiaopi 发表于 2025-9-8 18:44 | 显示全部楼层 |阅读模式
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

彩虹捕手 发表于 2025-9-10 16:07 | 显示全部楼层
系统的频率调节范围是多少?是否支持更细粒度的调节?
懒癌晚期患者 发表于 2025-9-29 11:13 | 显示全部楼层
这个信号发生器的频率调节范围是多少?能否满足高频信号的需求?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

61

主题

250

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部