历史上的今天
返回首页

历史上的今天

今天是:2024年11月01日(星期五)

正在发生

2021年11月01日 | AD模数转换之热敏电阻

2021-11-01 来源:eefocus

AD转换之热敏电阻传感器检测AD值软件设计

main.c函数

/*

 实验现象:下载程序后数码管前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(0xD4); // 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

 

 

 

 

 

XPT2046芯片控制

 #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;

}


推荐阅读

史海拾趣

CalAmp公司的发展小趣事

在某年第一季度,CalAmp公司发布了其财报数据。根据财报,该季度公司实现营收7089.1万美元,虽然比市场预期的7566万美元略低6.30%,但仍然展现了稳健的增长态势。同时,公司的每股收益为-0.11美元,低于预期的0.04美元,这可能与公司在研发和市场拓展方面的持续投入有关。尽管如此,CalAmp公司在无线通信解决方案应用领域的广泛布局和深厚的客户基础,使得其整体业绩依然保持稳健。

Barkston Plastics Engineering Ltd.公司的发展小趣事

面对国内市场的饱和,Barkston Plastics Engineering Ltd.开始寻求国际化发展的道路。然而,国际市场环境的复杂性和文化差异给公司带来了诸多挑战。在经历了一系列的市场调研和风险评估后,Barkston成功打入欧洲市场,通过与当地企业的合作,逐步扩大了其国际影响力。这一国际化发展进程不仅为公司带来了更广阔的市场空间,也提升了其在全球电子行业中的地位。

意普(ESPE)公司的发展小趣事

随着工业自动化和智能化的不断发展,意普(ESPE)公司开始将光电保护技术与智能制造相结合,推出了多款智能光电保护产品。这些产品具有更高的检测精度和更快的反应速度,能够更好地保护操作人员的安全。同时,公司还积极参与工业互联网和物联网的建设,推动光电保护技术的智能化发展。

BLACK&DECKER公司的发展小趣事

BLACK&DECKER公司的历史可以追溯到1910年,由Alonzo G. Decker和Duncan S. Black在美国马里兰州巴尔的摩共同创立。两位创始人的初始投资来自于Black先生卖掉他的二手车所得的600美元,再加上1200美元的贷款。公司起初主要生产牛奶瓶装盖机、棉花采集机、糖果浸包机等工业用设备。然而,真正让BLACK&DECKER崭露头角的,是1916年他们发明的现代手枪钻原型。这一创新产品解决了当时德国电动工具笨重、难以操控的问题,为电动工具行业带来了革命性的变革。

Cotco公司的发展小趣事

为了提升竞争力,Cotco公司高度重视技术创新和产品研发。公司投入大量资金建立了先进的研发中心,吸引了一批顶尖的电子工程师和研发人员。通过不断的技术攻关和市场调研,Cotco成功开发出一系列具有自主知识产权的电子产品,包括高性能的电源适配器、稳定可靠的数据线等。这些产品凭借卓越的性能和合理的价格,迅速在市场上占据了一席之地。

ETC公司的发展小趣事

随着ETC技术的不断完善和产品性能的提升,速通科技开始积极拓展市场。公司积极参与全国ETC联网工作,与各地交通运输管理部门和高速公路运营商建立了良好的合作关系。在政府的支持下,速通科技成功推动了ETC系统的全国联网工作,实现了ETC卡的跨地区、跨省份通用。

问答坊 | AI 解惑

TL431特性及应用

1 TL431的简介   德州仪器公司(TI)生产的TL431是一是一个有良好的热稳定性能的三端可调分流基准源。它的输出电压用两个电阻就可以任意地设置到从Vref(2.5V)到36V范围内的任何值(如图2)。该器件的典型动态阻抗为0.2Ω,在很多应用中可 ...…

查看全部问答>

寻找 编程高手

小弟是 超级下手 有很多不懂请谅解 有种 裸片IC 谁能编这种程序 请联系 122473474 谢谢了…

查看全部问答>

最全面的FPGA课件

共8章,很全面包括altera和xilinx,两个公司的FPGA和相关软件都涉及到,软件操作,语法点,编码风格,还有专门一章涉及实例,源程序附带! 文件列表为: 1.1可编程逻辑器件概述.ppt 1.2 FPGA的设计方法与要求.ppt 1.3 FPGA的设计流程.ppt 1.3 ...…

查看全部问答>

Windows CE 支持 跨进程的com组件吗?

想在ce下做一个com server(exe),然后多个com client(exe)访问server服务,但是CoCreateInstance总取不上接口:( 看见Microsoft Windows CE 5.0 、Windows Mobile 6 SDK 上对CoCreateInstance的第三个参数DWORD dwClsContext,有如下描述: ...…

查看全部问答>

config.status: error: cannot find input file: config.h.in

[root@localhost ntop-3.2]# make cd . && /bin/sh ./missing --run echo cd  && /bin/sh /ntop-3.2/config.status config.h config.status: creating config.h config.status: error: cannot find input file: config.h.in make: * ...…

查看全部问答>

咨询一个流驱动的Init的声明问题?

为啥WinCE5.0帮助上说流驱动的Init函数应该声明为DWORD XXX_Init(LPCTSTR pContext, DWORD dwBusContext);但是时间的串口初始化声明却是为HANDLE COM_Init(ULONG Identifier);到底是怎么回事? 难道两种都可以存在??…

查看全部问答>

下载程序的问题

我在下载程序的时候碰到一个问题,前面下载程序可以,就是校验这一步就说ID号不一样,这样的问题是什么原因造成的多? 下载电路是自己设计制作的 [ 本帖最后由 wurongyan 于 2010-12-20 10:09 编辑 ]…

查看全部问答>

omap-l138 DDR驱动问题

 最近在搞omap-l138 DDR2驱动,DDR芯片是:FMD4A16LCx–30A,遇到问题卡住了。问题是这样的:  发现DDR在操作时,会刷新数据也会变。  测试伪代码:  for(i = 0; i <length;i++) {    p = ddr_addrbase ...…

查看全部问答>

为什么我的ADC12MEM0寄存器读出来最大值是255

为什么我的ADC12MEM0寄存器读出来最大值是255 #include   unsigned char i=0,qianwei=0,baiwei=0,shiwei=0,gewei=0; #include \"1602.c\" unsigned int a[32]; unsigned int sum=0; unsigned int temp=0; void main() {  &n ...…

查看全部问答>