AD转换之外部输入AD值软件设计


主函数

/*

 实验现象:下载程序后数码管前4位显示外部输入AIN3通道检测的AD值,模拟信号电压范围在0-5V

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的数字显示

 

/*延时函数

 i=1时,大约延时10us

*/

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(0xE4); // 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();   // 数码管显示函数

   }

 }

 

 

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 DIN  = P3^4;   //输入

sbit CS   = P3^5;   //片选

 

uint Read_AD_Data(uchar cmd);

uint SPI_Read(void);

void SPI_Write(uchar dat);

 

#endif

 

 

 

 

XPT芯片控制文件

 #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值 引用地址:AD转换之外部输入AD值

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

推荐阅读

集微网消息,因为中兴被老美制裁,使得其无暇顾及其他国家的手机市场,这也许是它将近一年多来没有在印度推出新产品的重要原因吧。随着中兴与老美达成和解,该公司的运营已步入正轨,据知情人士透露,中兴计划在未来两个月推出四款覆盖中高端的手机强势回归印度市场。据悉,中兴将在印度推出的四款产品名字分别为Blade A7 Vita、Blade V9 Vita、Blade...
受到面板出货减少的影响,平面显示器的驱动IC需求跟着下滑,2019年总用量的年成长率预估为负3.2% 根据集邦咨询光电研究中心(WitsView)最新观察,受到面板出货减少的影响,平面显示器的驱动IC需求跟着下滑,2019年总用量的年成长率预估为负3.2%,是近年来首次出现负成长,预估2020年的成长空间也有限。 集邦咨询研究副理李志豪表示,在中国10.5代线陆续放...
10月30日,2020中国(深圳)集成电路峰会在深圳市南山区举办,在大会下午举行的集成电路设计创新专题论坛上,北京华大九天软件有限公司副总经理郭继旺发表了以《技术创新支撑产业芯生态》为主题的演讲。华大九天副总经理郭继旺EDA、集成电路装备和集成电路材料是集成电路产业的三大战略基础支柱,可以说,没有EDA,就没有IC。然而,从全球EDA产业现状来看...
1、华为HarmonyOS智能座舱搭载车型:赛力斯全新车型 今年的华为开发者大会 2021(Together),「HarmonyOS智能座舱」完成了首次亮相。 设计上,「HarmonyOS智能座舱」共包含6个功能模块:语音控制、视觉感知、无缝流转、音频音效、驾驶安全和AR-HUD。其中“无缝流转”最具特色,可实现华为生态下不同设备间的自动流转,效果类似于苹果的“隔空播放和接力...

史海拾趣

问答坊 | AI 解惑

用TL494实现单回路控制器

:介绍了以电压驱动型脉宽调制控制集成电路TL494为核心元件并加上简单滤波电路及RC放电回路所构成的回路控制器。它能把脉冲宽度变化的信号转换成与脉冲宽度成正比变化的直流信号,进而实现闭环单回路控制。     关键词:脉宽调制 回 ...…

查看全部问答∨

常用4000系列标准数字电路的中文名称资料

型号 器件名称 厂牌 备注CD4000 双3输入端或非门+单非门 TICD4001 四2输入端或非门 HIT/NSC/TI/GOL CD4002 双4输入端或非门 NSC CD4006 18位串入/串出移位寄存器 NSC CD4007 双互补对加反相器 NSCCD4008 4位超前进位全加器 NSC  ...…

查看全部问答∨

毕业设计论文-16位单片机的语音电子门锁系统(转)

摘要:介绍采用声纹识别技术、在凌阳SPCE061A单片机上实现的一种语音电子门锁身份认证系统。实验结果表明,系统性能稳定,识别效果好,可以推广使用。 关键词:声纹识别 基于周期 线性预测 模式匹配 DTW   生物识别技术是利用人体生物特征进行 ...…

查看全部问答∨

一个项目,多家竞争,如何夺标?

最近,拉上一个工程项目,因为项目较大,而且利润明眼人就知道客观.就近的安防行业商都出尽了自家的看家本领.大拿这个项目,我已经基本上口头上签了多项项目合作.但我知道我的劣势比其他人大很多,也很明显.这个时候,应该出点什么招?…

查看全部问答∨

iPad分解调查:来看看创意的价值~~

建议零售价为499美元的16GB款(不支持3G)iPad,其部件成本为250.60美元,包含制造成本在内为259.60美元。 将近一半的利润。 显示屏和触摸屏等用户界面相关部件的合计成本为109.50美元,占所有部件比例的43.7%。iSuppli指出,“iPad的部件构成 ...…

查看全部问答∨

求声光逻辑电平测试仪

设计要求:   1:测试器红灯闪烁或蜂鸣器发出长声表示被测为逻辑高电平                    2:绿灯闪烁或蜂鸣器发出短声表示被测为逻辑低电平       ...…

查看全部问答∨

新人报道,向各位前辈取经

大家好,以前我一直用VC++在2000和xp下开发应用程序,最近突然有个部门要我去写EVC的程序,还有点不知所措,感觉很多函数和MFC里的一样,可是就是不知道如何把握他们的相同和区别,得大家指引一下,哪怕告诉我看什么书比较好也行,或者写写你们的心 ...…

查看全部问答∨

关于WINCE下SOCK_RAW的使用,在线等待

我正在WINCE下写一PING程序,原以用ICMPCreateFile(),ICMPSendEcho()实现。 但根据项目最新要求,需要程序可对发送PING命令的网卡进行绑定,现打算建立SOCK_RAW套接字,但是上网查找资料,发现在WINCE下必须用 WSCInstallProvider()进行声明。 ...…

查看全部问答∨

FIFO读写的问题

往FIFO里写数据,写一个数据地址加1。读的时候,我有个问题是,读出一个数据,这个空间是不是就要释放出去?把后面的数据地址都减1?像移位寄存器一样?FIFO,先进先出,里面具体数据如何存储和读取?…

查看全部问答∨

STM32进不了CAN中断,紧急求助。

CAN报文通过中断接收和发送,CAN_RX , CAN_TX也分别重映射到 PA11和PA12脚上,AFIO时钟和CAN时钟也都使能了,就是不能进中断,求助啊,急。。。。。 程序中的部分如下: GPIO_InitTypeDef  GPIO_InitStructure; RCC_APB1PeriphClockCm ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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