目录
一、功能描述
二、ADC介绍
2.1 逐次逼近型ADC转换原理
2.2 ADC的主要技术指标
三、XPT2046芯片介绍
3.1 XPT2046外部引脚
3.2 XPT2046的命令字
3.3 XPT2046时序图
四、测试文件test.c
五、实验现象
一、功能描述
我们使用的 STC89C51单片机内部不含 ADC 接口,所以需要外接一个 ADC 转换芯片将模拟信号转换成数字信号供单片机处理。我们开发板上集成了一个 ADC 模数转换电路,选用的 ADC 芯片是 12 位的 AD 芯片-XPT2046。本次实验通过ADC转换电路,采集电位器AD的电压值、热敏电阻NTC电路的电压值、光敏电阻GR电路的电压值,并将转换后的数字量显示在LCD1602上。
二、ADC介绍
我们知道 51 单片机系统内部运算时用的全部是数字量,即 0 和 1,因此对单片机系统而言,无法直接操作模拟量,必须将模拟量转换成数字量。所谓数字量,就是用一系列 0 和 1 组成的二进制代码表示某个信号大小的量。用数字量表示同一个模拟量时,数字位数可以多也可以少,位数越多则表示的精度越高, 位数越少表示的精度就越低。
2.1 逐次逼近型ADC转换原理
采用逐次逼近法的 AD 转换器是有一个比较器、DA 转换器、缓冲寄存器和控 制逻辑电路组成,如下图所示:
逐次逼近法的转换过程是:初始化时将逐次逼近寄存器各位清零,转换开始时,先将逐次逼近寄存器最高位置 1,送入 DA 转换器,经 DA 转换后生成的模拟量送入比较器,称为 U0,与送入比较器的待转换的模拟量 Ux 进行比较,若U0<Ux,该位1保留,否则清除。然后再将逐次逼近寄存器次高位置 1,将寄存器中新的数字量送 DA 转换器,输出的 U0 再与 Ux 比较,若 U0<Ux,该位1保留,否则清除。重复此过程,直至逼近寄存器最低位。转换结束后,将逐次逼近寄存器中的数字量送入缓冲寄存器,得到数字量的输出。逐次逼近的操作过程是在一个控制电路的控制下进行的。
2.2 ADC的主要技术指标
- 分辨率:是指对于允许范围内的模拟信号,它能输出离散数字信号值的个数。12位ADC的分辨率就是12位,一个 10V满刻度的 12位 ADC能分辨输入电压变化最小值是:10Vx(1÷12)=2.4mv。
- 转换速率:是能够重复进行数据转换的速度,即每秒转换的次数。而完成一次 A/D转换所需的时间(包括稳定时间),则是转换速率的倒数。
三、XPT2046芯片介绍
XPT2046是一种典型的逐次逼近型模数转换器(SAR ADC),包含了采样/保持、模数转换、串口数据输出等功能。 XPT2046的通信方式是SPI。
3.1 XPT2046外部引脚
- CS:片选端。
- DIN:串行数据输入端
- DCLK:外部时钟输入端
- DOUT:串行数据输出端
- X+、Y+、X-、Y-:位置选择端
- VBAT:电池监视输入端
- AUX:ADC辅助输入通道
CS、DIN、DCLK和DOUT分别接单片机的对应引脚,X+、Y+、VBAT分别输入要转换的模拟信号。
3.2 XPT2046的命令字
其中选择通道位A2-A0,如下图所示:
3.3 XPT2046时序图
- 主机通过DIN,发送命令字给XPT2046,XPT2046在DCLK高电平时读取数据。
- XPT2046将转换好的数字量通过DOUT发送给主机,主机在DCLK高电平时读取数据。
程序如下:文章来源:https://www.toymoban.com/news/detail-459192.html
#include <REGX52.H>
sbit XPT2064_DIN=P3^4;
sbit XPT2064_CS=P3^5;
sbit XPT2064_DCLK=P3^6;
sbit XPT2064_DOUT=P3^7;
/*
*函数名: XPT2064_ReadAD(unsigned char command)
*函数功能: 主机发送命令字给XPT2046,XPT2046将转换的数字量发送给主机
*输入: command:命令字
*输出: D_num:转换好的数字量
*/
unsigned int XPT2064_ReadAD(unsigned char command)
{
unsigned int D_num=0;
unsigned char i=0;
XPT2064_CS=0;
for(i=0;i<8;i++)
{
XPT2064_DIN=command&(0x80>>i);
XPT2064_DCLK=1;
XPT2064_DCLK=0;
}
for(i=0;i<16;i++)
{
XPT2064_DCLK=1;
if(XPT2064_DOUT==1)D_num|=0x8000>>i;
XPT2064_DCLK=0;
}
return D_num/128;
}
四、测试文件test.c
#include <REGX52.H>
#include "Delay.h"
#include "LCD1602.h"
#include "XPT2046.h"
#define XPT2046_XP 0x9c
#define XPT2046_YP 0xdc
#define XPT2046_VBAT 0xac
#define XPT2046_AUX 0xec
int main()
{
unsigned int AD,NTC,GR=0;
LCD_Init();
while(1)
{
AD=XPT2064_ReadAD(XPT2046_XP);
NTC=XPT2064_ReadAD(XPT2046_YP);
GR=XPT2064_ReadAD(XPT2046_VBAT);
LCD_ShowString(1,1,"AD");
LCD_ShowString(1,5,"NTC");
LCD_ShowString(1,9,"GR");
LCD_ShowNum(2,1,AD,3);
LCD_ShowNum(2,5,NTC,3);
LCD_ShowNum(2,9,GR,3);
Delay(10);
}
}
五、实验现象
当转动电位器、传递热量给热敏电阻NTC或者改变环境的光照,也就是改变电压模拟量,通过ADC转换后得到对应的数字量,并把它们显示在LCD1602上。文章来源地址https://www.toymoban.com/news/detail-459192.html
到了这里,关于51单片机——ADC模数转换实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!