adc0834工作原理及AD转换

ad0832是8位逐次逼近模数转换器,可支持两个单端输入通道和一个差分输入通道。是8位逐次逼近模数转换器,可支持两个单端输入通道和一个差分输入通道。
当adc0832未工作时其cs输入端应为高电平,此时芯片禁用,当要进行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+进行输入。
在完成输入启动位、通道选择之后,就可以开始读出数据,转换得到的数据会被送出二次,一次高位在前传送,一次低位在前传送,连续送出。在程序读取二个数据后,我们可以加上检验来看看数据是否被正确读取。
由于adc0832是8位分辨率,返回的数值在0~255之间,对应模拟数值为0~5v,因此每一档对应的电压值约为0.0196v。大家可以在通道输入端引入模拟信号(0~5v)进行测试,比如可以在通道脚和地之间接入电池来测试电池电压值。为使两位数码管显示电压值大小,在写程序是可将对应比值改位0.196,同理,如果想要显示精度更高,可用三位或四位显示,那么响应的改一下比值为1.96或19.6,当然,需要注意你所得数据的大小是否超出数据类型的大小。
时序图
基于adc0834的ad转换 /*----------------------------------------------------------
功能介绍:
-----------------------------------------------------------*/
#include 《reg52.h》 #include 《stdio.h》
#include 《math.h》
#define uchar unsigned char
#define uint unsigned int
#define ucode unsigned code
/*--------------------------------------------
包含函数
---------------------------------------------*/
void disp(void); //数码管显示函数
void key(void);//矩阵键盘函数
void _nop_(void);
void ad_buf(); //模拟量转化为数字函数
uchar adc0834(uchar tds); //ad转换函数
/*-------------------------------------------
参数定义
-------------------------------------------*/
uchar bdata ekey1; //键前沿提取
uchar bdata ekey2;
uchar data key2;
uchar data key1;
uchar bdata lastkey1;
uchar bdata lastkey2;
uchar disp_a;//数码管显示指针
sbit cs0=p2^0;
sbit cs1=p2^1;
sbit cs2=p2^2;
sbit cs3=p2^3;
sbit cs4=p2^4;
sbit esw0=ekey2^6; //独立按键键沿标志
sbit esw1=ekey2^7; //
sbit ek0=ekey1^0; //矩阵按键键沿标志
sbit ek1=ekey1^1;
sbit ek2=ekey1^2;
sbit ek3=ekey1^3;
sbit ek4=ekey1^4;
sbit ek5=ekey1^5;
sbit ek6=ekey1^6;
sbit ek7=ekey1^7;
sbit ek8=ekey2^0;
sbit ek9=ekey2^1;
sbit row0=p2^5;
sbit row1=p2^6;
sbit row2=p2^7;
sbit sw0=p1^6;
sbit sw1=p1^7;
sbit do_0834=p1^0;//0834 di
sbit cs_0834=p1^1; //0834 片选
sbit di_0834=p1^2; //0834 di
sbit clk_0834=p1^3; // 0834 时钟
sbit dian=p0^7; // 小数点
uchar buf0; // 显示缓冲单元个位
uchar buf1; // 十
uchar buf2; // 百
uchar buf3; //千
uchar buf4;
uchar code led[]={0x0c0,0x0f9,0x0a4,0x0b0,0x99,0x92,0x82,0x0f8,0x80,0x90};
uchar msta=0;
uchar tds;//通道选择
uint adbuf;
bit t1s;//一秒标志位
bit light; //小数点亮标志位
uchar ktime;
/*-------------------------------------------
主函数
-------------------------------------------*/
void main()
{ uchar f1s=0;
uchar i;
tmod=0x01;
th0=0xec;
tl0=0x78;
tr0=1;
while(1)
{
while(!tf0); //5ms?
tf0=0;
th0=0x0ec;
tl0=0x78;
++f1s;
if(f1s==200)
{t1s=1;
f1s=0;}
key();
disp();
switch(msta)
{ //待机模块 显示“0000”
case 0:if(esw0){msta=1;tds=0xd0;}//sw1按下跳到模块1 选择单端模式 ad一次
if(esw1){msta=1;tds=0x80;}//sw2按下跳到模块1 选择差分模式 ad一次
if(ek0){msta=2;tds=0xd0;}// ek0按下跳到模块2 选择单端模式 十次ad取平均
if(ek1){msta=2;tds=0x80;}//ek1按下跳到 模块2 选择差分模式 十次ad取平均
if(ek2){msta=3;tds=0xd0;}// ek2按下跳到模块3 选择单端模式 一秒ad一次
if(ek3){msta=3;tds=0x80;}// ek3按下跳到模块3 选择差分模式 一秒ad一次
buf4=0,buf3=0,buf2=0,buf1=0;
buf0=0;
break;
case 1:if(esw0){msta=1;tds=0xd0;} //只ad一次
if(esw1){msta=1;tds=0x80;}
light=1;//小数点亮
adbuf=adc0834(tds);
ad_buf(); break;
case 2:if(ek0){msta=2;tds=0xd0;} //ad十次取平均
if(ek1){msta=2;tds=0x80;}
light=1;
for(i=0;i《10;i++)
{adbuf=adbuf+adc0834(tds);}
adbuf=adbuf/11;
ad_buf();
break;
case 3:if(ek2){msta=3;tds=0xd0;} //一秒ad一次
if(ek3){msta=3;tds=0x80;}
light=1;
if(t1s)
{t1s=0;
adbuf=adc0834(tds);
ad_buf();}
break;
default:break;
}
}
}
/*-----------------------------------------------
数码管显示
------------------------------------------------*/
void disp()
{ p0=0xff;
p2=0xff;
switch(disp_a)
{ case 0: cs0=0; // 点亮第0位数码管
p0=led[buf0];
disp_a=1;
break;
case 1: cs1=0; // 点亮第1位数码管
p0=led[buf1];
disp_a=2;
break;
case 2: cs2=0; // 点亮第2位数码管
p0=led[buf2];
disp_a=3;
break;
case 3: cs3=0; // 点亮第3位数码管
p0=led[buf3];
if(light)
dian=0; //小数点亮
disp_a=4;
break;
case 4: cs4=0; // 点亮流水灯
p0=buf4;
disp_a=0;
break;
default:break;
}
}
/*-------------------------------------------------------
矩阵键盘及独立按键子程序
------------------------------------------------------------*/
void key()
{uchar kbuf;
p2=0x0ff;//关数码管
row0=0; //扫描k0~3
_nop_(); //延时
_nop_();
kbuf=p2;
kbuf=(kbuf&0x0f)^0x0f;
//k0~3键位保留 求反转正逻辑
lastkey1=kbuf; // 新的键状态暂存r6
p2=0x0ff;
row1=0; //扫描k4~7
_nop_();
_nop_();
kbuf=p2;
kbuf=(kbuf&0x0f)^0x0f;
lastkey1=(kbuf《《4)+lastkey1;
p2=0x0ff;
row2=0;//扫描k8~k11
_nop_();
_nop_();
kbuf=p2;
kbuf=(kbuf&0x0f)^0x0f;
lastkey2=kbuf;
p2=0x0ff;
p1=p1|0x0c0;
kbuf=p1;
kbuf=(kbuf&0x0c0)^0x0c0;
lastkey2=kbuf+lastkey2;
if((lastkey2!=key2)||(lastkey1!=key1))//键状态变化则转移
{if(ktime--!=0)
{lastkey1=key1;
lastkey2=key2;}
}
else
ktime=0x04;
ekey1=(key1^lastkey1)&lastkey1;
key1=lastkey1;
ekey2=(key2^lastkey2)&lastkey2;
key2=lastkey2; }
/************************************************************
ad转换
************************************************************/
uchar adc0834(uchar tds)
{
uchar i,adbuf=0; cs_0834=0; for(i=0;i《5;i++)
{
clk_0834=0;
di_0834=0;
if(tds&0x80)
di_0834=1;
clk_0834=1;
tds《《=1;
}
do_0834=1;
for(i=0;i《8;i++)
{
clk_0834=0;
clk_0834=1;
adbuf=(adbuf《《1)|do_0834;
}
cs_0834=1;
return(adbuf);
}
/*****************************************************************
模拟量转化为数字并送显
******************************************************************/
void ad_buf()
{
buf4=adbuf%51*10%51*10%51*10/51;//
流水灯
buf3=adbuf/51; //个位
buf2=adbuf%51*10/51;//十分位
buf1=adbuf%51*10%51*10/51;//百分位
buf0=adbuf%51*10%51*10%51*10/51;// 千分位
}

技术变革!配备水冷换刀装置的高端开源打印机
喜报|英码科技荣获第一届广州粤港澳大湾区中小企业创新创业大赛优胜奖!
Dynamsoft--如何在Glide应用程序中扫描条形码
CCD视觉成熟项目 摆盘机
跨步电压是什么意思
adc0834工作原理及AD转换
PL2101实现的低压电力线载波通信接口扩展
生物特征数据的安全是AI的下一个重要使命
400G是超高速大容量光传输网的重要演进方向
频间硬切换实现的机制,以及对RNC性能的影响
国内有超过90%的手机支持北斗导航系统,多家品牌都采用了北斗芯片
联想新ThinkPad X1 Carbon来了!实用性吊打苹果MacBook
“廉价”小米能赚钱的几种原因
人工智能技术,利弊并存双刃剑特征突出,怎样防止技术隐含的安全风险
与5G相关的应用产品未来将向何处发展?
Profibus-DP转Profinet网关的配置案例
wlan和wifi的区别和关系分析
增益或编程放大电路
IIC-China今日开幕 你不可错过的几站!
新型感测帽 可探测员工忧郁、焦虑或愤怒等情绪