=============================================================================================``````````````````````````````程序思想`````````````````````````````
本文引用地址:http://m.butianyuan.cn/article/201611/321145.htmAD0832與AD08004有所不同,AD0804的數(shù)據(jù)是并行輸出,而AD0832是串行輸出,其思想略有復雜。
根據(jù)ADC0832的時序,首先選通芯片,在第一個脈沖下沿前讓addi為高,在第二個下沿前給addi1位數(shù)據(jù),在第三個下沿前給addi1位數(shù)據(jù),
兩位數(shù)據(jù)為10時選通CH0,為11時選通CH1; 在第三個下沿后開始接收數(shù)據(jù)。
數(shù)據(jù)接收核心思想:
1、以dat來接收從高位到低位傳回來的數(shù)據(jù),分8次依次接收。dat每接收一位后向高位移1位,最低位與下一位接收到的數(shù)據(jù)
相或,直到接收到8位。
2、以ndat來接收從低位到高位傳回來的數(shù)據(jù),分8次依次接收。 用參數(shù)j來接收1位數(shù)據(jù),ndat來存儲接收到的8位數(shù)據(jù)。當j接收到1位數(shù)據(jù)以后
向左移7位,到最高位,然后與ndat相或,即將數(shù)據(jù)傳給ndat,ndat每接收到1位以后,其數(shù)據(jù)向右移1位,直到7位傳完。最后將接收到的數(shù)據(jù)傳回即可。
AD00832接收數(shù)據(jù)共分為19個時鐘脈沖,由單片機提供。前三個為初始化,第四個到第11個為高位在先數(shù)據(jù),第11到第19個為低位在先數(shù)據(jù)。
從AD中讀到的數(shù)據(jù)并非為真實的電壓值,只是一個虛擬量。真是的電壓值為
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)//延時函數(shù)
{
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++) //串行接收數(shù)據(jù)高位在前
{
dat|=addo; //將addo數(shù)據(jù)給dat
adclk=1; //拉高
delay1();
adclk=0;//拉低,循環(huán)時鐘
delay1();
dat<<=1;//將數(shù)據(jù)向左移動1位,方便低位接收下一位數(shù)據(jù)
if(i==7)
dat|=addo;//最后一位數(shù)據(jù)直接賦給dat
}
for(i=0;i<8;i++) //串行接收數(shù)據(jù)低位在前
{
j=0; //每次接收前復位為0
j|=addo;//j用來接收1位數(shù)據(jù)
adclk=1; //拉高
delay1();
adclk=0;//拉低,循環(huán)時鐘
delay1();
j<<=7;//將接收到的數(shù)據(jù)移動到最高位
ndat=ndat|j; //將接收到的數(shù)據(jù)傳給ndat
if(i<7)
ndat>>=1; //每接收到1為數(shù)據(jù),ndat向右移動1位
}
adcs=1;
adclk=0;
addo=1; //回到初始狀態(tài)
dat<<=8; //int型數(shù)據(jù)為16位,將接收到的8位數(shù)據(jù)移到高8位,
dat|=ndat;
return(dat);
}
void display() //數(shù)碼管顯示
{
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(); //獲取轉換數(shù)據(jù)
a=date/100;
b=date0/10;
c=date;
for(num=255;num>0;num--)
{
display();
}
}
}
評論