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寄存器中,输出的模拟量随之变化

    51单片机 | 使用D/A转换器实现三角波发生器_第1张图片

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

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

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

    51单片机 | 使用D/A转换器实现三角波发生器_第2张图片

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

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

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

实验说明:

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

51单片机 | 使用D/A转换器实现三角波发生器_第3张图片

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

接线说明:

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 
 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 }

 

转载于:https://www.cnblogs.com/hughdong/p/6974143.html

你可能感兴趣的:(51单片机 | 使用D/A转换器实现三角波发生器)