基于51单片机的信号发生器函数发生器设计

1 系统功能介绍

本设计的题目是 基于 51 单片机的信号发生器函数发生器设计。在电子实验、测量、信号处理与教学中,信号发生器是一类常用的仪器,它能够输出具有特定波形、幅度与频率的电信号。传统信号发生器多采用模拟电路实现,而本设计通过 AT89S52 单片机 + DAC0832 数模转换器 + 运算放大器 的组合方式,实现了可编程、可调节的数字化函数信号发生器。

该系统主要功能包括:

  1. 多波形输出:可产生 正弦波、方波、三角波、锯齿波 等常见信号波形。
  2. 频率可调:通过单片机程序控制定时器和波形数据输出的速率,实现信号频率的调节。
  3. 幅度调节:借助运算放大器电路和电位器调节,实现输出信号幅度的调节。
  4. 稳定性高:数字控制方式有效避免传统模拟电路中的漂移与失真问题。
  5. 扩展性强:通过修改程序,可方便地增加新的波形,或将波形参数存储于单片机内存中。

本系统不仅可作为实验室基础教学的信号源,还能在中小型测试与调试场景中使用,具有良好的实用价值与推广意义。


2 系统电路设计

系统电路主要由 单片机控制电路、数模转换电路(DAC0832)、运算放大器电路、按键与调节电路、电源电路 等部分组成。


2.1 单片机核心电路

  • 本设计采用 AT89S52 单片机,它是一款兼容 MCS-51 指令系统的单片机,内置 8KB Flash 程序存储器,具有丰富的 I/O 资源。

  • 单片机的主要任务是:

    1. 根据程序中的查找表输出正弦、三角等波形数据。
    2. 通过定时器控制数据更新速率,从而调节信号的频率。
    3. 接收按键输入,进行模式切换(波形选择)与参数调整(频率、幅度)。
  • 单片机通过并行口向 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 + 运放 的组合方式实现了数字化信号合成。系统能够产生 正弦波、方波、三角波、锯齿波 四种常见波形,用户可通过按键调节频率和波形,输出信号稳定可靠。

本设计的优势在于:

  1. 数字化控制,易于扩展和修改波形。
  2. 成本低廉,适合教学和实验室应用。
  3. 功能实用,具备多波形输出与频率调节能力。
  4. 可扩展性强,未来可增加 LCD 显示界面,或通过串口与上位机通信,实现更高级的控制与显示功能。

该设计不仅具有学习 51 单片机与信号处理的教学意义,也能在工程调试与小型实验中作为实用信号源使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值