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其完整代码如下:

defineuintunsignedint

ucharGet_AD_Result();//模数转换结果

voidET0_init();//定时器0中断

voidRT1_init();//定时器1中断

//ADC0832引脚定义

sbitCS=P1^0;

sbitCLK=P1^1;

sbitDIDO=P1^2;

//数码管位选

sbitW1=P2^4;

sbitW2=P2^5;

sbitW3=P2^6;

sbitW4=P2^7;

//数码管位选

unsignedchardate[4];

//共阴极七段数码

unsignedcharcodetab[18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,0x39,0x5e,

0x79,0x71,0x00,0X80};

voidmain()

{

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);

}

voidET0_INT()interrupt1

{

staticuchari;//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;

}

}

voidET1_INT()interrupt3

{

uintvt;

ucharAD;

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通道)

//------------------------------

ucharGet_AD_Result()//包含11个CLK下降沿

{

uchari,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;i8;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停止工作

}

voidET0_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)*Tcyfosc=12MHz,则Tcy=1us,/256取高八位

TL0=(65536-2000)%256;//%256取低八位

}

voidRT1_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;

}

发布于 2025-05-12
154
目录

    推荐阅读