建设部建设厅报考网站,如何扫描网站漏洞,响应式建设网站,wordpress缩略图排列✅作者简介#xff1a;嵌入式领域优质创作者#xff0c;博客专家 ✨个人主页#xff1a;咸鱼弟 #x1f525;系列专栏#xff1a;单片机设计专栏 #x1f4c3;推荐一款求职面试、刷题神器#x1f449;注册免费刷题 目录
一、描述
二、模数转换原理#xff1a;
三、… ✅作者简介嵌入式领域优质创作者博客专家 ✨个人主页咸鱼弟 系列专栏单片机设计专栏 推荐一款求职面试、刷题神器注册免费刷题 目录
一、描述
二、模数转换原理
三、模数转换的过程
四、八位串行A/D转换器ADC0832简介
五、ADC0832特点
六、芯片接口说明
七、ADC0832的工作时序
八、代码示例 一、描述 模拟信号只有通过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作为正输入端INCH1作为负输入端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/256V。如果作为由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端//ADC0832
sbit cs P1^0;//片选使能低电平有效
sbit clk P1^1;//芯片时钟输入
sbit dio P1^2;//数据输入DI与输出DO//延时2us
void 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-40y要显示的行坐标取值0-10为第一行,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); // 设置16*2显示5*7点阵8位数据接口LCD1602_Write_Cmd(0x0c); //开显示LCD1602_Write_Cmd(0x06); //读写一字节后地址指针加1LCD1602_Write_Cmd(0x01); //清除显示
}
/*****************************************
函数简介获取ADC0832数据
函数名称ADC_read_data(bit channel)
参数说明ch为入口参数ch0选择通道0ch1选择通道1
函数返回返回读取到的二进制ADC数据格式为unsigned char当返回一直0时转换数据有误
******************************************/
uchar ADC_read_data(bit channel)
{uchar i,dat00,dat10;//------第1次下降沿之前di置高启动信号---------cs0; //片选信号置低启动AD转换芯片clk0; //时钟置低平dio1; //开始信号为高电平Delay_2us();clk1; //产生一个正脉冲,在时钟上升沿输入开始信号DI1Delay_2us();clk0; //第1个时钟下降沿dio1;Delay_2us();clk1; // 第2个下降沿输入DI1表示双通道单极性输入Delay_2us(); //------在第2个下降沿模拟信号输入模式选择1单模信号0双模差分信号--------- clk0; diochannel; // 第3个下降沿,设置DI选择通道;Delay_2us();clk1;Delay_2us();//------在第3个下降沿模拟信号输入通道选择1通道CH10通道CH0------------ clk0;dio1; //第四个下降沿之前DI置高准备接收数 Delay_2us(); for(i0;i8;i) //第4~11共8个下降沿读数据MSB-LSB{clk1;Delay_2us();clk0;Delay_2us();dat0dat01|dio;}for(i0;i8;i) //第11~18共8个下降沿读数据LSB-MSB{dat1dat1|((uchar)(dio)i);clk1;Delay_2us();clk0;Delay_2us();} cs1; return (dat0dat1)?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]); //显示字符串}
}