历史上的今天
今天是: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 在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模数转换之热敏电阻
史海拾趣
|
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的仿真程序。现在我要做个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算法是 精髓,有的研究。这只是我个人看法,不知具体他们的情况如何,还望大家不吝赐教。… 查看全部问答> |
|
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,在看到这个文档的时候(文档名称Getting Started with the MSP430 LaunchPad--- Student Guide and Lab Manual), 发现一个疑似错误,发帖求证一下! 该文档的第36页, 我用的版本是 好像之前的版本也有这 ...… 查看全部问答> |
|
新手求教。除了传统的PWM输入捕获方式测PWM周期和占空比,还有其他方法可以实现么? 例如,信号输入Pin口外部中断exit(双边沿),开定时器TIM3,不同边沿中断时,记下不同的TIM3->cnt的值。 不知道这样可以否? 因为遇到了非TIMx输入通道的信号测频率和占空比问题,所以想到了这个方法。 请教下各位大大! 还有其他更好的方法么 ...… 查看全部问答> |




