#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ADCS = P1^0;
sbit ADCLK = P1^1;
sbit ADDI = P1^2;
sbit ADDO = P1^2;
uchar code Tab[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void Display(uint dat) //显示的数值为毫伏
{
uchar ge,shi,bai,qian;
qian = dat/1000%10;
bai = dat/100%10;
shi = dat/10%10;
ge = dat%10;
P2 = 0xfe;
P0 = Tab[qian]|0x80; //最高位加小数点
delay(10);
P2 = 0xfd;
P0 = Tab[bai];
delay(10);
P2 = 0xfb;
P0 = Tab[shi];
delay(10);
P2 = 0xf7;
P0 = Tab[ge];
delay(10);
}
uchar ADC0832(bit mode,bit channel) //AD转换,返回结果
{
uchar i,dat,ndat;
ADCS = 0;//拉低CS端
_nop_();
_nop_();
ADDI = 1; //第1个下降沿为高电平
ADCLK = 1;//拉高CLK端
_nop_();
_nop_();
ADCLK = 0;//拉低CLK端,形成下降沿1
_nop_();
_nop_();
ADDI = mode; //低电平为差分模式,高电平为单通道模式。
ADCLK = 1;//拉高CLK端
_nop_();
_nop_();
ADCLK = 0;//拉低CLK端,形成下降沿2
_nop_();
_nop_();
ADDI = channel; //低电平为CH0,高电平为CH1
ADCLK = 1;//拉高CLK端
_nop_();
_nop_();
ADCLK = 0;//拉低CLK端,形成下降沿3
ADDI = 1;//控制命令结束(经试验必需)
dat = 0;
//下面开始读取转换后的数据,从最高位开始依次输出(D7~D0)
for(i = 0;i < 8;i++)
{
dat <<= 1;
ADCLK=1;//拉高时钟端
_nop_();
_nop_();
ADCLK=0;//拉低时钟端形成一次时钟脉冲
_nop_();
_nop_();
dat |= ADDO;
}
ndat = 0; //记录D0
if(ADDO == 1)
ndat |= 0x80;
//下面开始继续读取反序的数据(从D1到D7)
for(i = 0;i < 7;i++)
{
ndat >>= 1;
ADCLK = 1;//拉高时钟端
_nop_();
_nop_();
ADCLK=0;//拉低时钟端形成一次时钟脉冲
_nop_();
_nop_();
if(ADDO==1)
ndat |= 0x80;
}
ADCS=1;//拉高CS端,结束转换
ADCLK=0;//拉低CLK端
ADDI=1;//拉高数据端,回到初始状态
if(dat==ndat)
return(dat);
else
return 0;
}
void main()
{
uint adc;
while(1)
{
adc = ADC0832(1,0); //差分模式,CH0-CH1
adc = adc*19.607843; //转换为实际电压便于显示
Display(adc);
}
}