TLC5615实现示波器波形显示——方波、三角波、锯齿波

代码:

cpp 复制代码
#include <reg52.h>

sbit SCLK = P2^0; // sbit:为寄存器的某位取名
sbit CS = P2^1;
sbit DIN = P2^2;

sbit key1 = P1^0;
sbit key2 = P1^1;
sbit key3 = P1^2;
sbit key4 = P1^3;

unsigned char rect; 

void delay(unsigned char i) {
    while(i--);
}

// 发送12位数据的函数
void write_12bits(unsigned char dat) {
    unsigned char i;
    CS = 0; // 片选最初置0
    for (i = 0; i < 8; i++) { // 先发送八位数据
        dat <<= 1; // dat最高位溢出
        DIN = CY; // 将溢出的高位给DIN

        SCLK = 1; delay(5); // 产生一次SCLK的正脉冲以发送数据
        SCLK = 0; delay(5); 
    }
    for (i = 0; i < 4; i++) { // 再发送四个零
        DIN = 0;
        SCLK = 1;
        delay(5);
        SCLK = 0;
        delay(5);
    }
    CS = 1; // 发送完全部数据后,必须让CS = 1
}

void triangle() { // 产生三角波
    unsigned char i;
    for (i = 0; i < 255; i++) {
        write_12bits(i);
    }
    
    for (i = 255; i > 0; i--) {
        write_12bits(i);
    }
}

void serration1() { // 产生锯齿波1
    unsigned char i;
    for (i = 0; i < 255; i++) {
        write_12bits(i);
    }
} 

void serration2() { // 产生锯齿波2
    unsigned char i;
    for (i = 255; i > 0; i--) {
        write_12bits(i);
    }
}

void tixing() { // 产生梯形
    unsigned char i;
    for (i = 255; i > 0; i--) {
        write_12bits(i);
    }
    
    for (i = 0; i < 255; i++) {
        write_12bits(0);
    }
    
    for (i = 0; i < 255; i++) {
        write_12bits(i);
    }
    
    for (i = 0; i < 255; i++) {
        write_12bits(255);
    }
}

void main() {
    rect = 0x00;
    TMOD = 0x01; // 利用定时器 T0 的方式一
    TH0 = 0x3c; // 定时器延时初值
    TL0 = 0xb0;

    EA = 1;  // 总中断
    ET0 = 1; // 定时器0的溢出中断 
    TR0 = 1; // 开启定时器0
    while (1) {
        while (!key1) {
            TR0 = 0; // 关闭定时器
            triangle();
        }
        while (!key2) {
            TR0 = 0;
            serration1();
        }
        while (!key3) {
            TR0 = 0;
            serration2();
        }
        while (!key4) {
            TR0 = 0;
            tixing();
        }
        TR0 = 1; // 开启定时器0
    }
}

void timer0() interrupt 1 { // 产生方波
    TH0 = 0x3c;
    TL0 = 0xb0;
    rect = ~rect;
    write_12bits(rect);
}

仿真:

介绍:

在单片机测控系统中,非电量如温度、压力、流量、速度等,经传感器先转换成连续变化的模拟电信号(电压或电流),然后再将模拟电信号转换成数字量后才能在单片机中进行处理。实现模拟量转换成数字量的器件称为ADC(A/D转换器)。

单片机处理完毕的数字量,有时根据控制要求需要转换为模拟信号输出。数字量转换成模拟量的器件称为DAC(D/A转换器)。本章从应用的角度,介绍典型的ADC、DAC芯片与AT89S51单片机的硬件接口设计以及接口驱动程序设计。

单片机扩展AD转换

单片机只能输出数字量,但是对于某些控制场合,常常需要输出模拟量,例如直流电动机的转速控制。下面介绍单片机如何扩展DAC。

目前集成化的DAC芯片种类繁多,设计者只需要合理选用芯片,了解它们的性能、引脚外特性以及与单片机的接口设计方法即可。由于现在部分单片机的芯片中集成了DAC,位数一般在10位左右,且转换速度也很快,所以单片的DAC开始向高的位数和高转换速度上转变。而低端的并行8位DAC,开始面临被淘汰的危险,但是在实验室或涉及某些工业控制方面的应用,低端8位DAC以其优异的性价比还是具有较大的应用空间。

1.D/A转换器简介

购买和使用D/A转换器时,要注意有关D/A转换器选择的几个问题。

(1)D/A转换器的输出形式

D/A转换器有两种输出形式:电压输出和电流输出。电流输出的D/A转换器在输出端加一个运算放大器构成的I-V转换电路,即可转换为电压输出。

(2)D/A转换器与单片机的接口形式

单片机与D/A转换器的连接,早期多采用8位的并行传输的接口,现在除了并行接口外,带有串行口的D/A转换器品种也不断增多,目前较为流行多采用SPI串行接口。在选择单片D/A转换器时,要根据系统结构考虑单片机与D/A转换器的接口形式。

2.主要技术指标

D/A转换器的指标很多,设计者最关心的几个指标如下。

(1)分辨率

分辨率指单片机输入给D/A转换器的单位数字量的变化,所引起的模拟量输出的变化,通常定义为输出满刻度值与2n之比(n为D/A转换器的二进制位数),习惯上用输入数字量的位数表示。显然,二进制位数越多,分辨率越高,即D/A转换器输出对输入数字量变化的敏感程度越高。例如,8位的D/A转换器,若满量程输出为10V,根据分辨率定义,则分辨率为10V/2n,分辨率为10V/256 = 39.1mV,即输入的二进制数最低位数字量的变化可引起输出的模拟电压变化39.1mV,该值占满量程的0.391%,常用符号1LSB表示。

