历史上的今天
返回首页

历史上的今天

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

正在发生

2021年11月01日 | AD转换之外部输入AD值

2021-11-01 来源:eefocus

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;

}

推荐阅读

史海拾趣

Apex [Apex Microtechnology]公司的发展小趣事

在作为Cirrus Logic分公司运营了五年后,Apex Microtechnology于2012年重新回归独立私营状态。这次变革使得Apex Microtechnology能够更加灵活地应对市场变化,加速产品创新和研发。同时,公司也扩大了其业务范围,进一步巩固了在电子行业的地位。

ECM [ECM Electronics Limited.]公司的发展小趣事

在竞争激烈的电子行业中,品质是企业生存和发展的关键。ECM Electronics Limited.深知这一点,始终将产品质量放在首位。公司建立了严格的质量管理体系,从原材料采购到产品生产、检测、包装等各个环节都严格把关,确保每一件产品都符合高标准的质量要求。正是凭借过硬的产品品质,ECM赢得了客户的信赖和市场的认可。

Hitachi Metals公司的发展小趣事

随着汽车工业向智能化、电动化方向发展,Hitachi Metals敏锐地捕捉到了这一趋势带来的商机。公司加大了对汽车电子部件的研发和生产投入,特别是在汽车活塞环材料领域取得了显著成就。其生产的钢制活塞环材料在日本市场占据领先地位,不仅为众多汽车制造商提供了高质量的产品,还通过技术创新不断提升产品的附加值。此外,公司还积极拓展汽车电子控制单元(ECU)等关键部件的市场,进一步巩固了其在汽车电子领域的地位。

Allen Avionics Inc公司的发展小趣事

面对数字化浪潮的冲击,Hitachi Metals积极拥抱变革,致力于数字化转型。公司推出了全球级别的物联网平台Lumada,该平台能够为客户提供从企业扩建、价值核查到设备和系统管理的全方位解决方案。Lumada平台的成功应用不仅提升了日立金属自身的运营效率和管理水平,还为客户带来了显著的价值增长。通过Lumada平台,日立金属与全球范围内的合作伙伴建立了更加紧密的联系,共同推动电子行业的数字化转型进程。

上海超致公司的发展小趣事

上海超致始终重视品牌建设,公司拥有一系列注册商标和专利信息,这些知识产权的拥有为公司树立了良好的品牌形象。同时,上海超致还积极开展国际合作,与国际知名企业建立了长期合作关系,共同开发新产品、拓展新市场。这些国际合作不仅提升了公司的技术水平,也帮助公司打开了国际市场的大门。

正泰公司的发展小趣事

为了在全球市场上保持领先地位,正泰建立了北美、欧洲、亚太等三大全球研发中心,并与清华大学、上海交大等国内外知名院校、机构展开合作,探索“产学研”融合模式。通过整合全球创新资源,正泰在智能电网、新能源电车充电设施等前沿领域取得了一系列创新进展。这种全球研发体系的建立,不仅提升了公司的研发能力,也增强了公司的市场竞争力。

问答坊 | AI 解惑

STM32F103Z核心板,板载512K SRAM/64M NAND flash

http://item.taobao.com/auction/item_detail-db2-2494f2cca7bcf576c2eb50164b94ab8e.htm QQ:21578936 资源: 1:REV1.1版 STM32F103Z核心板,板载512K SRAM/64M NAND flash 2:引出所有I/O口 3:独立BOOT跳针 4:20PIN标准JTAG接口(支持JTA ...…

查看全部问答>

VS2005 Wince5.0 模拟器 连接的问题!

   我这个问题好像是新手必问的问题。     在VS2005,没有Wince5.0的仿真程序。现在我要做个Wince5.0 的应用程序,想调测,就必须先接设备。 接设备我是通过ActiveSync4.5做的。     问题是我习惯开发时每一段代 ...…

查看全部问答>

一种电子元件的特性讲解

  该TDA3560设计为一个3毫米功率LED具有某些特点:(1)高通量输出;(2)超薄;(3)较低的热阻;(4)低功耗;(5)在反射的荧光粉转换的氮化铟镓蓝色发光芯 片到理想的白色;(6)典型的色度坐标x = 0.30,y = 0.29根据CIE1931;(7)本产品本身将保持在符合R ...…

查看全部问答>

如何查看自己回复的话题?

请教大家:论坛有米有查看“我的回复”的功能? 找了很久都没找到哦………

查看全部问答>

请教:在掌握51的基础上,进一步提高是学习ARM呢还是DSP好点呢?学习他们有什么分别?

我想请教大家,现在我对51有一定掌握了,想进一步提高一下,DSP和ARM学习那个好点呢?他们的应用前景怎样?学习起来难易程度又如何?我本人偏向DSP,DSP算法是 精髓,有的研究。这只是我个人看法,不知具体他们的情况如何,还望大家不吝赐教。…

查看全部问答>

【团购】FSL USB学习板(05月18日-06月18日)

USB学习板做完了,最近做了批,大家如果需要可以参与本次团购活动。   团长备案号: EEWORLD_005 团长承诺:我已经详细阅读过论坛自发团购规则,并愿意严格遵照此规则执行,愿意为大家提供货真价实、物美价廉的产品。 【征询贴】链接:ht ...…

查看全部问答>

keil 下编译LM3S9B96官方例程boot_eth出错

官方提供的StellarisWare\\boards\\dk-lm3s9b96\\boot_eth\\ 使用keil的工程编译,出现下面提示: Build target \'boot_eth\'User command #1: armcc --device DLM -I . -E -o bl_config.inc ..\\..\\..\\boot_loader\\bl_config.c--- Error: User ...…

查看全部问答>

发现LaunchPad资料文档的一个疑似错误,求证!

最近学习LaunchPAD,在看到这个文档的时候(文档名称Getting Started with the MSP430 LaunchPad--- Student Guide and Lab Manual), 发现一个疑似错误,发帖求证一下! 该文档的第36页, 我用的版本是 好像之前的版本也有这 ...…

查看全部问答>

新手求教。除了传统的PWM输入捕获方式测PWM周期和占空比,还有其他方法可以实现么?

例如,信号输入Pin口外部中断exit(双边沿),开定时器TIM3,不同边沿中断时,记下不同的TIM3->cnt的值。 不知道这样可以否? 因为遇到了非TIMx输入通道的信号测频率和占空比问题,所以想到了这个方法。 请教下各位大大! 还有其他更好的方法么 ...…

查看全部问答>

如何让电源为电池充电提供最大功率

如何让电源为电池充电提供最大功率转自德州仪器 \0\0\0eeworldpostqq…

查看全部问答>