ADC0832介绍
上一篇数字电压表由于转换速率相比ADC0832更慢,因此我们将电路稍加修改,换用ADC0832作为模数转换芯片,现将proteus原理图公布如下:
proteus原理图
一、ADC0832介绍
ADC0832 是美国国家半导体公司生产的一种8 位分辨率、双通道A/D转换芯片,其最高分辨可达256级。体积更小,兼容性,性价比更高。工作频率为250kHz,转换时间为32μS;内部电源输入与参考电压的复用,使得芯片的模拟电压输入在0~5V之间。具有双数据输出可作为数据校验,以减少数据误差,转换速度快且稳定性能强。独立的芯片使能输入,使多器件挂接和处理器控制变的更加方便。通过DI 数据输入端,可以轻易的实现通道功能的选择。
其芯片引脚图如下:
ADC0832芯片引脚图
芯片引脚功能如下:
CS_片选使能,低电平芯片使能
CH0 模拟输入通道0,或作为IN+/-使用。
CH1 模拟输入通道1,或作为IN+/-使用。
GND 芯片参考0 电位(地)
。DI 数据信号输入,选择通道控制。
DO 数据信号输出,转换数据输出。
CLK 芯片时钟输入。
Vcc/REF 电源输入及参考电压输入(复用)。
单片机对ADC0832的控制原理
由于DO端与DI端在通信时并未同时有效并与单片机的接口是双向的,所以电路设计时可以将DO和DI 并联在一根数据线上使用。
ADC0832未工作时,CS输入端 高电平,CLK 、DO/DI 的电平任意,此时芯片禁用
进行A/D转换时,CS输入端 低电平 开始转换 CLK 输入时钟脉冲 DO/DI端则使用DI端输入通道功能选择的数据信号,在第1 个时钟脉冲的下沉之前DI端必须是高电平,表示起始信号。在第2、3个脉冲下沉之前DI端应输入2 位数据用于选择通道功能。
2 位数据为"1"、"0"时,只对CH0 进行单通道转换。
当2位数据为"1"、"1"时,只对CH1进行单通道转换。
当2 位数据为"0"、"0"时,将CH0作为正输入端IN+,CH1作为负输入端IN-进行输入。
当2 位数据为"0"、"1"时,将CH0作为负输入端IN-,CH1 作为正输入端IN+进行输入。
到第3 个脉冲的下沉之后DI端的输入电平就失去输入作用,此后DO/DI端则开始利用数据输出DO进行转换数据的读取。从第4个脉冲下沉开始由DO端输出转换数据最高位DATA7,随后每一个脉冲下沉DO端输出下一位数据。直到第11个脉冲时发出转换数据最低位DATA0,一个字节的数据输出完成。也正是从此位开始输出下一个相反字节的数据,即从第11个字节的下沉输出DATA0。随后输出8位数据,到第19 个脉冲时数据输出完成,也标志着一次A/D转换的结束。最后将CS置高电平禁用芯片,直接将转换后的数据进行处理就可以了。
作为单通道模拟信号输入时ADC0832的输入电压是0~5V,且8位分辨率时的电压精度为19.53mV。如果作为由IN+与IN-输入的输入时,可将电压值设定在某一个较大范围之内,从而提高转换的宽度。但值得注意的是,在进行IN+与IN-的输入时,如果IN-的电压大于IN+的电压则转换后的数据结果始终为00H。
proteus其完整代码如下:
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar Get_AD_Result(); //模数转换结果
void ET0_init(); //定时器0中断
void RT1_init(); //定时器1中断
//ADC0832引脚定义
sbit CS = P1^0;
sbit CLK = P1^1;
sbit DIDO = P1^2;
//数码管位选
sbit W1 = P2^4;
sbit W2 = P2^5;
sbit W3 = P2^6;
sbit W4 = P2^7;
//数码管位选
unsigned char date[4];
//共阴极七段数码
unsigned char code tab[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71,0x00,0X80};
void main()
{
ET0_init(); //定时器0初始化
RT1_init(); //定时器1初始化
ET0 = 1;//允许T0中断
TR0 = 1;//启动定时器T0
ET1 = 1;//允许T1中断
TR1 = 1;//启动定时器T1
EA = 1; //打开总中断
CLK = 0; //ADC0832初始化
CS = 1; //禁用ADC0832
while(1);
}
void ET0_INT() interrupt 1
{
static uchar i;//static 全局变量
TH0 = (65536-2000)/256; // 重装初值
TL0 = (65536-2000)%256;
P2 |= 0xf0; //消影
switch(i) //位选,选择点亮的数码管,
{
case(0):
P0 = date[0];W1 = 0;break;//第一位
case(1):
P0 = date[1];W2 = 0;break;//第二位
case(2):
P0 = date[2];W3 = 0;break;//第三位
case(3):
P0 = date[3];W4 = 0;break; //第四位
}
i++;
if(i==4)
{
i=0;
}
}
void ET1_INT() interrupt 3
{
uint vt;
uchar AD;
TH1 = (65536-2000)/256; // 重装初值
TL1 = (65536-2000)%256;
AD = Get_AD_Result();//获得转换结果 0~255
vt = 1.953*AD; //测量电压值
date[0] =tab[vt/1000];//取第一位
date[1] =tab[vt/100%10]|0x80; //点亮小数点
date[2] =tab[vt/10%10];
date[3] =tab[vt%10];
}
//------------------------------
// 获取AD转换结果(0通道)
//------------------------------
uchar Get_AD_Result() //包含11个CLK下降沿
{
uchar i, dat;
CS = 1; //ADC0832未工作时,CS端为高电平,此时芯片禁用
_nop_; //对于延时很短的,要求在us级的,采用“_nop_”函数
CLK =1;
CS = 0;
DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第一个下降沿来到时,DI = 1启动ADC0832
DIDO = 1; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第二个下降沿
DIDO = 0; CLK = 0; _nop_; CLK = 1; _nop_; //SCLK第三个下降沿,发送1,0选择通道cho
DIDO = 1; //释放总线
for(i = 0; i < 8; i++) //第4个下降沿到第11个下降沿
{
CLK = 0; //clk处于下降沿,每一个下降沿DO端输入下一个
_nop_; //对于延时很短的,要求在us级的,采用_nop_函数
if(DIDO) dat |= 0x01; // dat = dat | 0x01,dat和0x01做“或”的运算,意思是最低位置1,其它位保持不变。
CLK = 1; _nop_; //clk处于上升沿
dat <<= 1; //数据左移
}
return (dat);
CS = 1; //ADC0832停止工作
}
void ET0_init()
{
TMOD &= 0xf0; //TMOD与11110000相与,相与结果,前四位不变,后四位控制定时器T0的被设置为0000,因此选择了内部启动方式,定时器模式 方式0(13位定时器,TH8位,TL低五位)
TMOD |= 0x01;//TMOD与00000001相或,相或结果,前四位为0,后四位控制定时器T0的被设置为0001,因此选择了内部启动方式,定时器模式 方式1(16位定时器)
TH0 = (65536-2000)/256; //2ms溢出 计数器初值:T=(65536-X)*Tcy fosc=12MHz,则Tcy=1us,/256取高八位
TL0 = (65536-2000)%256; //%256取低八位
}
void RT1_init()
{
TMOD &= 0x0f; //TMOD与00001111相与,相与结果,前四位为0,后四位不变,因此选择了T1内部启动方式,定时器模式 方式0(13位定时器,TH8位,TL低五位)
TMOD |= 0x10;//TMOD与00010000相或,相或结果,前四位控制定时器T0的被设置为0001,后四位为0,因此选择了T1内部启动方式,定时器模式 方式1(16位定时器)
TH1 = (65536-2000)/256; //2ms溢出
TL1 = (65536-2000)%256;
}
ADC应用实例---电压表
大家好,前面和大家分享了好多关于ADC的知识,今天来看一个实例,尽管这次用的芯片已经基本上没人用了,但是这不影响我们学习!话不多说了 ,直接上代码。
主函数
#include <reg52.h>
#include "ADC0832.h"
#include "LCD1602.h"
unsigned char code tab1[] = "CurrentVoltage:";
unsigned char code tab2[] = " 0.00 V";
void main()
{
unsigned char i;
int v = 0;
init1602();
write1602_com(0x80);
for(i = 0; tab1[i]; ++i)
write1602_dat(tab1[i]);
write1602_com(0x80 + 0x40);
for(i = 0; tab2[i]; ++i)
write1602_dat(tab2[i]);
while(1) {
v = 5.0 * read0832() / 256 * 100;
write1602_com(0x80 + 0x40 + 3);
write1602_dat('0' + v/100 );
write1602_dat('.');
write1602_dat('0' + v/10%10 );
write1602_dat('0' + v%10 );
}
}
ADC0832驱动函数
sbit CS_0832 = P1^0;
sbit CLK_0832 = P1^1;
sbit DO_0832 = P1^2;// DI、DO不同时有效,可共用一个接口
sbit DI_0832 = P1^2;
extern void _nop_ ( void );
#define pulse0832() _nop_();_nop_();CLK_0832=1;_nop_();_nop_();CLK_0832=0
//把模拟电压值转换成8位二进制数并返回
unsigned char read0832()
{
unsigned char i, ch = 0, ch1 = 0;
CS_0832=0;// 片选,DO为高阻态
DI_0832=1;
// 此处暂停T-SetUp: 250ns (由pulse0832完成)
pulse0832();// 第一个脉冲,起始位,DI置高
DI_0832=1;
pulse0832();// 第二个脉冲,DI=1表示双通道单极性输入
DI_0832=1;
pulse0832();// 第三个脉冲,DI=1表示选择通道1(CH2)
// 51单片机为准双向IO口:应先写入1再读取
DI_0832=1;
// MSB FIRST DATA
for(i = 0; i < 8; ++i) {
pulse0832();
ch <<= 1;
if(DO_0832==1)
ch |= 0x01;
}
// MSB FIRST输出的最后一位与LSB FIRST输出的第一位是在
// 同一个时钟下降沿之后,故此处先执行读取,后执行pulse
// LSB FIRST DATA
for(i = 0; i < 8; ++i) {
ch1 >>= 1;
if(DO_0832==1)
ch1 |= 0x80;
pulse0832();
}
CS_0832=1;// 取消片选,一个转换周期结束
return (ch==ch1) ? ch : 0;// 返回转换结果
}
LCD1602液晶驱动函数
#define LCD1602 P0
sbit LCD_RS = P3^5;
sbit LCD_RW = P3^6;
sbit LCD_EN = P3^4;
#define LCD_RS_0 LCD_RS=0
#define LCD_RS_1 LCD_RS=1
#define LCD_RW_0 LCD_RW=0
#define LCD_RW_1 LCD_RW=1
#define LCD_EN_0 LCD_EN=0
#define LCD_EN_1 LCD_EN=1
#include "delay.h"
#define DELAY_1602 delayms(5)
void write1602_com(unsigned char com)
{
LCD_RS_0;
LCD1602 = com;
DELAY_1602;
LCD_EN_1;
DELAY_1602;
LCD_EN_0;
}
void write1602_dat(unsigned char dat)
{
LCD_RS_1;
LCD1602 = dat;
DELAY_1602;
LCD_EN_1;
DELAY_1602;
LCD_EN_0;
}
void init1602( void )
{
LCD_RW_0;
write1602_com(0x38);
write1602_com(0x0C);
write1602_com(0x06);
write1602_com(0x01);
最后再来一张图
有问题欢迎大家一起讨论、一起学习
相关问答
adc0832 引脚图封装有两种下面是ADC0832的两种封装的引脚图示例:DIP封装:scssCopycode_______CS|120|VCCRD|219|...具体的ADC0832芯片可能会有不同的...
烟雾器MQ2?AD转换芯片 ADC0832 ?温度传感器DS18B20_汽配人问答[最佳回答]1、spi是一个通信协议,spi器件其实就是一个电平转换器不是单片机2、按键去抖就是按键加延时3、ad是电压信号采集4、最小系统是单片机能运作起来...
adc0832 采集的是电压还是电流?ADC0832是一款模拟数字转换器芯片,主要用于测量电压。它将一个连续的模拟电压信号转换成一个数字值,该数字值与输入电压成正比。ADC0832通常用于测量各种传感...
光敏电阻和 adc0832 怎么转换光线强度?用LXD/GB5-A1CV通过串联一个电阻可以很方便地把输出电流转变为电压,其动态感应范围取决于外接电阻和电源(采用5V的电压输入以及10K的电阻可以探测0~160Lu...
单片机 如何通过 ADC 模块采集模拟信号?朋友们好,我是电子及工控技术,我来回答这个问题。众所周知单片机是一种超大规模的集成电路,它只能“读懂”并处理数字信号,对于连续量的模拟信号则无能为力。...
adc0832 为什么能检验数据?因为他本来就是一个用来检验数据的软件因为他本来就是一个用来检验数据的软件
adc 0831是什么输入通道?ADC0831和ADC0832是8位串行I/OA/D转换器。ADC0831是单通道,有输入Vin+和Vin-,有参考电源REF,只有串行数据输出DO。ADC0832是双通道,有通道CH0和C...
大侠们,求教!江西大型的PE单片膜,PE单片膜性能好不好?[回答]单片机咋怎同时驱动74164和74595啊?74164和74595都是串行数据位移成并行的芯片。同时?严格说,单片机对任何两个芯片都不能“同时”驱动,总是有先后...
烦老司机们!询问一下!连云港购买一体化水电专用传感器厂家...[回答]不过不建议你这么用,这样会损失掉精度。推荐你采用专用仪表运放做数据放大之后再接入ADC0832.惠斯通电桥测量有专用的AD转换芯片,用专用芯片你就省...
...盘在 单片机 应用系统中的作用是什么?DAC 0832 与8031 单片机 ...[最佳回答]如果你是一个全职的,你属于学生。只要你是年龄小于24岁的,你可能会被征集服现役。