关于msp43f1611的DAC与ADC

2019-03-24 09:55发布

   本人最近在学习msp430的DAC12与ADC12模块,现在想先用DAC12的P6.6口输出数字模拟电压,再用ADC12的P6.0口采样并用1602液晶显示,但调试过程中一直出现问题,要么只能DAC12输出模拟电压,要么ADC12采样正常工作,不能达到效果,下面是程序代码,想请教各位怎么解决,如何才能达到效果。


#include <msp430x16x.h>

#define CPU_F ((double)8000000)  

#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))

#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))



#define uchar unsigned char

#define uint  unsigned int

#define ulong unsigned long



#define RS_CLR                P5OUT &= ~BIT5           //RS置低

#define RS_SET                P5OUT |=  BIT5           //RS置高



#define RW_CLR                P5OUT &= ~BIT6           //RW置低

#define RW_SET                P5OUT |=  BIT6           //RW置高



#define EN_CLR                P5OUT &= ~BIT7           //E置低

#define EN_SET                P5OUT |=  BIT7           //E置高



#define DataDIR         P4DIR                     //数据口方向

#define DataPort        P4OUT                     //P4口为数据口



int shuju[32];

int A1=0,A2=0,A3=0;

ulong dy;

uint shuzi=2048;

void DAC_init();

void ADC_init();



//*************************************************************************

//                        初始化IO口子程序

//*************************************************************************

void Port_init()

{

        P6SEL |= 0x01;

        P1IE=0x3f;

        P1IES=0x3f;

        P1IFG=0x00;

        P4SEL = 0x00;

        P4DIR = 0xFF;                   //数据口输出模式

        P5SEL = 0x00;

        P5DIR|= BIT5 + BIT6 + BIT7;     //控制口设置为输出模式

}



//***********************************************************************

//        显示屏命令写入函数

//***********************************************************************

void LCD_write_com(unsigned char com)

{       

        RS_CLR;

        RW_CLR;

        EN_SET;

        DataPort = com;                 //命令写入端口

        delay_ms(5);

        EN_CLR;

}



//***********************************************************************

//        显示屏数据写入函数

//***********************************************************************

void LCD_write_data(unsigned char data)

{

        RS_SET;

        RW_CLR;

        EN_SET;

        DataPort = data;                //数据写入端口

        delay_ms(5);

        EN_CLR;

}



//***********************************************************************

//        显示屏清空显示

//***********************************************************************

void LCD_clear(void)

{

        LCD_write_com(0x01);            //清屏幕显示

        delay_ms(5);

}



//***********************************************************************

//        显示屏字符串写入函数

//***********************************************************************

void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)

{

       

    if (y == 0)

    {

            LCD_write_com(0x80 + x);        //第一行显示

    }

    else

    {

            LCD_write_com(0xC0 + x);        //第二行显示

    }



    while (*s)

    {

            LCD_write_data( *s);

            s ++;

    }

}



//***********************************************************************

//        显示屏单字符写入函数

//***********************************************************************

void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)

{

       

    if (y == 0)

    {

            LCD_write_com(0x80 + x);        //第一行显示

    }

    else

    {

            LCD_write_com(0xC0 + x);        //第二行显示

    }



    LCD_write_data( data);  

}



void ADC_init(void)

{



  ADC12CTL0 &= ~ENC;

  ADC12CTL0=ADC12ON+SHT0_2+MSC;

  ADC12CTL1=SHP+CONSEQ_2;

  ADC12IE=0x01;

  ADC12CTL0 |= ENC;

}





void DAC_init(void)

{

  ADC12CTL0=REF2_5V+REFON;

  DAC12_0CTL=DAC12IR+DAC12AMP_5+DAC12ENC+DAC12LSEL_1;

  DAC12_0CTL |= DAC12CALON;

  while(DAC12_0CTL & DAC12CALON==DAC12CALON);

}



//***********************************************************************

//        显示屏初始化函数

//***********************************************************************

void LCD_init(void)

{

    LCD_write_com(0x38);                //显示模式设置  

    delay_ms(5);

    LCD_write_com(0x08);                //显示关闭

    delay_ms(5);

    LCD_write_com(0x01);                //显示清屏

    delay_ms(5);

    LCD_write_com(0x06);                //显示光标移动设置

    delay_ms(5);

    LCD_write_com(0x0C);                //显示开及光标设置

    delay_ms(5);

}



//***********************************************************************

//      液晶显示界面初始化

//***********************************************************************

void LCD_Desk(void)

{   

  LCD_clear();

  LCD_write_str(0,0,"The Voltage is :");

  delay_ms(250);

}







void LCD_DisplayTemp(uchar temp1,uchar temp2,uchar temp3)

{   

  LCD_write_char(0x0b,1,0x30+A1);

  LCD_write_char(0x0c,1,'.');

  LCD_write_char(0x0d,1,0x30+A2);

  LCD_write_char(0x0e,1,0X30+A3);

  LCD_write_char(0x0f,1,'V');

}





void Clock_Init()

{

  uchar i;

  BCSCTL1&=~XT2OFF;                 //打开XT2振荡器

  BCSCTL2|=SELM1+SELS;              //MCLK为8MHZ,SMCLK为8MHZ

  do{

    IFG1&=~OFIFG;                   //清楚振荡器错误标志

    for(i=0;i<100;i++)

       _NOP();

  }

  while((IFG1&OFIFG)!=0);           //如果标志位1,则继续循环等待

  IFG1&=~OFIFG;

}





void main(void)

{

    uchar j;



    WDTCTL = WDTPW + WDTHOLD;                         //看门狗设置

    Clock_Init();                       //系统时钟设置

    Port_init();                        //系统初始化,设置IO口属性

    delay_ms(100);                      //延时100ms

    ADC_init();

    DAC_init();

    LCD_init();                         //液晶参数初始化设置

    LCD_clear();                        //清屏

    LCD_Desk();

     _EINT();

    while(1)

    {



       DAC12_0CTL |= DAC12ENC;

       DAC12_0DAT=shuzi;



     ADC12CTL0 |= ADC12SC;

     for(j=0;j<30;j++)

    {            

     LCD_DisplayTemp(A1,A2,A3);        

    }   

    }

}

#pragma vector=ADC_VECTOR

__interrupt void ADC12ISR(void)

{

  static unsigned int cishu=0;

  shuju[cishu++]=ADC12MEM0;

  if(cishu==31)

  {

    ADC12CTL0 &= ~ENC;

    unsigned int i;

    dy=0;

    for(i=0;i<32;i++)

      dy=dy+shuju[i];

    dy=dy/32;

    cishu=0;

    dy=(dy*3300)/4095+100;

    A1=dy/1000;

    A2=(dy%1000)/100;

    A3=(dy%100)/10;

    ADC12CTL0 |= ENC;

  }

}

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
weizhideshenghu
2019-03-24 16:07
soso 发表于 2015-8-4 09:03
说说如何解决的。

ADC初始化与DAC初始化有矛盾,只需改一下初始化语句就行

一周热门 更多>

相关问题

    相关文章