利用XPT2046制作一个电位器AD转换装置
XPT2046是一款四线制电阻触摸屏控制芯片,内含12位分辨率125KHz转换速率逐步逼近型A/D转换器,支持从1.5V到5.25V的低电压I/O接口。
所谓逐步逼近型,就是输入一个模拟量,其与1000 0000 0000 对应的模拟量进行比较,大则高位取1,小则高位取0。这种思想相当于折半查询,所以可以依次从高位到低位确定所有值,以此来确定模拟量对应的数字量。
我们该如何去用这个芯片,来完成将一个模拟量转换成数字量呢?
初学者确实有很大的困难,我们需要学会怎么去看它的芯片手册。
上图是它的一个封装图,是不是看得很乱?
别急,这时候还要看看它每个管脚的功能描述
如下图
这时候,我们可以大致了解这是一个串行输入输出的芯片。
串行数据输出是DOUT(16管脚),也就是我们最终的数字量。
串行数据输入是DIN(2管脚),你会想,我们不是输入的是模拟量,怎么会要串行输入呢?
确实,你会看到6、7、8、9管脚都是输入管脚,它们就不是串行输入的,所以我们可以推测它们是不同的模拟量输入口。其实DIN管脚是模式控制输入口,就好比我们去操作寄存器一样,要写进去一个数字量,来控制寄存器的运行模式,芯片也是这样。
再看DCLK管脚,这是外部时钟输入口,既然是串行输入输出,就要有拍子来控制一个一个字节输入输出,所以这个管脚就是起到这个作用。
然后我们一定要看时序图
通过看时序图,才能了解芯片的工作方式。
首先,CS是片选,低电平有效。
首先输入一个DIN,但是由于是串行输入,所以这里就要用位运算来一位一位提取后输入到DIN管脚,而输进去的时候是发生在时钟上升沿,时钟下降沿结束输入。
所以我们可以将模式输入程序写成这样的格式:
1、获得char 型模式数字量
2、DCLK = 0.
3、提取高位并将其赋值给DIN
4、DCLK = 1.锁存当前值。
循环8次。
之后我们发现芯片进入busy阶段,我们需要给它一个小延时,让它进行AD转换,然后我们还需要再给一个时钟脉冲,清除busy.
接下来就是读取DOUT的值,原理同DIN输入。
而模式的选择需要看你的板子上是怎么外接的
我们需要用电位器来实现AD转换,所以模拟量输入接口应该选择X+(6管脚)
再看芯片手册的模式说明
所以我们模式选择为0x94,读者可以自行对照每一位看看。
综上,我就可以给出完整代码了
#include <reg52.h>
#include<intrins.h> #define uint unsigned int
#define uchar unsigned char
#define GPIO_DUAN P0 uchar table[]={
0x3f, 0x06, 0x5b, 0x4f,
0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c,
0x39, 0x5e, 0x79, 0x71
}; uchar DisplayData[];
sbit HCA = P2^;//HCA,HCB,HCC是利用了74HC138译码器来进行位选,我们动态位选了4位
sbit HCB = P2^;
sbit HCC = P2^;
sbit CLK = P1^;
sbit CS = P1^;
sbit DIN = P1^;
sbit DOUT = P1^; void DisplayDS();
void delayms(uint xms);
uint Read_AD_Data(uchar moshi);
void SPI_Write(uchar moshi);
uint GetValue(); void main()
{
uint temp, cnt = ;
while(){
if(cnt == ){//每50下读取转换值,避免数字跳动太快
temp = Read_AD_Data(0x94);
cnt = ;
}
cnt++; DisplayData[] = table[temp%/];
DisplayData[] = table[temp%/];
DisplayData[] = table[temp%/];
DisplayData[] = table[temp%/]; DisplayDS();
}
} void DisplayDS()
{//动态扫描函数
uint i;
for(i = ; i < ; i++){
GPIO_DUAN = 0x00;
switch(i)
{
case : HCC = ; HCB = ; HCA = ; break;
case : HCC = ; HCB = ; HCA = ; break;
case : HCC = ; HCB = ; HCA = ; break;
case : HCC = ; HCB = ; HCA = ; break;
}
GPIO_DUAN = DisplayData[i];
delayms();
}
} void delayms(uint xms)
{
uint i, j;
for(i = ; i < xms; i++)
for(j = ; j < ; j++);
} uint Read_AD_Data(uchar moshi)
{//读取最终的数字量函数
uint i, ans;
SPI_Write(moshi);
for(i = ; i < ; i++); CLK = ;
_nop_();
_nop_();
CLK = ;
_nop_();
_nop_(); ans = GetValue();
CS = ;
return ans;
} void SPI_Write(uchar moshi)
{//写模式函数
uint i;
CS = ;
for(i = ; i < ; i++){
CLK = ;
DIN = moshi>>;
CLK = ;
moshi <<= ;
}
CLK = ;
} uint GetValue()
{//读取DOUT管脚,得到最终数字量函数
uint i, ans = ;
for(i = ; i < ; i++){
CLK = ;
ans <<= ;
ans |= DOUT;
CLK = ;
}
CLK = ;
return ans;
}
利用XPT2046制作一个电位器AD转换装置的更多相关文章
- 利用DreamweaverCS5制作一个含有动态标题的教程
DreamweaverCS5怎么制作一个含有动态标题?做一个网页就先要做一个标题,一个好标题会让网页让人印象深刻,有动态的标题会让网页更生动,下面我就介绍一下怎么制作一个含有动态的标题 做一个网页 ...
- 利用Qt制作一个helloworld
使用QT创建第一个 工程: 1.打开应用程序: 2.单击画面中间偏上的 New Project按钮.[要学习使用啊~,传说它的跨平台行很好,QQ就是用它编辑的.] 3.直接点击右下角的选择 按钮. 4 ...
- 利用Python制作一个只属于和她的聊天器,再也不用担心隐私泄露啦!
------------恢复内容开始------------ 是否担心微信的数据流会被监视?是否担心你和ta聊天的小秘密会被保存到某个数据库里?没关系,现在我们可以用Python做一个只属于你和ta的 ...
- 利用docker制作一个带有redis软件的镜像,供其他人使用
1. 宿主机在etc/apt/下创建一个haha的文件夹 2.宿主机将haha文件夹映射到容器的虚拟系统中etc/apt/ 3. 此时,可以在宿主机和容器虚拟机中同步创建和删除文件 4. 将宿主机中的 ...
- 利用html5制作一个时钟动画
<canvas id="clock" width="500" height="500" style="background- ...
- 利用Bootstrap制作一个流行的网页
首先是html承载内容: <!DOCTYPE html> <html lang="zh_CN"> <head> <meta charset ...
- 利用HTML制作一个简单的界面(工具HBuilder)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"><!--标题,里面填写 ...
- 数据可视化之powerBI技巧(三)这个Power BI技巧很可爱:利用DAX制作时钟
周末放松一下,给大家分享一个小技巧,仅利用DAX制作一个简易的时钟. 时钟效果如下: 这个时钟的制作只需一个度量值,你信吗? 事实上确实如此,制作步骤介绍如下: 1,新建参数,生成一个数字序列作为小时 ...
- 百度前端技术学院2018笔记 之 利用 CSS animation 制作一个炫酷的 Slider
前言 题目地址 利用 CSS animation 制作一个炫酷的 Slider 思路整理 首先页面包含三种东西 一个是type为radio的input其实就是单选框 二是每个单选框对应的label 三 ...
随机推荐
- [物理学与PDEs]第1章习题7 载流线圈的磁场
设一半径为 $R$ 的圆周电路上的电流强度为 $I$. 试计算在通过圆心垂直于圆周所在平面的直线上, 由该圆周电路产生的磁场的磁感强度. 解答: 由对称性知在该直线 $l$ 上, ${\bf B}$ ...
- 基于Windows,Python,Theano的深度学习框架Keras的配置
1.安装Anaconda 面向科学计算的Python IDE--Anaconda 2.打开Anaconda Prompt 3.安装gcc环境 (1)conda update conda (2)cond ...
- 2.5 elif
elif 想一想: if能完成当xxx时做事情 if-else能完成当xxx时做事情1,否则做事情2 如果有这样一种情况:当xxx1满足时做事情1:当xxx1不满足.xxx2满足时做事情2:当xxx2 ...
- html-webpack-template, 一个更好的html web service插件
源代码名称:html-webpack-template 源代码网址:http://www.github.com/jaketrent/html-webpack-template html-webpack ...
- 007_wireshark分析TCP的三次握手和四次断开
要想进行抓包分析,必须先了解TCP的原理.这里介绍了TCP的建立连接的三次握手和断开连接的四次握手. 一.前言:介绍三次握手之前,先介绍TCP层的几个FLAGS字段,这个字段有如下的几种标示 SYN表 ...
- 【算法】K最近邻算法(K-NEAREST NEIGHBOURS,KNN)
K最近邻算法(k-nearest neighbours,KNN) 算法 对一个元素进行分类 查看它k个最近的邻居 在这些邻居中,哪个种类多,这个元素有更大概率是这个种类 使用 使用KNN来做两项基本工 ...
- 克隆虚拟机+Linux互相登录+秘钥认证(四)
1.虚拟机右键管理_克隆 修改虚拟机名称后完成! 2.开机启动虚拟机 随时保存快照 3.开启两台虚拟机,进行互相登录切换!(W命令查看系统负载) 补充: IP登录: ssh IP: 例如:ssh 19 ...
- 【git】将本地项目上传到远程仓库
飞机票 一. 首先你需要一个github账号,所有还没有的话先去注册吧! https://github.com/ 我们使用git需要先安装git工具,这里给出下载地址,下载后一路直接安装即可: htt ...
- 如何给PDF设置全屏动画
PPT文件可以播放全屏,并且可以实现飞入.分割.闪烁等动画模式播放.那么PDF文件可以吗?我们想要给PDF文件加入动画效果应该怎么做呢,也有很多的小伙伴不知道该怎么把PDF文件切换为全屏动画模式想要知 ...
- Razor---服务器端标记语言
Razor 是一种允许您向网页中嵌入基于服务器的代码(Visual Basic 和 C#)的标记语法<ul> @for (int i = 0; i < 10; i++) { < ...