ADC0832模數(shù)轉(zhuǎn)換MSP430單片機程序+電路圖
/***********************************************
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();
}
/****************下降沿讀數(shù)據(jù)*******************/
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;
}
/********顯示數(shù)據(jù)********************************/
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);
}
}
評論