您的位置 首页 设计

ADC0832检测模仿电压值

=============================================================================================“““`

=============================================================================================

“““““““““““““““程序思维““““““““““““““`

AD0832与AD08004有所不同,AD0804的数据是并行输出,而AD0832是串行输出,其思维略有杂乱。

依据ADC0832的时序,首要选通芯片,在第一个脉冲下沿前让addi为高,在第二个下沿前给addi1位数据,在第三个下沿前给addi1位数据,
两位数据为10时选通CH0,为11时选通CH1; 在第三个下沿后开端接纳数据。

数据接纳中心思维:
1、以dat来接纳从高位到低位传回来的数据,分8次顺次接纳。dat每接纳一位后向高位移1位,最低位与下一位接纳到的数据
相或,直到接纳到8位。
2、以ndat来接纳从低位到高位传回来的数据,分8次顺次接纳。 用参数j来接纳1位数据,ndat来存储接纳到的8位数据。当j接纳到1位数据今后
向左移7位,到最高位,然后与ndat相或,行将数据传给ndat,ndat每接纳到1位今后,其数据向右移1位,直到7位传完。最终将接纳到的数据传回即可。

AD00832接纳数据共分为19个时钟脉冲,由单片机供给。前三个为初始化,第四个到第11个为高位在先数据,第11到第19个为低位在先数据。

从AD中读到的数据并非为实在的电压值,仅仅一个虚拟量。真是的电压值为

V=date*VREF/256,(VREF为外部供给的基准电压,即AD给供电的VCC)

*********************转载请注明出处,谢谢!*********************

==============================================================================================

#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={0x3F, //”0″
0x06, //”1″
0x5B, //”2″
0x4F, //”3″
0x66, //”4″
0x6D, //”5″
0x7D, //”6″
0x07, //”7″
0x7F, //”8″
0x6F, //”9″
};

//端口界说
sbit adcs=P3^3; //芯片选通信号,低有用
sbit adclk=P3^2; //芯片时钟信号
sbit addo=P3^7; //通道0
sbit addi=P3^6; //通道1
uchar date;
int a,b,c;

void delay(uchar z)//延时函数
{
uchar x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–);
}

void delay1() //延时两个空指令
{
_nop_();
_nop_();
}

int ADconvert() //AD转化

{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;

addi=1;
delay1();
adcs=0; //芯片选通
delay1();
adclk=1; //
delay1();
adclk=0; //下降沿1
delay1();
adclk=1; //
addi=0;
delay1();
adclk=0; //下降沿2
delay1();
adclk=1; //
addi=1; //挑选通道
delay1();
adclk=0; //下降沿3
addi=1;
delay1();
dat=0;
for(i=0;i<8;i++) //串行接纳数据高位在前
{
dat|=addo; //将addo数据给dat
adclk=1; //拉高
delay1();
adclk=0;//拉低,循环时钟
delay1();
dat<<=1;//将数据向左移动1位,便利低位接纳下一位数据
if(i==7)
dat|=addo;//最终一位数据直接赋给dat
}
for(i=0;i<8;i++) //串行接纳数据低位在前
{
j=0; //每次接纳前复位为0
j|=addo;//j用来接纳1位数据
adclk=1; //拉高
delay1();
adclk=0;//拉低,循环时钟
delay1();
j<<=7;//将接纳到的数据移动到最高位
ndat=ndat|j; //将接纳到的数据传给ndat
if(i<7)
ndat>>=1; //每接纳到1为数据,ndat向右移动1位
}
adcs=1;
adclk=0;
addo=1; //回到初始状况
dat<<=8; //int型数据为16位,将接纳到的8位数据移到高8位,
dat|=ndat;
return(dat);
}

void display() //数码管显现
{
P1=0xf0;
P2=table[a];
delay(10);
P1=0xf2;
P2=table[b];
delay(10);
P1=0xf4;
P2=table[c];
delay(10);

}

void main()
{
int num;
delay(500);
adcs=1;

while(1)
{
date=ADconvert(); //获取转化数据
a=date/100;
b=date0/10;
c=date;
for(num=255;num>0;num–)
{
display();
}

}

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ziliao/sheji/258860.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部