AD转换之光敏电阻AIN2 ---- 学习笔记

发布者:大树下的大白菜y最新更新时间:2021-11-02 来源: eefocus关键字:AD转换  光敏电阻  单片机 手机看文章 扫描二维码
随时随地手机看文章

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

逐次逼近式AD转换器与计数式A/D转换类似,只是数字量由“逐次逼近寄存器SAR”产生。SAR使用“对分搜索法”产生数字量,以8位数字量为例,SAR首先产生8位数字量的一半,即10000000B,试探模拟量Vi的大小,若Vn>Vi,清除最高位,若Vn

二、时序图与引脚

 

三、代码

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-->J6

P22-->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

#include

 

// 重定义关键字

#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 SAR又以对分搜索法确定次高位,即以低7位的一半y1000000B(y为已确定位)试探模拟量Vi的大小。

在bit6确定后,SAR以对分搜索法确定bit5位,即以低6位的一半yy100000B(y为已确定位)试探模拟量的大小。

重复这一过程,直到最低位bit0被确定,转换结束

 */

 DIN = dat >> 7;  // 右移7位 将dat的最高位赋给DIN

 dat<<=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转换  光敏电阻  单片机 引用地址:AD转换之光敏电阻AIN2 ---- 学习笔记

上一篇:AD模数转换之热敏电阻
下一篇:STC89C51之AD模数转换 ---- 自学笔记

推荐阅读最新更新时间:2024-11-11 22:29

pic单片机编译错误汇总
一、Error : Can't find 0x12C words for psect rbss_1 in segment BANK1   连接器告诉你总共有0x12C(300)个字节准备放到bank1 中但bank1 容量不够。显然,只有把一部分原本定位在bank1 中的变量改放到其它bank 中才能解决此问题。 二、 Error :Fixup overflow in expression_r(...)    Error ; . fixup overflow in expression_r(location 0x1FEE (0x1FE6+8), size 2, value 0xFF5) 既然定义的指针有明确的
[单片机]
STM32F103单片机PWM单脉冲输出模式
  通常输出PWM波形的时候是一直输出的。但是在电机控制中往往只需要输出一定个数的脉冲,不需要一直输出,那么这就需要每次输出PWM时,输出的脉冲个数可控。要实现这个功能,一般有三种方法。   方法一: void TIM1_PWM_Init(u16 arr, u16 psc) { GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitSturcture;
[单片机]
STM32F103<font color='red'>单片机</font>PWM单脉冲输出模式
单片机入门实验七
;*****************************************; ;实验名称: 1个独立键盘控制LED灯实验 ; ;作者: 龙谊 ; ;版本: VER 1.0 ; ;说明: 初学者入门实验 ; ;修改: 无 ; ;编程语言: 汇编语言 ; ;******************************************; ORG 00
[单片机]
AVR 单片机精确延时函数
1.毫秒级的延时 延时1ms; void delay_1ms(void) { unsigned int i; for(i=1;i (unsigned int)(xtal*143-2_;i++) ; } 在上式中,xtal为晶振频率,单位为MHz. 当晶振频率为8M时,延时函数软件仿真的结果为1000.25μs.当晶振频率为4M时,延时函数软件仿真结果为999.5μs. 如果需要准确的1ms延时时间,则本计算公式只供参考,应通过软件仿真后,再确定循环的次数及循环初值,并且循环中还必须关闭全局中断,防止中断影响延时函数的延时时间。 下面的函数可以获得1ms的整数倍的延时时间: void delay(unsigned int n) {
[单片机]
pic单片机 DS18B20采样 LCD1602显示
#include 18b20.h #include main.h //--------------产生复位脉冲--------------------// void tx_reset() { ADCON1=0X06; TR ISA 5=0; DQ=1; delay_us2(10,5); //65us while(!DQ); //判断总线是否忙 DQ=0; delay_us2(10,23); //730us } //----------------等待应答脉冲----------------// void tx_wait () { TRISA5=1; //设为输入方式后,DQ被
[单片机]
单片机串行口的工作方式
1、串行口方式0 在方式0下,串行口为同步移位寄存器方式,波特率固定为 /12。这时的数据传送,无论是输入还是输出,均由RxD(P3.0)端完成,而由TxD(P3.1)端输出移位时钟脉冲。发送和接收一帧的数据为8位二进制,不设起始位和停止位,低位在前,高位在后。一般用于I/O口扩展。 2、串行口方式1 在方式1下,串行口为10位通用异步通信接口。一帧信息包括1位起始位(0)、8位数据位(低位在前)和1位停止位(1)。TXD是发送端,RXD是接收端。其传送波特率可调。方式1发送/接收时序如图7-6所示。 3、方式2和方式3 串行口工作在方式2、3时,为11位异步通信口,发送、接收一帧信息由11位组成,即1位起始位(0)、数据8
[单片机]
<font color='red'>单片机</font>串行口的工作方式
PIC单片机之AD框架
/******************************** *1 ADCON1 选择参考电压和模拟输入引脚 * ADCON0 选择通道,时钟 打开AD模式 *2 清楚 ADIF 设置 ADIE PEIE GIE *3 等待一定的时间 *4 开始A/D转化 GO/DONE=1 *5 1扫描方式开始扫描 GO/DONE 并清零 2响应中断清中断标志位 *6 读取寄存器的值 *********************************/ #include pic.h #include string.h #include STDIO.H __CONFIG(0x00A); #define inter_flag
[单片机]
功耗再降低 飞思卡尔推新款汽车电控系统MCU解决方案
近日,飞思卡尔公司针对汽车电子系统推出了一款新型Qorivva微控制器及两款S12 MagniV系列最新末端节点设备(end-node device),以满足汽车电子系统对网络带宽和数据处理能力及数据安全性日益增长的要求,此外,新型MCU的工作功耗也得到降低。 随着车内电控单元数量的增多(超过100个,执行代码超过1000万行),各单元之间的连通性也需随之增强。目前,平均每辆汽车内部联网中用来输送信号的铜线长达几英里,重达150磅(68千克)左右。在单个ECU芯片上集成更多的功能并提升执行代码的智能度能够有效减少汽车电子系统中ECU的数量,如此一来,可以节省大量的铜线布置,减轻了整车重量,从而提升了燃油效率。 目前,ISO
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved