点击这里找小助理0元领取:扫码进群领资料
仿照旗子暗记只有通过A/D转化为数字旗子暗记后才能用软件进行处理,这统统都是通过A/D转换器(ADC)来实现的。与模数转换相对应的是数模转换,数模转换是模数转换的逆过程,在一样平常的工业运用系统中传感器把非电量的仿照旗子暗记变成与之对应的仿照旗子暗记,然后经仿照(Analog)到数字(Digital)转换电路将仿照旗子暗记转成对应的数字旗子暗记送微机处理。这便是一个完全的旗子暗记链,仿照到数字的转换过程便是我们常常打仗到的ADC电路。
ADC的转换事理根据ADC的电路形式有所不同。 ADC电路常日由两部分组成,它们是:采样、保持电路和量化、编码电路。个中量化、编码电路是最核心的部件,任何ADC转换电路都必须包含这种电路。 ADC电路的形式很多,常日可以并为两类:

间接法:它是将采样-保持的仿照旗子暗记先转换成与仿照量成正比的韶光或频率,然后再把它转换为数字量。这种常日是采取时钟脉冲计数器,它又被称为计数器式。它的事情特点是:事情速率低,转换精度高,抗滋扰能力强。
直接法:通过基准电压与采样-保持旗子暗记进行比较,从而转换为数字量。它的事情特点是:事情速率高,转换精度随意马虎担保。
三、模数转换的过程:有四个阶段,即采样、保持、量化和编码。
采样是将连续韶光旗子暗记变成离散韶光旗子暗记的过程。经由采样,韶光连续、数值连续的仿照旗子暗记就变成了韶光离散、数值连续的旗子暗记,称为采样旗子暗记。采样电路相称于一个仿照开关,仿照开关周期性地事情。理论上,每个周期内,仿照开关的闭合时间趋近于0。在仿照开关闭合的时候(采样时候),我们就“采”到仿照旗子暗记的一个“样本”。
量化是将连续数值旗子暗记变成离散数值旗子暗记的过程。理论上,经由量化,我们就可以将韶光离散、数值连续的采样旗子暗记变成韶光离散、数值离散的数字旗子暗记。
在电路中,数字量常日用二进制代码表示。因此,量化电路的后面有一个编码电路,将数字旗子暗记的数值转换成二进制代码。
然而,量化和编码总是须要一定韶光才能完成,以是,量化电路的前面还要有一个保持电路。保持是将韶光离散、数值连续的旗子暗记变成韶光连续、数值离散旗子暗记的过程。在量化和编码期间,保持电路相称于一个恒压源,它将采样时候的旗子暗记电压“保持”在量化器的输入端。虽然逻辑上保持器是一个独立的单元,但是,工程上保持器总是与采样器做在一起。两者合称采样保持器。
四、八位串行A/D转换器ADC0832简介:ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片。由于它体积小,兼容性强,性价比高而深受单片机爱好者及企业欢迎,其目前已经有很高的遍及率。ADC083X是市情上常见的串行模—数转换器件系列。ADC0831、ADC0832、ADC0834、ADC0838是具有多路转换开关的8位串行I/O模—数转换器,转换速率较高(转换韶光32uS),单电源供电,功耗低(15mW),适用于各种便携式智能仪表。本章以ADC0832为例,先容其利用方法。
ADC0832是8脚双列直插式双通道A/D转换器,能分别对两路仿照旗子暗记实现模—数转换,可以用在单端输入办法和差分办法下事情。ADC0832采取串行通信办法,通过DI 数据输入端进行通道选择、数据采集及数据传送。8位的分辨率(较高分辨可达256级),可以适应一样平常的仿照量转换哀求。其内部电源输入与参考电压的复用,使得芯片的仿照电压输入在0~5V之间。具有双数据输出可作为数据校验,以减少数据偏差,转换速率快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器掌握变的更加方便。
五、ADC0832特点: · 8位分辨率; · 双通道A/D转换; · 输入输出电平与TTL/CMOS相兼容; · 5V电源供电时输入电压在0~5V之间; · 事情频率为250KHZ,转换韶光为32μS; · 一样平常功耗仅为15mW; · 8P、14P—DIP(双列直插)、PICC 多种封装; · 商用级芯片温宽为0°C to +70°C,工业级芯片温宽为-40°C to +85°C;六、芯片接口解释:adc0832引脚图
· CS_ 片选使能,低电平芯片使能。 · CH0 仿照输入通道0,或作为IN+/-利用。 · CH1 仿照输入通道1,或作为IN+/-利用。 · GND 芯片参考零电位(地)。 · DI 数据旗子暗记输入,选择通道掌握。 · DO 数据旗子暗记输出,转换数据输出。 · CLK 芯片时钟输入。 · Vcc/REF 电源输入及参考电压输入(复用)七、ADC0832的事情时序:正常情形下ADC0832 与单片机的接口应为4条数据线,分别是CS、CLK、DO、DI。但由于DO端与DI端在通信时并未同时利用并与单片机的接口是双向的,以是在I/O口资源紧张时可以将DO和DI并联在一根数据线上利用。当ADC0832未事情时其CS输入端应为高电平,此时芯片禁用,CLK 和DO/DI 的电平可任意。当要进行A/D转换时,须先将CS使能端置于低电平并且保持低电平直到转换完备结束。此时芯片开始转换事情,同时由处理器向芯片时钟(CLK)输入端输入时钟脉冲,DO/DI端则利用DI端输入通道功能选择的数据旗子暗记。
在第一个时钟脉冲的下沉之前DI端必须是高电平,表示启始旗子暗记。
在第二、三个脉冲下沉之前DI端应输入两位数据用于选择通道功能。当此两位数据为“1”、“0”时,只对CH0 进行单通道转换。当2位数据为“1”、“1”时,只对CH1进行单通道转换。当两位数据为“0”、“0”时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。当两位数据为“0”、“1”时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。到第三个脉冲的低落之后DI真个输入电平就失落去输入浸染,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。
从第4个脉冲低落沿开始由DO端输出转换数据最高位Data7,随后每一个脉冲的低落沿DO端输出下一位数据。直到第11个脉冲时发出最低位数据Data0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的低落沿输出Data0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束。末了将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
作为单通道仿照旗子暗记输入时ADC0832的输入电压是0—5V且8位分辨率时的电压精度为19.53mV,即(5/256)V。如果作为由IN+与IN-输入的输入时,可是将电压值设定在某一个较大范围之内,从而提高转换的宽度。但值得把稳的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。
八、代码示例
#include <reg52.h>#include <intrins.h> /已知数据类型重新定义/#define uchar unsigned char#define uint unsigned int /引脚定义///LCD1602#define LCD1602_DB P0//LCD1602数据总线sbit LCD1602_RS = P2^0; //RS端sbit LCD1602_RW = P2^1; //RW端sbit LCD1602_EN = P2^2; //EN端 //ADC0832sbit cs = P1^0;//片选使能,低电平有效sbit clk = P1^1;//芯片时钟输入sbit dio = P1^2;//数据输入DI与输出DO //延时2usvoid Delay_2us(void){_nop_();_nop_();}/=================================================函数名称:Read_Busy函数功能:判断1602液晶忙,并等待=================================================/void Read_Busy(){uchar busy;LCD1602_DB = 0xff;//复位数据总线LCD1602_RS = 0; //拉低RSLCD1602_RW = 1; //拉高RW读do{LCD1602_EN = 1;//使能ENbusy = LCD1602_DB;//读回数据LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿}while(busy & 0x80); //判断状态字BIT7位是否为1,为1则表示忙,程序等待}/=================================================函数名称:LCD1602_Write_Cmd函数功能:写LCD1602命令调用:Read_Busy();输入:cmd:要写的命令=================================================/void LCD1602_Write_Cmd(uchar cmd){Read_Busy(); //判断忙,忙则等待LCD1602_RS = 0;LCD1602_RW = 0;//拉低RS、RW操作时序情形1602课件下中文利用解释基本操作时序章节LCD1602_DB = cmd;//写入命令LCD1602_EN = 1; //拉高使能端 数据被传输到LCD1602内LCD1602_EN = 0; //拉低使能以便于下一次产生上升沿}/=================================================函数名称:LCD1602_Write_Dat函数功能:写LCD1602数据调用:Read_Busy();输入:dat:须要写入的数据=================================================/void LCD1602_Write_Dat(uchar dat){Read_Busy();LCD1602_RS = 1;LCD1602_RW = 0;LCD1602_DB = dat;LCD1602_EN = 1;LCD1602_EN = 0;} /=================================================函数名称:LCD1602_Dis_Str函数功能:在指定位置显示字符串调用:LCD1602_Write_Cmd(); LCD1602_Write_Dat();输入:x:要显示的横坐标取值0-40,y:要显示的行坐标取值0-1(0为第一行,1为第二行)str:须要显示的字符串=================================================/void LCD1602_Dis_Str(uchar x, uchar y, uchar str){if(y) x |= 0x40;x |= 0x80;LCD1602_Write_Cmd(x);while(str != '\0'){LCD1602_Write_Dat(str++);}}/=================================================函数名称:Init_LCD1602函数功能:1602初始化调用:LCD1602_Write_Cmd();=================================================/void Init_LCD1602(){LCD1602_Write_Cmd(0x38); //设置162显示,57点阵,8位数据接口LCD1602_Write_Cmd(0x0c); //开显示LCD1602_Write_Cmd(0x06); //读写一字节后地址指针加1LCD1602_Write_Cmd(0x01); //打消显示}/函数简介:获取ADC0832数据函数名称:ADC_read_data(bit channel)参数解释:ch为入口参数,ch=0选择通道0,ch=1选择通道1函数返回:返回读取到的二进制ADC数据,格式为unsigned char 当返回一贯0时,转换数据有误/uchar ADC_read_data(bit channel){uchar i,dat0=0,dat1=0; //------第1次低落沿之前di置高,启动旗子暗记--------- cs=0;//片选旗子暗记置低,启动AD转换芯片clk=0;//时钟置低平dio=1; //开始旗子暗记为高电平Delay_2us();clk=1;//产生一个正脉冲,在时钟上升沿,输入开始旗子暗记(DI=1)Delay_2us(); clk=0;//第1个时钟低落沿dio=1;Delay_2us();clk=1; // 第2个低落沿输入DI=1,表示双通道单极性输入Delay_2us(); //------在第2个低落沿,仿照旗子暗记输入模式选择(1:单模旗子暗记,0:双模差分旗子暗记)---------clk=0;dio=channel; // 第3个低落沿,设置DI,选择通道;Delay_2us();clk=1;Delay_2us(); //------在第3个低落沿,仿照旗子暗记输入通道选择(1:通道CH1,0:通道CH0)------------clk=0;dio=1; //第四个低落沿之前,DI置高,准备吸收数 Delay_2us();for(i=0;i<8;i++) //第4~11共8个低落沿读数据(MSB->LSB){clk=1;Delay_2us();clk=0;Delay_2us();dat0=dat0<<1|dio;}for(i=0;i<8;i++) //第11~18共8个低落沿读数据(LSB->MSB){dat1=dat1|((uchar)(dio)<<i);clk=1;Delay_2us();clk=0;Delay_2us();} cs=1; return (dat0==dat1)?dat0:0; //判断dat0与dat1是否相等} void main(){uchar adc = 0;uint voltage = 0;uchar LED_buffer1[16] = {" ADC: "};//ADC显示缓冲uchar LED_buffer2[16] = {"voltage: V "};//电压显示缓冲Init_LCD1602();//1602初始化while(1){adc = ADC_read_data(0);//读取adc值voltage = adc 500.0 / 255;//将adc值换算成电压LED_buffer1[9] = adc / 100 + '0';//取adc百位LED_buffer1[10] = adc % 100 / 10 + '0';//取adc十位LED_buffer1[11] = adc % 10 + '0';//取adc个位 LED_buffer2[9] = voltage / 100 + '0';//取电压个位LED_buffer2[10] = '.';//小数点LED_buffer2[11] = voltage / 10 % 10 + '0';//取电压十分位LED_buffer2[12] = voltage % 10 + '0';//取电压百分位LCD1602_Dis_Str(0, 0, &LED_buffer1[0]);//显示字符串LCD1602_Dis_Str(0, 1, &LED_buffer2[0]);//显示字符串}}