/************************
ADC0832实验
************************/
#include <intrins.h>
#include <reg51.h>
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
sbit ADCS =P3^0; //ADC0832 chip seclect
sbit ADDI =P3^2; //ADC0832 data in
sbit ADDO =P3^2; //ADC0832 data out
sbit ADCLK =P3^1; //ADC0832 clock signal
unsigned char readad[2];
void Adc0832(unsigned char channel);
/************
读ADC0832函数
************/
//采集并返回
void Adc0832(unsigned char channel)
{
uchar i=0;
uchar j;
uint dat=0;
uchar ndat=0;
if(channel==0)channel=2;
if(channel==1)channel=3;
ADDI=1;
_nop_();
_nop_();
ADCS=0;//拉低CS端
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=channel&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADCLK=1;//拉高CLK端
ADDI=(channel>>1)&0x1;
_nop_();
_nop_();
ADCLK=0;//拉低CLK端,形成下降沿3
ADDI=1;//控制命令结束
_nop_();
_nop_();
dat=0;
for(i=0;i<8;i++)
{
dat|=ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
dat<<=1;
if(i==7)dat|=ADDO;
}
for(i=0;i<8;i++)
{
j=0;
j=j|ADDO;//收数据
ADCLK=1;
_nop_();
_nop_();
ADCLK=0;//形成一次时钟脉冲
_nop_();
_nop_();
j=j<<7;
ndat=ndat|j;
if(i<7)ndat>>=1;
}
ADCS=1;//拉低CS端
ADCLK=0;//拉低CLK端
ADDO=1;//拉高数据端,回到初始状态
readad[0]=dat;
readad[1]=ndat;
//dat<<=8;
//dat|=ndat;
//return(dat); //return ad data
}
/////////////lcd variable/////////////////
#include <absacc.h>
#define REG0 XBYTE[0x0000]
#define REG1 XBYTE[0x0001]
#define REG2 XBYTE[0x0002]
#define REG3 XBYTE[0x0003]
unsigned char bdata busyflag;
unsigned char dat,datn,count;
unsigned char word1[16]={"CH = "};
code unsigned char word2[16]={" by LiXueli "};
code unsigned char word3[16]={"www.bitc.edu.cn!"};
code unsigned char word4[16]={"[email protected]!"};
code unsigned char word5[16]={" Wellcome To "};
code unsigned char word6[16]={" Proteus Tools!"};
code unsigned char word7[16]={"This Programme "};
code unsigned char word8[16]={" by LiXueli "};
sbit busyflag_7=busyflag^7;
sbit p10=P1^0;
sbit p11=P1^1;
sbit p12=P1^2;
/////////////////end of lcd variable////////////
///////////////start of lcd 1602/////////////////
void busy()
{
do
{
busyflag=REG1;
}while(busyflag_7);
}
void wrc(unsigned char wcon)
{
busy();
REG0=wcon;
}
void wrd(unsigned char wdat)
{
busy();
REG2=wdat;
}
void rdd()
{
busy();
dat=REG3;
}
void lcdint()
{
wrc(0x38);
wrc(0x01);
wrc(0x06);
wrc(0x0c);
}
void wrn(unsigned char word[])
{
unsigned char i;
for(i=0;i<16;i++)
{
wrd(word[i]);
}
}
//////////////end of lcd 1602///////////////////////
////////////// data process//////////////////////
void Tempprocess()
{
float tt;
tt=readad[0]/255.0*5.0;
word1[4]=(unsigned char )(tt);
word1[5]='.';
word1[6]=(unsigned char )(tt*10-word1[4]*10);
word1[7]=(unsigned char )(tt*100-word1[4]*100-word1[6]*10);
word1[8]=(unsigned char )(tt*1000-word1[4]*1000-word1[6]*100-word1[7]*10);
word1[9]=(unsigned char )(tt*10000-word1[4]*10000-word1[6]*1000-word1[7]*100-word1[8]*10);
word1[4]+=48;
word1[6]+=48;
word1[7]+=48;
word1[8]+=48;
word1[9]+=48;
word1[10]='V';
}
///////////////////// end of process/////////////
void main()
{
lcdint();//初始化液晶
wrc(0x80);
wrn(word5);
wrc(0xc0);
wrn(word6);
while(1)
{
//if(p10==0) //判断P1.0是否按下
{
Adc0832(0);
Tempprocess();
wrc(0x80);
word1[2]='0';
wrn(word1);
Adc0832(1);
Tempprocess();
wrc(0xc0);
word1[2]='1';
wrn(word1);
}
if(p11==0)//判断P1.1是否按下
{
Adc0832(0);
P2=readad[1];
wrc(0x80);
wrn(word3);
wrc(0xc0);
wrn(word4);
}
if(p12==0)//判断P1.2是否按下
{
wrc(0x80);
wrn(word7);
wrc(0xc0);
wrn(word8);
}
}
}