求助:关于MSP430G255310位ADC的采样问题

Other Parts Discussed in Thread: MSP430G2553

昨天写了一个ADC转换的问题,通过A0通道采样。把P1.0设置为输入,但ADC10CTL0 |= ADC10SC;这条语句一执行。P1.0就有电压了,本来应该是0伏特。如果把那条语句屏蔽了,P1.0就是0V。程序代码如下:

#include <msp430g2553.h>

#define uint unsigned int

 #define uchar unsigned char

 #define Num_of_Results 32

 static uint results[Num_of_Results]

; /*宏定义各端口,RS(CS)串行通信片选,SID(R/W)串行数据口,SCLK(E)串行同步时钟信号*/

#define RS_0 P2OUT &= ~BIT0     //RS = 0

#define RS_1 P2OUT |= BIT0      //RS = 1

#define SID_0 P2OUT &= ~BIT1    //SID = 0

#define SID_1 P2OUT |= BIT1     //SID = 1

#define SCLK_0 P2OUT &= ~BIT2   //SCLK = 0

#define SCLK_1 P2OUT |= BIT2    //SCLK = 1

uchar m;

unsigned long temp, IntDegF, IntDeg;

void ADC10_init()

 {

   ADC10CTL0 &= ~ENC;

   ADC10CTL0 = ADC10IE+ADC10ON+ADC10SHT_2+MSC+SREF_2;   //ADC10ON开启10ADC

   ADC10CTL1 = CONSEQ_2+INCH_0

;   ADC10AE0 |= 0X03;

   ADC10SA = 0X200;

   __delay_cycles(30000);

   ADC10CTL0 |= ENC;

   ADC10CTL0 |= ADC10SC;

   ADC10CTL0 &= ~ADC10IFG;

   _EINT();

   //LPM0;

}

/*--------------------------------------------

delay_1ms(): 延时函数

 输入参数:无

 编写日期:20140722

  ---------------------------------------------*/

void delay_1ms()

 {  

   uint k;

   for(k=0; k<195; k++);

 }

/*--------------------------------------------

delay(uint n): 延时函数,延时大约1ms

 输入参数:n 延时nms

编写日期:20140722

  ---------------------------------------------*/

 void delay1ms(uint n)

 {   uint j;   for(j=0; j<n; j++)     delay_1ms(); }

