新闻中心

EEPW首页>嵌入式系统>设计应用> ADC0832检测模拟电压值

ADC0832检测模拟电压值

作者: 时间:2016-11-25 来源:网络 收藏
=============================================================================================

``````````````````````````````程序思想`````````````````````````````

本文引用地址://m.amcfsurvey.com/article/201611/321145.htm

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"
};

//端口定义
sbitadcs=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();
}

}

}



评论


技术专区

关闭