当前位置: 首页 > news >正文

单片机的ADC

        如何理解ADC。ADC就是将模拟量转换成数字量的过程,就是转换为计算机所能存储的0和1序列,比如将模拟量转换为一个字节,所以这个字节的大小要能反应模拟量的大小,比如一个0-5V的电压测量量(外部输入电压最小0V,最大为5V),将0V对应成0000 0000,将5V对应为1111 1111。一个字节能够表示2^8个状态,所以可以将0-5V这个区域分会成2^8个,每个区域对应5/(2^8)V。

        普中科技单片机的ADC模块的电路图如下所示,ADC模块用的是XPT2046 芯片。

 

参考电压

         参考电压值直接决定ADC的输入范围,参考电压可以使用内部参考 电压,也可以从外部直接输入 1V~VCC范围内的参考电压。如何理解参考电压?

以逐次逼近型ADC为例。

 

ADC的时序

 

 

 相关程序

smg.h

#ifndef _smg_H
#define _smg_H#include "public.h"#define SMG_A_DP_PORT	P0	//使用宏定义数码管段码口//定义数码管位选信号控制脚
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;extern u8 gsmg_code[17];void smg_display(u8 dat[],u8 pos);#endif

smg.c

#include "smg.h"//共阴极数码管显示0~F的段码数据
u8 gsmg_code[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};/*******************************************************************************
* 函 数 名       : smg_display
* 函数功能		 : 动态数码管显示
* 输    入       : dat:要显示的数据pos:从左开始第几个位置开始显示,范围1-8
* 输    出    	 : 无
*******************************************************************************/
void smg_display(u8 dat[],u8 pos)
{u8 i=0;u8 pos_temp=pos-1;for(i=pos_temp;i<8;i++){switch(i)//位选{case 0: LSC=1;LSB=1;LSA=1;break;case 1: LSC=1;LSB=1;LSA=0;break;case 2: LSC=1;LSB=0;LSA=1;break;case 3: LSC=1;LSB=0;LSA=0;break;case 4: LSC=0;LSB=1;LSA=1;break;case 5: LSC=0;LSB=1;LSA=0;break;case 6: LSC=0;LSB=0;LSA=1;break;case 7: LSC=0;LSB=0;LSA=0;break;}SMG_A_DP_PORT=dat[i-pos_temp];//传送段选数据delay_10us(100);//延时一段时间,等待显示稳定SMG_A_DP_PORT=0x00;//消音}
}

xpt2046.h

#ifndef _xpt2046_H
#define _xpt2046_H#include "public.h"//管脚定义
sbit DOUT = P3^7;	  //输出
sbit CLK  = P3^6;	  //时钟
sbit DIN  = P3^4;	  //输入
sbit CS   = P3^5;	  //片选//函数声明
u16 xpt2046_read_adc_value(u8 cmd);#endif

xpt2046.c

#include "xpt2046.h"
#include "intrins.h"/*******************************************************************************
* 函 数 名       : xpt2046_wirte_data
* 函数功能		 : XPT2046写数据
* 输    入       : dat:写入的数据
* 输    出    	 : 无
*******************************************************************************/
void xpt2046_wirte_data(u8 dat)
{u8 i;CLK = 0;_nop_();for(i=0;i<8;i++)//循环8次,每次传输一位,共一个字节{DIN = dat >> 7;//先传高位再传低位dat <<= 1;//将低位移到高位CLK = 0;//CLK由低到高产生一个上升沿,从而写入数据_nop_();	CLK = 1;_nop_();}
}/*******************************************************************************
* 函 数 名       : xpt2046_read_data
* 函数功能		 : XPT2046读数据
* 输    入       : 无
* 输    出    	 : XPT2046返回12位数据
*******************************************************************************/
u16	xpt2046_read_data(void)
{u8 i;u16 dat=0;CLK = 0;_nop_();for(i=0;i<12;i++)//循环12次,每次读取一位,大于一个字节数,所以返回值类型是u16{dat <<= 1;CLK = 1;_nop_();CLK = 0; //CLK由高到低产生一个下降沿,从而读取数据_nop_();dat |= DOUT;//先读取高位,再读取低位。	}return dat;	
}/*******************************************************************************
* 函 数 名       : xpt2046_read_adc_value
* 函数功能		 : XPT2046读AD数据
* 输    入       : cmd:指令
* 输    出    	 : XPT2046返回AD值
*******************************************************************************/
u16 xpt2046_read_adc_value(u8 cmd)
{u8 i;u16 adc_value=0;CLK = 0;//先拉低时钟CS  = 0;//使能XPT2046xpt2046_wirte_data(cmd);//发送命令字for(i=6; i>0; i--);//延时等待转换结果CLK = 1;_nop_();CLK = 0;//发送一个时钟,清除BUSY_nop_();adc_value=xpt2046_read_data();CS = 1;//关闭XPT2046return adc_value;
}

主函数

/**************************************************************************************
深圳市普中科技有限公司(PRECHIN 普中)
技术支持:www.prechin.net
PRECHIN普中实验名称:ADC模数转换实验--电位器电压采集
接线说明:	
实验现象:下载程序后,数码管上显示AD模块采集电位器的电压值
注意事项:																				  
***************************************************************************************/
#include "public.h"
#include "smg.h"
#include "xpt2046.h"/*******************************************************************************
* 函 数 名       : main
* 函数功能		 : 主函数
* 输    入       : 无
* 输    出    	 : 无
*******************************************************************************/
void main()
{	u16 adc_value=0;float adc_vol;//ADC电压值u8 adc_buf[3];while(1){				adc_value=xpt2046_read_adc_value(0x94);//测量电位器adc_vol=5.0*adc_value/4096;//将读取的AD值转换为电压adc_value=adc_vol*10;//放大10倍,即保留小数点后一位adc_buf[0]=gsmg_code[adc_value/10]|0x80;adc_buf[1]=gsmg_code[adc_value%10];adc_buf[2]=0x3e;//显示单位Vsmg_display(adc_buf,6);		}		
}

 

http://www.lryc.cn/news/149849.html

相关文章:

  • 如何把pdf文件合并?分享最新pdf合并方法
  • 笙默考试管理系统-MyExamTest----codemirror(11)
  • Spring MVC 五 - Spring MVC的配置和DispatcherServlet初始化过程
  • Ramp 有点意思的题目
  • 算法通关村14关 | 堆在数组中找第k大的元素应用
  • Unity 顶点vertices,uv,与图片贴图,与mesh
  • Shell编程之函数
  • 10.物联网LWIP之TCP状态转变
  • Img标签的src地址自动拼接本地域名(localhost:8080)导致图片不显示问题
  • 数据结构入门 — 栈
  • Unity Android 之 在Unity 中引入 OkHttp的操作注意(OKHttp4.xx- kotlin 的包)简单记录
  • 内嵌功能强大、低功耗STM32WB55CEU7、STM32WB55CGU7 射频微控制器 - MCU, 48-UFQFN
  • 【测试】笔试03
  • JavaScript的while和for循环
  • mqtt安卓客户端
  • pdf怎么删除其中一页?
  • 10.Redis 渐进式遍历
  • 字符函数和字符串函数(2)
  • 目录扫描+JS文件中提取URL和子域+403状态绕过+指纹识别(dirsearch_bypass403)
  • 【UE 材质】常用向量运算节点——点积、叉积、归一化
  • 音视频 ffmpeg命令提取PCM数据
  • 【MySQL】实现可扩展性:构建高性能的系统
  • 网站用户体验之深度感悟
  • 目标检测YOLO实战应用案例100讲-道路场景下目标检测与分割模型的压缩研究与实现
  • 基于MSP430 红外避障-遥控小车(电赛必备 附项目代码)
  • 大型商城系统功能逻辑架构_各大系统关系设计_OctShop
  • 飞书接入ChatGPT,实现智能化问答助手功能,提供高效的解答服务
  • linux并发服务器 —— 多线程并发(六)
  • Nginx 部署 配置
  • 数据结构:时间复杂度和空间复杂度计算