• 51单片机 | 使用D/A转换器实现三角波发生器


    ————————————————————————————————————————————

    D/A转换器

    • CS=0ILE=1时,WR1信号有效时将数据总线上的信号写入8位输入锁存器
    • XFER=0时,WR2信号有效时将输入寄存器的数据转移到8DAC寄存器中,输出量随之改变

    工作方式:

    • 直通工作方式(如下实验)
      • 当某一根地线或地址译码器的输出线使CS有效(低电平),ILE高电平,同时WR1/XFER/WR2为低电平时,单片机数据线上的数据字节直通D/A转换器,被转换并输出
      • CSWR1接引脚,通过软件置低电平
      • VCCVREFILEPOWER
      • WR2XFERRFBGND*2GND
    • 单缓冲方式
      • 仅适用于只有一路模拟量输出或几路模拟量输出但并不要求同步的系统
      • ILEVCCPOWER
      • CSXFER接单片机引脚,输入寄存器和DAC寄存器地址都是7FFFH
      • WR1WR2接单片机WR引脚,单片机写信号
      • 当单片机对DAC0832执行一次写操作,则把一个字节数据直接写入DAC寄存器中,输出的模拟量随之变化

    • 双缓冲方式
      • 当多路D/A转换接口要求同步进行D/A转换输出时必须采用双缓冲方式。DAC0832数字量的输入锁存和D/A转换输出时分两步完成的。即CPU的数据总线分时输出数字量并锁存在各D/A转换器的输入寄存器中;然后CPU对所有D/A转换器发出控制信号,各输入寄存器→DAC寄存器,实现同步转换输出。
      • 每一路模拟输出量需要一片DAC0832
      • DAC08321)的输出锁存器地址0DFFFH

        DAC08322)的输出锁存器地址0BFFFH

        两个DAC0832DAC寄存器地址同为7FFFH

    ————————————————————————————————————————————

    基于DAC0832的三角波发生器实验

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    实验说明:

    • 用DAC0832芯片制作一个信号发生器,输出一个三角波信号
    • 采用直通工作方式

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    接线说明:

    DAC0832

    DI0-DI7

    89C51

    P0.0-P0.7

    8位数据输入输出

      

    CS

      

    P3.7/RD

    输入寄存器选择信号

      

    WR1

      

    P3.6/WR

    输入寄存器写选通信号

      

    WR2/XFER/GND*2/

    其他

    GND

    WR2XFER始终低电平

      

    VREF/VCC/ILE

      

    POWER

    ILE始终允许锁存

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

    实现代码:

     1 #include <reg52.h>
     2 typedef unsigned char uchar;
     3 typedef unsigned int uint;
     4 sbit cs = P3 ^ 7;
     5 sbit wr = P3 ^ 6;
     6 void Delay(uchar m)
     7 {
     8     while(m--);
     9 }
    10 void main()
    11 {
    12     uchar k = 0; //设置k的初始值为0
    13     cs = 0; //当CS与WR1端置低电平时做好写数据的准备,只要P0口有数据输出,DAC0832将会转换成模拟信号
    14     wr = 0;
    15     while(1) //通过输出值在 0-255和255-0之间变化,通过示波器可以看到模拟信号的情况
    16     {
    17         while(1) //输出值在0-255之间变化
    18         {
    19             P0 = k++; //输出k且k+1
    20             Delay(1);
    21             if (k == 0xff) //到达255时结束循环
    22                 break;
    23         }
    24         while(1) //输出值在255-0之间变化
    25         {
    26             P0 = k--; //输出k且k-1
    27             Delay(1);
    28             if (k == 0x00) //到达0时结束循环
    29                 break;
    30         }
    31     }
    32 }

     

  • 相关阅读:
    jackson学习之一:基本信息 jackson学习之二:jackson-core
    FastAPI项目实战:SayHello(FastAPI + vue.js + axios + element ui 翻自Flask版
    MarkDown优雅发表
    docker使用笔记
    JVM的重要性 从上层应用程序到底层操作系统,到底有哪些东西?
    Python正则表达式re模块和os模块实现文件搜索模式匹配
    区块链学习6:图灵完备和图灵不完备
    moviepy音视频开发:使用credits1给视频加片头片尾字幕
    moviepy音视频开发:使用volumex调节音量大小及其花式用法
    moviepy音视频开发:audio_normalize调整剪辑音量大小到正常
  • 原文地址:https://www.cnblogs.com/hughdong/p/6974143.html
Copyright © 2020-2023  润新知