ADC0832
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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时序图
4、运用ADC0832
设计一个0-5V的数字电压表电路如图所示:
设计要求:
五位数码管动态显示,第一位显示通道状态(0、1)第二位显示C,第三位是个数,第三位和第四位数码管分别显示十分位和百分位;按键SW1选择通道0,按键SW2选择通道1,并且蜂鸣器和短时间鸣叫;调节滑动变阻器数码管的示数能在0.00~5.00之间变化。
C程序:
/************************************************
CAUC
yeyongan
*************************************************/
#include <reg52.h>
#include <intrins.h>
#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,0 xA1,0x86,0x8E}; //共阳数码表
uchar code Tab[5]={0x7f,0xbf,0xdf,0xef,0xf7}; //数码管位选表
uchar A_D(uchar CH) //AD函数
{
uchar i,adval,test; //定义局部变量并初始化
adval=0x00;
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;
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(); //数码管显示缓存
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;
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;
}
}。