以下是主程序和相关子程序
#include<AT89X51.h>
#include<intrins.h>
#include<ADC08322.h>
unsigned char code LED[]={ 0xC0, //"0"
0xF9, //"1"
0xA4, //"2"
0xB0, //"3"
0x99, //"4"
0x92, //"5"
0x82, //"6"
0xF8, //"7"
0x80, //"8"
0x90, //"9"
0xFF};
unsigned char dis[4]={0xFF,0x40,0xC0,0xC0};
unsigned char sflag=0xFE,k=0;
unsigned char tem[60];
unsigned char AVVolt()
{
unsigned char i,j,temp;
unsigned int n=0;
for(i=0;i<60;i++)
for(j=i+1;j<60;j++)
{
if(tem[i]<tem[j])
{
temp=tem[i];
tem[i]=tem[j];
tem[j]=temp;
}
}
for(i=25;i<35;i++)
n=n+tem[i];
return (n/10);
}
void delay(unsigned int t)
{
while(--t);
}
void initTimer(void)
{
TMOD=0x1;
TH0=0xfc;
TL0=0x18;
EA=1;
TR0=1;
ET0=1;
}
void main ()
{
unsigned char i,temp;
unsigned int U,V;
float T;
initTimer();
while(1)
{
for(i=0;i<60;i++)
tem[i]=adc0832(0x10)/256;
temp=AVVolt();
T=temp*15/256;
U=(int)T;
V=(T-U)*100;
dis[3]=LED[V%10];
dis[2]=LED[V/10];
dis[1]=LED[U%10]&0x7F;
if(U/10==0)
dis[0]=LED[10];
else
dis[0]=LED[U/10];
delay(50000);
}
}
void timer0(void) interrupt 1
{
TH0=0xfc;
TL0=0x18;
P2=0xFF;
P0=dis[k];
P2=sflag;
sflag=_crol_(sflag,1);
if(++k==5)
{
k=0;
sflag=0xFE;
}
}
以下是adc0832的头文件
#include<AT89X51.h>
#define uchar unsigned char
#define uint unsigned int
sbit spi_cs = P1^0;
sbit spi_clk= P1^1;
sbit spi_io = P1^2;
void spiStart()
{
spi_clk = 0; //说明当开始位为1,0时 为“1” 、 “0”时,只对 CH0 进行单通道转换。
spi_io = 1; // 当 开始位为“1” 、 “1”时,只对 CH1进行单通道转换。当 开始位为“0” 、
_nop_(); // “0”时,将 CH0作为正输入端 IN+,CH1作为负输入端 IN-进行输入。当开始位
spi_cs = 0; // 为“0” 、 “1”时,将 CH0作为负输入端 IN-,CH1 作为正输入端 IN+进行输入
_nop_(); _nop_();
}
void spiEnd()
{
spi_cs = 1;
spi_io = 1;
spi_clk = 1;
_nop_(); _nop_();
}
void spiSend(uchar op)
{
uchar i,om;
if(op==0x00) om=4;
if(op==0x01) om=5;
if(op==0x10) om=6;
if(op==0x11) om=7;
om = om<<5;
for( i=0 ; i<3 ; i++ )
{
spi_io = om&0x80;
spi_clk = 1;
_nop_();
spi_clk = 0;
om = om<<1;
}
spi_io = 1;
}
uint adc0832(uchar channel) //注:channel等于 0x00为双通道模式,且CH0为正输入端 IN+,CH1为负输入端 IN-
{
// 0x01为双通道模式,且CH1为正输入端 IN+,CH0为负输入端 IN-
uchar i,ndat=0; // 0x10为只对 CH0 进行单通道转换。
uint dat=0; // 0x11为只对 CH1 进行单通道转换。
EA=0;
spiStart();
spiSend(channel);
_nop_();
if( spi_io )
return 0;
spi_io = 1;
for( i=0 ; i<8 ; i++ )
{
spi_clk = 1; _nop_();
spi_clk = 0; _nop_();
dat = dat<<1;
if( spi_io )
dat |= 0x0100;
}
for( i=0 ; i<8 ; i++ )
{
spi_clk = 1; _nop_();
spi_clk = 0; _nop_();
ndat = ndat>>1;
if( spi_io )
ndat |= 0x80;
}
spiEnd();
dat += ndat;
EA=1;
return dat;
}