一、逐次逼近式ADC的转换原理

逐次逼近式AD转换器与计数式A/D转换类似,只是数字量由“逐次逼近寄存器SAR”产生。SAR使用“对分搜索法”产生数字量,以8位数字量为例,SAR首先产生8位数字量的一半,即10000000B,试探模拟量Vi的大小,若Vn>Vi,清除最高位,若Vn<Vi,保留最高位。在最高位确定后,SAR又以对分搜索法确定次高位,即以低7位的一半y1000000B(y为已确定位) 试探模拟量Vi的大小。在bit6确定后,SAR以对分搜索法确定bit5位,即以低6位的一半yy100000B(y为已确定位) 试探模拟量的大小。重复这一过程,直到最低位bit0被确定,转换结束。

二、时序图与引脚

三、代码

3.1、main

/*实验现象:下载程序后数码管前4位显示光敏传感器检测的AD值1,单片机-->AD/DAC模块 管脚释义P34-->DI   DIN     串行数据输入端,当CS为低电平时,数据在 DCLK上升沿锁存进来P35-->CS   CS      片选信号,控制转换时序和使能串行输入输出寄存器,高电平时ADC掉电P36-->CL   DCLK   时钟,外部时钟信号输入P37-->DO   DOUT    串行数据输出端口。数据在DCLK的下降沿移出,当cs为高电平时为高阻态。BUSY   忙时信号,当cs为高电平时为高阻态LOVDD  数字电源输入端AUX     ADC辅助输入通道2,单片机-->动态数码管模块J22-->J6P22-->J9(A)P23-->J9(B)P24-->J9(C)   */
#include "reg52.h"         // 此文件中定义了单片机的一些特殊功能寄存器
#include "XPT2046.h"typedef unsigned int u16;
typedef unsigned char u8;   // 数据类型的定义sbit LSA = P2^2;    //这三个端口共同控制数码管的位选
sbit LSB = P2^3;
sbit LSC = P2^4;u8 disp[4];            //  字符型数组用来,存储点亮数码管前四位的数据
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0~9的数字显示/*延时函数*/
void delay(u16 i)
{while(i--);
}/*数据处理模块*/
void datapros()
{
u16 temp;  // 整型变量
/*static修饰的静态局部变量只执行一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
static修饰全局变量的时,这个全局变量只能在本文件中访问,不能在其它文件中访问,即便是extern外部声明也不可以
static修饰一个函数,则这个函数的只能在本文件中调用,不能被其他文件调用。Static修饰的局部变量存放在全局数据区的静态变量区。*/
static u8 i;
if(i==50)
{
i=0;
/*AIN0电位器:如果要检测转换电位器模拟信号,控制字命令寄存器值为0X94或者0XB4.如果要检测转换热敏电阻模拟信号,控制字命令寄存器值为0XD4.AIN2光敏电阻:如果要检测转换光敏电阻模拟信号,控制字命令寄存器值为0XA4.如果要检测转换AIN3通道上模拟信号,控制字命令寄存器值为0XE4.*/
temp = Read_AD_Data(0xA4); // AIN2光敏电阻
}i++;disp[0] = smgduan[temp/1000];        // 千位disp[1] = smgduan[temp%1000/100];      // 百位disp[2] = smgduan[temp%1000%100/10]; //十位disp[3] = smgduan[temp%1000%100%10]; // 个位}/*数码管显示模块*/
void DigDisplay()
{
u8 i;
for(i=0;i<4;i++)
{
switch(i)  // 位选
{case(0):LSA=1;LSB=1;LSC=1; break;//显示第0位case(1):LSA=0;LSB=1;LSC=1; break;//显示第1位case(2):LSA=1;LSB=0;LSC=1; break;//显示第2位case(3):LSA=0;LSB=0;LSC=1; break;//显示第3位
}P0=disp[i];    // 发送数据delay(100);   // 延时一段时间P0 =0x00;     // 消影
}
}/* 主函数*/
void main(){while(1){datapros();        // 数据处理函数DigDisplay();   // 数码管显示函数}}

3.3、XPT2046芯片控制引脚定义、函数、变量声明文件

#ifndef _XPT2046_H_
#define _XPT2046_H_// 包含头文件
#include<reg52.h>
#include<intrins.h>// 重定义关键字
#ifndef uchar
#define uchar unsigned char
#endif#ifndef uint
#define uint unsigned int
#endif#ifndef ulong
#define ulong unsigned long
#endif// IO定义
sbit DOUT = P3^7;
sbit CLK  = P3^6;
sbit CS  = P3^5;
sbit DIN  = P3^4;// 函数定义
uint Read_AD_Data(uchar cmd);
uint SPI_Read(void);
void SPI_Write(uchar dat);

3.3、XPT2046.c芯片控制

 #include"XPT2046.h"// 初始化触摸函数
void SPI_Start(void)
{CLK=0;    // 时钟,外部时钟信号输入CS=1;     // 片选信号,控制转换时序和使能串行输入输出寄存器,高电平时ADC掉电DIN=1;    // 串行数据输入端,当CS为低电平时,数据在 DCLK上升沿锁存进来CLK=1;CS=0;
}/*写数据
CLK外部时钟 上升沿时   由DIN端口输入数据并锁存
*/
void SPI_Write(uchar dat)
{uchar i;    // 字符型变量CLK=0;         // 外部时钟  低电平for(i=0;i<8;i++){/*   逐次逼近式AD转换原理逐次逼近式AD转换器与计数式A/D转换类似,只是数字量由“逐次逼近寄存器SAR”产生。SAR使用“对分搜索法”产生数字量,以8位数字量为例,SAR首先产生8位数字量的一半,即10000000B,试探模拟量Vi的大小,若Vn>Vi,清除最高位,若Vn<Vi,保留最高位。在最高位确定后,SAR又以对分搜索法确定次高位,即以低7位的一半y1000000B(y为已确定位)试探模拟量Vi的大小。在bit6确定后,SAR以对分搜索法确定bit5位,即以低6位的一半yy100000B(y为已确定位)试探模拟量的大小。重复这一过程,直到最低位bit0被确定,转换结束*/DIN = dat >> 7;  // 右移7位     将dat的最高位赋给DINdat<<=1;         //  dat=dat<<1 将保存在dat中的最高位移出 进行下次循环CLK = 0;// 上升沿放置数据,如将数据传输至数据线CLK = 1;}
}/*读数据函数CLK 时钟信号输入端口  下降沿时(CLK=1 变为 CLK=0)    数据移出*/
uint SPI_Read(void)
{
uint i, dat = 0;  // 定义整型变量
CLK = 0;
for(i=0;i<12;i++)
{dat <<=1;       // dat = dat << 1;  左移1位CLK=1;// 下降沿数据移出CLK =0;/*  与&&  and             a && b    a  and  b     或||  or            a || b    a   or  b非!                 !1=0 按位与(&)           a & b     a  and b 按位或(|)           a | b     a  or  b*/dat |= DOUT;     // dat = dat | DOUT
}return dat;
}/*cmd:读取的X或Y*/
uint Read_AD_Data(uchar cmd)
{
uchar i;        // 无符号的字符型变量
uint AD_Value;  // 整型变量
CLK =0;            // 外部时钟信号输入
CS = 0;            //片选信号,控制转换时序和使能串行输入输出寄存器,高电平时ADC掉电(高电平不工作,低电平工作)
SPI_Write(cmd);
for(i=6;i>0;i--);   // 发送一个时钟周期,清除BUSY
CLK = 1;    // 下降沿移出数据
_nop_();    // 延时1us
_nop_();    // 延时1us
CLK = 0;
_nop_();    // 延时1us
_nop_();    // 延时1us
AD_Value = SPI_Read();
CS =1;
return AD_Value;
}

AD转换之光敏电阻AIN2 ---- 学习笔记相关推荐

  1. stm32使用AD转换读取光敏电阻的值(光敏电阻5516)

    STM32使用AD转换读取光敏电阻 光敏电阻使用的是5516,阻值是10k,网上能直接买到. 过程如下. 硬件设计 LRAO接单片机引脚,原理就是串联分压,当外界光发生变化的时候,光敏电阻的阻值发生变 ...

  2. java毫秒值转换成日期_Java学习笔记day08

    Object类 java.lang.Object 类Object是类层次结构的根类 每个类都使用Object作为 超(父)类 所有对象(包括数组)都实现这个类的方法 Object类的toString方 ...

  3. c语言转换成php,PHP学习笔记!(转)

    这些天新年放假 又有许多事情耽搁了 现在继续!仍然是文件的读写操作 文件的读写操作当中还有一个有用的符号"@" 这个符号的用途是抑制fopen()函数调用当中的错误,以友好的方式来 ...

  4. Altium Designer 2020 学习笔记(一)-----原理图及原理图库部分(配动态图操作演示)

    本篇文章主要与大家简要分享一下,我在AD学习过程中的一些学习笔记,本篇文章主要关于原理图及原理图库部分. 本系列文章链接: -------------------------------------- ...

  5. AutoLeaders控制组——51单片机学习笔记(AD/DA、红外遥控)

    本篇内容是观看B站江科大自化协UP主的教学视频所做的笔记,对其中内容有所引用,并结合自己的单片机板块进行了更改调整. 以下笔记内容以一个视频为一个片段(内容较多,可能不适合速食,望见谅) 一些内容涉及 ...

  6. 深信服应用交付(AD)学习笔记

    深信服上网行为管理的学习笔记,由于软件版本更新相关特性可能变动,仅供参考哈.. 权威内容请访问深信服官方社区:https://bbs.sangfor.com.cn/ 目录 DNS相关 全局智能DNS ...

  7. 51单片机学习笔记AD/DA

    AD/DA AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号.比如单片机只能识别0与5V数字信号,当输入为2.5V--模拟信号时,就需要转化为单片机所 ...

  8. STM32学习笔记(八)丨ADC模数转换器(ADC单、双通道转换)

    本篇文章包含的内容 一.ADC 模数转换器 1.1 ADC简介 1.2 逐次逼近型ADC工作原理 1.3 STM32中的ADC基本结构 1.4 STM32中ADC的输入通道 1.5 STM32中的AD ...

  9. STC51单片机学习笔记8——stc12c56 串口显示AD(多路ad)

    stc12c56 串口显示AD(多路ad). AD中断设置 AUXR: ADC_CONTR: //#define ADC_POWER 0x80后面不能加分号,不然就会错.其他定义必须加分号!!! // ...

最新文章

  1. H5 客户端设置title 滑动验证码
  2. 某女程序员吐槽自己被男同事集体排挤!一个人吃饭,一个人敲代码!深深感觉到世界的恶意!...
  3. 3.4 新供应商引入
  4. ajax数据字符串拼接,ajax请求到后台数据,前台不用拼接字符串,一样显示到页面...
  5. 16进制的两位数转换不了 matlab_【大学生计算机基础】进制那些问题。小数或整数转换,各种进制间转换.........
  6. 音频信号发生器_1957年,DIY的Hi-Fi 电唱机单电子管音频发生器的音质保真度高...
  7. css flexbox模型_完整CSS课程-包括flexbox和CSS网格
  8. asf linux教程,ASF V3.0 windows/linux含树莓派部署流程
  9. python和.net的区别_c#教程之.net和C#的区别
  10. android adb shell 常用命令
  11. 100 个网络基础知识
  12. 希尔伯特空间(Hilbert空间)
  13. 简单介绍在线OTA几款平台
  14. CAB 写inf文件
  15. 腾讯云播放器隐藏音频播放的按钮
  16. GPT2Config
  17. 学校计算机的使用英语作文180字,关于我的寒假英语作文180字3篇
  18. Win7与Win10在局域网内共享打印机
  19. 为什么我劝90%的人不要转行数据分析?数据岗真没你想的那么香
  20. 动态拼图怎么做?如何将多张动图拼接在一起?

热门文章

  1. 当我成为独立开发者我在干什么
  2. 我用ChatGPT写2023高考语文作文(六):北京卷II
  3. 蓝凌(Landray)OA漏洞常见RCE
  4. MySQL数据库实验六 简单数据库应用系统设计与实现
  5. 【React】946- 一文吃透 React Hooks 原理
  6. db migrate mysql_数据库迁移方案 node-db-migrate
  7. SSH简单爆破及漏洞利用
  8. 网络安全的隐形守护者——白帽黑客
  9. 《惢客创业日记》2020.12.11(周五)每个客户都有隐形需求
  10. postgreSQL数据库 id自增