/*写指令函数*/

 void write_cmd(uchar cmd) {   uchar j;   j = 0xF8;   RS_1;             //RS=1   SCLK_0;            //SCLK=0(E)   for(m=0; m<8; m++)   {     if(j&0x80)          //判断最高位是否是为1,如果是则给SDIN赋1即写入1,否则写0       SID_1;       //SID(RW)     else        SID_0;    //最高位不为1,写0     SCLK_0;      //让SCLK产生下降沿,使液晶采样     delay1ms(1);     SCLK_1;       //将SCLK拉高,为一位数据采样做准备     j=j<<1;            //因为先发送高位,所以每次向左移动一位   }   j = cmd;   j &= 0xF0;   for(m=0; m<8; m++)   {     if(j&0x80)          //判断最高位是否是为1,如果是则给SDIN赋1即写入1,否则写0       SID_1;     else        SID_0;    //最高位不为1,写0     SCLK_0;      //让SCLK产生下降沿,使液晶采样     delay1ms(1);     SCLK_1;       //将SCLK拉高,为一位数据采样做准备     j=j<<1;            //因为先发送高位,所以每次向左移动一位   }   j = cmd;   j <<= 4;   for(m=0; m<8; m++)   {     if(j&0x80)          //判断最高位是否是为1,如果是则给SDIN赋1即写入1,否则写0       SID_1;     else        SID_0;    //最高位不为1,写0     SCLK_0;      //让SCLK产生下降沿,使液晶采样     delay1ms(1);     SCLK_1;       //将SCLK拉高,为一位数据采样做准备     j=j<<1;            //因为先发送高位,所以每次向左移动一位   }   RS_0;   delay1ms(5); }

/*写显示数据函数*/ void write_data(uchar dat) {   uchar j;   j = 0xFA;   RS_1;   for(m=0; m<8; m++)   {     if(j&0x80)          //判断最高位是否是为1,如果是则给SDIN赋1即写入1,否则写0       SID_1;     else        SID_0;    //最高位不为1,写0     SCLK_0;      //让SCLK产生下降沿,使液晶采样     delay1ms(1);     SCLK_1;       //将SCLK拉高,为一位数据采样做准备     j=j<<1;            //因为先发送高位,所以每次向左移动一位   }   j = dat;   j &= 0xF0;   for(m=0; m<8; m++)   {     if(j&0x80)          //判断最高位是否是为1,如果是则给SDIN赋1即写入1,否则写0       SID_1;     else        SID_0;    //最高位不为1,写0     SCLK_0;      //让SCLK产生下降沿,使液晶采样     delay1ms(1);     SCLK_1;       //将SCLK拉高,为一位数据采样做准备     j=j<<1;            //因为先发送高位,所以每次向左移动一位   }   j = dat;   j <<= 4;   for(m=0; m<8; m++)   {     if(j&0x80)          //判断最高位是否是为1,如果是则给SDIN赋1即写入1,否则写0       SID_1;     else        SID_0;    //最高位不为1,写0     SCLK_0;      //让SCLK产生下降沿,使液晶采样     delay1ms(1);     SCLK_1;       //将SCLK拉高,为一位数据采样做准备     j=j<<1;            //因为先发送高位,所以每次向左移动一位   }   RS_0;   delay1ms(5); }

/*设定显示位置*/ void lcd_pos(uchar X, uchar Y) {   uchar pos;   if(X == 0)     X = 0x80;   else if(X == 1)     X = 0X90;   else if(X == 2)     X = 0X88;   else if(X == 3)     X = 0X98;   pos = X+Y;   write_cmd(pos);      //显示地址 }

/*LCD初始化设定*/ void lcd_init() {   //P1OUT &= ~BIT3;   //PSB = 1;并口方式   write_cmd(0x30); //基本指令操作   delay1ms(5);   write_cmd(0x0c); //显示开,关光标   delay1ms(5);   write_cmd(0x01); //清除LCD的显示类容   delay1ms(5); }

/*-------------------------------------------- Init_Port(): MSP430G2553端口初始化函数 输入参数:无 编写日期:20140722  ---------------------------------------------*/ void Init_Port() {    P1DIR = 0;          //将P1口所有的管脚在初始化的时候设置为输入方式   P2DIR = 0;          //将P2口所有的管脚在初始化的时候设置为输入方式   //P1REN |= BIT0;   //P1OUT &= ~BIT0;   P1SEL |= BIT0;          //将P1口所有的管脚设置为一般I/O口   P1DIR &= ~BIT0;   P1DIR |= BIT4;   P2SEL = 0X00;   P2IE = 0X00;   P2DIR = 0XFF;       //将P2口所有的管脚在初始化的时候设置为输入方式 }

void display(long date) {   uchar ge, shi, bai, qian;   qian=date/1000;   bai=date%1000/100;   shi=date%1000%100/10;   ge=date%1000%100%10;   lcd_pos(0,2);   write_data(0x30+qian);   write_data(0x30+bai);   lcd_pos(0,3);   write_data(0x30+shi);   write_data(0x30+ge); }

void main() {   WDTCTL = WDTPW + WDTHOLD;   BCSCTL1 = CALBC1_8MHZ;   DCOCTL = CALDCO_8MHZ;   Init_Port();   lcd_init();   ADC10_init();   while(1);   }

#pragma vector = ADC10_VECTOR __interrupt void ADC10ISR() {   uchar i;   P1DIR |= BIT4;   P2DIR |= BIT0+BIT1+BIT2;   static uint index = 0;   results[index++] = ADC10MEM;   if(index >= Num_of_Results)   {     unsigned long sum = 0;

    index = 0;     for(i = 0; i < Num_of_Results; i++)     {         sum += results[i];     }     sum >>= 5;                            //除以32     temp = 3300*sum/1023;     display(temp);   } }