ADC0832

  • 格式:doc
  • 大小:133.50 KB
  • 文档页数:7

1 ADC0832设计模块

1、ADC0832的主要技术指标:

(1) 8位分辨率,逐次逼近型。

(2) 5V电源供电时,基准电压为5V,输入模拟电压范围为0~5V。

(3) 输入和输出电平与TTL和CMOS兼容。

(4) 有两个可供选择的模拟输入通道。

(5) 在250KHz时钟频率时,转换时间为32µs。

(6) 一般功耗仅为15mW。

2、ADC0832引脚说明

(1) /CS片选使能,低电平有效。

(2) CHO模拟通道0,差分输入时,作为IN+或IN-使用。

(3) CH1模拟输入通道1,差分输入时,作为IN+或IN-使用。

(4) GND 电源地。

(5) DI数据信号输出,选择通道控制。

(6) DO数据信号输出,转换数据输出。

(7) Vcc/Vre电源输入及参考电压输入(复用)。

(8) CLK芯片时钟信号

3、ADC0832时序图

2 4、运用ADC0832

设计一个0-5V的数字电压表

电路如图所示:

3

设计要求:

五位数码管动态显示,第一位显示通道状态(0、1)第二位显示C,第三位是个数,第三位和第四位数码管分别显示十分位和百分位;按键SW1选择通道0,按键SW2选择通道1,并且蜂鸣器和短时间鸣叫;调节滑动变阻器数码管的示数能在0.00~5.00之间变化。

C程序:

/************************************************

CAUC

yeyongan

*************************************************/

#include

#include

#define uchar unsigned char

sbit CS=P3^5;

sbit Clk=P1^6; //时钟

sbit DO=P3^7; //ADC0832输出引脚

sbit DI=P3^6; //ADC0832输入引脚

sbit key=P3^3; //按键

bit keydownflg; //操作位的定义

bit adc_flg;

uchar dat,channel;

uchar key_buffer;

uchar P2_buffer;

uchar Beep_cnt;

uchar disp_cnt;

uchar count4ms;

uchar disp_buff[5]; //数码管显示缓存

uchar code

Tab1[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E}; //共阳数码表

uchar code Tab[5]={0x7f,0xbf,0xdf,0xef,0xf7}; //数码管位选表

uchar A_D(uchar CH) //AD函数

{

uchar i,adval,test; //定义局部变量并初始化

adval=0x00;

4 test=0x00;

Clk=0; //clk低电平

DI=1; //DI初始高电平在第一个时钟脉冲的下降沿前保持高电平,表示启动信号

_nop_();

CS=0; //片选

_nop_();

Clk=1; //clk上升沿,起始位写入

_nop_();

if(CH==0x00) //选择通道0

{

Clk=0; //clk低电平

DI=1;

_nop_();

Clk=1; //clk上升沿,通道0的第一位写入

_nop_();

Clk=0;

DI=0;

_nop_();

Clk=1; //clk上升沿,通道0的第二位写入

_nop_();

}

else

{

Clk=0;

DI=1;

_nop_();

Clk=1; //clk上升沿,通道1的第一位写入

_nop_();

Clk=0;

DI=1;

_nop_(); //clk上升沿,通道1的第二位写入

Clk=1;

_nop_();

}

Clk=0;

DI=1;

for(i=0;i<8;i++) //从高位向低位读取八位AD值

{

_nop_();

adval<<=1;

Clk=1;

_nop_();

Clk=0;

5 if(DO)

adval|=0x01;

else

adval|=0x00;

}

for(i=0;i<8;i++)

{

test>>=1; //从低位向高位读取八位AD值

if(DO)

test|=0x80;

else

test|=0x00;

_nop_();

Clk=1;

_nop_();

Clk=0;

}

if(adval==test) dat=test; //判断两个读取值是否相等相等就把读取的数赋值给DAT

_nop_();

CS=1;

DO=1;

Clk=1;

return dat;

}

void FillDispBuffer(void) //数码管显示缓存函数

{

disp_buff[0]=channel; //显示通道

disp_buff[1]=12; //显示"C"

disp_buff[2]=dat/51; //显示个位

disp_buff[3]=dat%51*10/51; //显示十分位

disp_buff[4]=((dat%51)*10%51)*10/51; //显示百分位

}

void dealkey(void) //按键处理

{

if(keydownflg) return; //keydownflg控制位为1,不对按键进行处理

key_buffer=P2;

if((key_buffer&0x80)!=0x80) channel=0; //选择通道0

if((key_buffer&0x40)!=0x40) channel=1; //选择通道1

FillDispBuffer(); //数码管显示缓存

6 Beep_cnt=0;

keydownflg=1; //keydownflg控制位置1

}

void main(void) //主函数

{

P0=0xff; //初始化

P2=0xff;

dat=0x00;

disp_cnt=0;

count4ms=0;

channel=0;

TMOD=0x10;

TH0=(65535-4000)/256;

TL0=(65535-4000)%256;

EA=1;

TR0=1;

ET0=1;

while(1)

{

if(adc_flg) //ADC转换控制位,防止输入与输出产生冲突

{

adc_flg=0;

A_D(channel); //ADC函数

FillDispBuffer(); //数码管显示缓存

}

if(!key) //按键

dealkey();

}

}

void T0_service(void) interrupt 1 //定时器0中断子函数

{

TH0=(65535-4000)/256;

TL0=(65535-4000)%256;

P2_buffer=Tab[disp_cnt]; //查表,数码管的位选择

if(keydownflg) //蜂鸣器0.4s的短时间鸣叫

{

P2_buffer=P2_buffer&0xfe;

Beep_cnt++;

if(Beep_cnt==100) keydownflg=0;

}

P2=P2_buffer; //数码管显示数字符号

if(disp_cnt==2) //第三位数码管显示小数点

P0=Tab1[disp_buff[disp_cnt]]&0x7f;

7 else

P0=Tab1[disp_buff[disp_cnt]];

disp_cnt++; //

if(disp_cnt==5) disp_cnt=0;

count4ms++;

if(count4ms==50) //0.2s ADC转换一次

{

adc_flg=1;

count4ms=0;

}

}