下面是电路图:
ADC0832封装图
ADC0832与单片机连接图
ADC0832时序图
程序源码下载:
#include<msp430f2121.h>
#define DO (P1IN&BIT7)
#define uchar unsigned char
#define uint unsigned int
/***********************************************
sbit cs=P2^0;
sbit clk=P2^1;
sbit DI=P2^2;
sbit DO=P2^6;
*************************************************/
uint adval;
uchar temp;
uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void delay(uint ms)
{
uchar j;
while(ms--)
{
for(j=0;j<120;j++);
}
}
void ADC_start()
{
P2OUT|=BIT0;//cs=1
_NOP();
P2OUT&=~BIT1;//clk=0
_NOP();
P2OUT&=~BIT0;//cs=0
_NOP();
P2OUT|=BIT2;//DI=1
_NOP();
P2OUT|=BIT1;//clk=1
_NOP();
P2OUT&=~BIT2;//DI=0;
_NOP();
P2OUT&=~BIT1;//clk=0;
_NOP();
}
void ADC_read(uint CH)
{
uchar i;
ADC_start();
if(CH==0) //选择通道0
{
P2OUT|=BIT2;// DI=1;
P2OUT |=BIT1;//clk=1;
_NOP();
_NOP();
P2OUT &=~BIT1;//clk=0;//第一个下降沿来DI=1
_NOP();
_NOP();
P2OUT |=BIT2;//DI=0;
P2OUT |=BIT1;//clk=1;
_NOP();
_NOP();
P2OUT&=~BIT1;//clk=0;//第二个下降沿来DI=0,DI两次为10,选ch0通道
_NOP();
_NOP();
}
else //选择通道1
{
P2OUT|=BIT2;// DI=1;
P2OUT |=BIT1;//clk=1;
_NOP();
_NOP();
P2OUT &=~BIT1;//clk=0;//第一个下降沿来DI=1
_NOP();
_NOP();
P2OUT |=BIT2;//DI=1;
P2OUT |=BIT1;//clk=1;
_NOP();
_NOP();
P2OUT&=~BIT1;//clk=0;//第二个下降沿来DI=0,DI两次为11,选ch1通道
_NOP();
_NOP();
}
/****************下降沿读数据*******************/
P2OUT|=BIT1;//clk=1;
_NOP();
P2OUT&=~BIT1;//clk=0;再来下降沿读书
for(i=0;i<8;i++)
{
P2OUT|=BIT2;// DI=1;
if(DO) // 判断DO;
{
temp |=0x01;
}
else
{
temp &=0xfe;
}
P2OUT&=~BIT1;//clk=0;
_NOP();
_NOP();
P2OUT|=BIT1;//clk=1;//上升沿来,左移1位
temp=temp<<1;
}
adval=temp;
}
/********显示数据********************************/
void display(uint dat)
{
P2OUT &=~BIT3;//关闭个位显示P2.3
P2OUT &=~BIT4;//关闭十位显示P2.4
P2OUT |=BIT5;//开启百位显示P2.5
P1OUT=tab[dat/100];
delay(1);
P1OUT=0xff;
P2OUT &=~BIT3;//关闭个位显示P2.3
P2OUT |=BIT4;//开启十位显示P2.4
P2OUT &=~BIT5;//关闭百位显示P2.5
P1OUT=tab[(dat%100)/10];
delay(1);
P1OUT=0xff;
P2OUT |=BIT3;//开启个位显示P2.3
P2OUT &=~BIT4;//关闭十位显示P2.4
P2OUT &=~BIT5;//关闭百位显示P2.5
P1OUT=tab[dat/10];
delay(1);
P1OUT=0xff;
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P2DIR =0x3f;
P1DIR|=0x7f;
while(1)
{
ADC_read(0);
delay(1);
display(adval);
}
}