51单片机轻松入门—基于STC15W4K系列(C语言版)
李友全 编著:http://www.51hei.com/bbs/dpj-37954-1.html
第10章 数模转换器DAC 1 D/A输出电路图 2 TLC5615基本测试实验 3 TLC5615产生波形实验 4 TLC5615播放音乐实验 数模转换就是将单片机输出的数字信号转换为模拟信号(比如正弦波、锯齿波), 简称为D/A,实现数字信号转换为模拟信号的器件称为数模转换器,简称DAC, DAC一般是由专用集成电路完成的。 1 D/A输出电路图 1号单片机与D/A输出芯片TLC5615连接电路如图所示 。 TLC5615的1、2、3脚用于与单片机进行通信(SPI接口),6脚是基准电压输入, 7脚是模拟信号输出。图中的MC1403是一个廉价的电压基准芯片,简单的说就是一 个稳压精度比L7805之类更高的稳压块 2 TLC5615基本测试实验 #include "STC15W4K.H" // 注意宏定义后面没分号 #include sbit CS=P5^5; sbit CLK=P4^0; sbit DIN=P3^4; void DaConv(unsigned int value) { // 此函数内容固定,单片机晶振频率在5-35MHz范围内直接复制使用即可 } void main() { unsigned int value; // 待转换的数据 while(1) { value=511; // 这里输入0--1023的数据观察D/A转换输出电压 DaConv(value); // 执行D/A转换,无任何返回值。 } } 实验结果如表所示,输出电压X = 2·Vref·Value /1023。
3 TLC5615产生锯齿波、三角波、正弦波实验 例10.4 TLC5615产生1000Hz锯齿波、三角波、正弦波,R/C时钟22.1184MHz。 观察上图波形,横轴是时间,可用单片机定时器定时中断进行控制,纵轴是模拟电压值, 用TLC5615进行D/A转换输出即可。 要让TLC5615输出锯齿波、三角波、正弦波等波形,我们可以对波形的一个周期抽样一些 点进行D/A转换输出,把抽样点建立成表格,定时器每中断一次查表转换输出一个值。 比如我们将正弦函数从0°~360°范围内按10°一个步进值进行等分,可得0、10、20、 30、…340、350,共36个点,这就确定了表格数组大小为36个整数, 第1点输出电压值:511×sin(0)+512=512 // 511用于波形向上平移。 第2点输出电压值:511×sin(10)+512=601 // 511用于波形向上平移。 第3点输出电压值:511×sin(20)+512=687 // 511用于波形向上平移。 unsigned int code SinTable[] = // 正弦波表格 { 512,601,687,768,840,903,955,992,1015,1023,1015,992,955,903,840,768,687,601,512, 423,337,257,183,121,69,32,9,1,9,32,69,121,183,257,337,423, };
void Timer0() interrupt 1 { static unsigned char counter=0; |
|
P35=!P35; | // | 观察定时器定时时间用的 | TH0=0xff; | // | TH0=0xff; | TL0=0xCD; | // | TL0=0x2c; | DaConv(SinTable[counter]); | // | D/A输出 | counter++; |
|
|
counter%=36; // counter在0到36之间循环变化使波形循环输出 } void main() { Timer0_Init(); // 初始化并启动定时器0 while(1); // 通过定时器0来控制产生电压的时间间隔 } 当需要更换输出波形时,只需要修改DaConv(SinTable[counter]);语句中的表格名称即可,实测 D/A输出波形如图10-7所示。 4 TLC5615播放音乐实验 将音乐文件(比如MP3文件)通过其它辅助软件转换成单片机内部的表格数组,然后通过不断查 表+D/A的方式即可播放出音乐,通过调节TLC5615的输入基准电压就可调节输出音量的大小。 主要代码如下: void Timer0() interrupt 1 { static unsigned int counter=0; TH0=0xFE; TL0=0x33; DaConv(((unsigned int)wav[counter])<<1); // 将wav数组中的数据扩大2倍后写入TLC5615 counter++; // 扩大2倍是为了使TLC5615的音频输出电压范围在0-2.5V之间 counter%=WAV_LEN; // counter在0到WAV_LEN-1之间循环变化使声音循环播放 } void main() { Timer0_Init(); // 初始化并启动定时器0 while(1); // 通过定时器0来控制产生电压的时间间隔 }
|