同理:

10位D/A转换 1 LSB = 9.77mV = 0.1%满量程

12位D/A转换 1 LSB = 2.44mV = 0.024%满量程

16位D/A转换 1 LSB = 0.076mV = 0.00076%满量程

使用时,应根据对D/A转换器分辨率的需要选定D/A转换器的位数。

(2)建立时间

建立时间是描述D/A转换器转换速度的参数,表明转换时间长短。其值为从输入数字量到输出达到终值误差± (1/2)LSB(最低有效位)时所需的时间。电流输出的转换时间较短,而电压输出的转换器,由于要加上完成I-V转换的时间,因此建立时间要长一些。快速D/A转换器的建立时间可控制在1us以下。

(3)转换精度

理想情况下,转换精度与分辨率基本一致,位数越多精度越高。但由于电源电压、基准电压、电阻、制造工艺等各种因素存在误差。严格地讲,转换精度与分辨率并不完全一致。两个相同位数的不同的DAC,只要位数相同,分辨率则相同,但转换精度会有所不同。例如,某种型号的8位DAC精度为±0.19%,而另一种型号的8位DAC精度为±0.05%

AT89S51扩展10位串行DAC-TLC5615

  1. 串行DACTLC5615简介

    美国TI公司产品,串行接口DAC,电压输出型,最大输出电压是基准电压值两倍。带上电复位功能,即上电时把 DAC 寄存器复位至全零。单片机只需用3 根串行总线就可完成 10 位数据的串行输入,易于和工业标准的微处理器或单片机接口,非常适于电池供电的测试仪表、移动电话,也适用于数字失调与增益调整以及工业控制场合。

  • DIN:串行数据输入端;
  • SCLK:串行时钟输入端;
  • CS:片选端,低电平有效;
  • DOUT:用于级联时的串行数据输出端;
  • AGND:模拟地;
  • REFIN:基准电压输入端,2V~ (VDD - 2);
  • OUT:DAC 模拟电压输出端;
  • VDD:正电源端,4.5~5.5V ,通常取5V
  1. TLC5615内部功能框图
  • 10 位 DAC 电路;
  • 一个 16 位移位寄存器, 接收串行移入的二进制数,且有一个级联的数据输出端DOUT ;
  • 并行输入输出的 10 bit DAC 寄存器, 为 10 位 DAC 电路提供待转换的二进制数据;
  • 电压跟随器为参考电压端REFIN提供高输入阻抗,大约10MΩ;
  • ×2 电路提供最大值为 2 倍于REFIN输出;
  • 上电复位电路和控制逻辑电路

两种工作方式:

(1)第1种工作方式:12 位数据序列。从图10-8看出,16 位移位寄存器分为高4位的虚拟位、低2位的填充位以及10位有效数据位。在TLC5615 工作时,只需要向 16 位移位寄存器先后输入10位有效位和低2位的任意填充位。

(2)第2种工作方式:级联方式, 即 16 位数据列,可将本片的DOUT接到下一片的 DIN,需向 16 位移位寄存器先后输入高 4 位虚拟位、10 位有效位和低 2 位填充位,由于增加了高 4 位虚拟位, 所以需要 16 个时钟脉冲 。

当TLC5615片选脚CS为低时, 串行输入数据才能被移入16位移位寄存器。当CS为低时,在每一个 SCLK 时钟的上升沿将 DIN 的一位数据移入 16 位移寄存器。注意, 二进制最高有效位被导前移入。接着, CS的上升沿将16位移位寄存器的10位有效数据锁存于10位 DAC 寄存器,供DAC电路进行转换。

相关推荐
学习路上_write13 分钟前
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
单片机·嵌入式硬件·qt·学习·fpga开发·github·硬件工程
非概念19 分钟前
stm32学习笔记----51单片机和stm32单片机的区别
笔记·stm32·单片机·学习·51单片机
jjjxxxhhh1232 小时前
FPGA,使用场景,相比于单片机的优势
单片机·嵌入式硬件·fpga开发
无敌最俊朗@2 小时前
stm32学习之路——八种GPIO口工作模式
c语言·stm32·单片机·学习
EterNity_TiMe_2 小时前
【论文复现】STM32设计的物联网智能鱼缸
stm32·单片机·嵌入式硬件·物联网·学习·性能优化
changingshow3 小时前
Arduino IDE Windows 系统 离线安装 esp32 开发板 亲测好用。
单片机·嵌入式硬件
Chervin13 小时前
Windows,虚拟机Ubuntu和开发板三者之间的NFS服务器搭建
linux·单片机·ubuntu·arm
电子工程师UP学堂15 小时前
用单片机MSP430设计一个太阳能实战项目,能够详细的设计出它的硬件和软件系统
单片机
可乐鸡翅好好吃16 小时前
关于stm32中IO映射的一些问题
stm32·单片机·嵌入式硬件
深圳市青牛科技实业有限公司18 小时前
【青牛科技】 GC6153——TMI8152 的不二之选,可应用于摇头机等产品中
人工智能·科技·单片机·嵌入式硬件·新能源·摇头机