宇轩zzb 发表于 2016-6-29 17:29:00

msp430g2553AD10采样正弦波峰值

msp430g2553AD10采样正弦波峰值,显示的不是峰值,是一个特别小的数,单通道多次采样,谢谢大家
#include <msp430g2553.h>


#define uint unsigned int
#define uchar unsigned char


#define CS_H P2OUT|=BIT2
#define CS_L P2OUT&=~BIT2


#define SID_H P2OUT|=BIT1
#define SID_L P2OUT&=~BIT1


#define SCLK_H P2OUT|=BIT0
#define SCLK_L P2OUT&=~BIT0


uint aver={0};
uchar flag=0;
uchar zifu={"0123456789"};
uint maxaver=0;
uchar dis=0;
double max=0,maxr=0;


void delay(uchar z)
{
uint x,y;
for(x = 110;x>0;x--)
    for(y = z;y>0;y--);
}




void PORT_init()
{
WDTCTL = WDTPW + WDTHOLD;
P2DIR = 0XFF;
P2OUT = 0XFF;
}


void Sys_init()
{
uchar i;
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;//设置内部时钟8M
do
{
    IFG1 &= ~OFIFG;
    for(i = 0xff;i>0;i--);
}
while((IFG1 & OFIFG) != 0);
//BCSCTL2 |= SELM_0;
//BCSCTL2 |= DIVS_0;
}


void send_byte(uchar bbyte)
{
uchar i,temp;
for(i=0;i<8;i++)
{
//    P2DIR = 0xff;
    temp = bbyte & 0x80;
    if(temp)
    {
      SID_H;
    }
    else
    {
      SID_L;
    }
    SCLK_L;
    SCLK_H;
    bbyte = bbyte<<1;
}
}


void LCD12864_write_cmd(uchar ddata)
{
uchar hdata,ldata;
hdata = ddata & 0xf0;
ldata = (ddata<<4) & 0xf0;
CS_H;
send_byte(0xf8);
delay(5);
send_byte(hdata);
delay(1);
send_byte(ldata);
delay(1);
CS_L;
}


void LCD12864_write_data(uchar ddata)
{
uchar hdata,ldata;
hdata = ddata & 0xf0;
ldata = (ddata<<4) & 0xf0;
CS_H;
send_byte(0xfa);
delay(5);
send_byte(hdata);
delay(1);
send_byte(ldata);
delay(1);
CS_L;
}


void LCD12864_init()
{
P2DIR |= BIT0 + BIT1 + BIT2;
delay(10);
CS_H;
LCD12864_write_cmd(0x34);
delay(1);
LCD12864_write_cmd(0x30);
delay(1);
LCD12864_write_cmd(0x0c);//
delay(1);
LCD12864_write_cmd(0x01);
delay(1);
LCD12864_write_cmd(0x06);
delay(1);
}


void LCD12864_pos(uchar x,uchar y)
{
uchar pos;
switch(x)
{
case 1:pos = 0x80;break;
case 2:pos = 0x90;break;
case 3:pos = 0x88;break;
case 4:pos = 0x98;break;
default:pos = 0x80;
}
pos += y;
LCD12864_write_cmd(pos);
}






void shuju()
{
uchar j;
maxr = 0;
maxaver = 0;
for(j = 0;j < 64;j+=2)
{
    if(aver>maxaver && aver<1024)
    {
      maxaver = aver;
    }
    maxr = (maxaver*3.56)/1023;
    max = maxr*1000;
    dis = max;
   
    LCD12864_pos(2,2);
    LCD12864_write_data(zifu);
    LCD12864_write_data('.');
    LCD12864_write_data(zifu);
    LCD12864_write_data(zifu);
    LCD12864_write_data(zifu);
    LCD12864_write_data(zifu);


}
}


void ADC_init(void)
{
ADC10CTL0 = ADC10ON + ADC10SHT_3 + MSC + ADC10IE;
ADC10CTL1 |= CONSEQ_2 + INCH_1;
ADC10AE0 |= BIT0 + BIT1;
ADC10DTC1 = 0x20;
}


void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
// IO_init();
LCD12864_init();
PORT_init();
Sys_init();
ADC_init();
_EINT();
while(1)
{
    ADC10CTL0 &=~ENC;
    while(ADC10CTL1 & ADC10BUSY);
    ADC10SA = (unsigned int)aver;
    ADC10CTL0 |= ENC + ADC10SC;
//   ADC10CTL0&=~ADC10IFG;


    _BIS_SR(CPUOFF + GIE);
}

}


#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
shuju();
//dis =ADC10MEM;
_BIC_SR_IRQ(CPUOFF + GIE);
}






宇轩zzb 发表于 2016-7-1 05:24:38

我以自己解决~嘿嘿,是输入没有弄好,下面是我的程序,供大家参考,少走弯路~
//输出接P1.0,不接则显示引脚悬空电压
#include <msp430g2553.h>

#define uint unsigned int
#define uchar unsigned char

#define CS_H P2OUT|=BIT2
#define CS_L P2OUT&=~BIT2

#define SID_H P2OUT|=BIT1
#define SID_L P2OUT&=~BIT1

#define SCLK_H P2OUT|=BIT0
#define SCLK_L P2OUT&=~BIT0

#define Number 128

static uint index = 0;
static uint result;
uchar flag=0;
uchar zifu={"0123456789"};
uint maxaver=0;
long dis=0;
double max=0,maxr=0;

void delay(uchar z)
{
uint x,y;
for(x = 800;x>0;x--)
    for(y = z;y>0;y--);
}



void Sys_init()
{
//uchar i;
WDTCTL = WDTPW + WDTHOLD;
if(CALBC1_8MHZ==0XFF || CALDCO_8MHZ==0XFF)
{
    while(1);
}
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;//设置内部时钟8M
// BCSCTL2 |= SELM_0;
BCSCTL2 |= SELM_1 + DIVM_3;
}

void send_byte(uchar bbyte)
{
uchar i,temp;
for(i=0;i<8;i++)
{
//    P2DIR = 0xff;
    temp = bbyte & 0x80;
    if(temp)
    {
      SID_H;
    }
    else
    {
      SID_L;
    }
    SCLK_L;
    SCLK_H;
    bbyte = bbyte<<1;
}
}

void LCD12864_write_cmd(uchar ddata)
{
uchar hdata,ldata;
hdata = ddata & 0xf0;
ldata = (ddata<<4) & 0xf0;
CS_H;
send_byte(0xf8);
delay(5);
send_byte(hdata);
delay(1);
send_byte(ldata);
delay(1);
CS_L;
}

void LCD12864_write_data(uchar ddata)
{
uchar hdata,ldata;
hdata = ddata & 0xf0;
ldata = (ddata<<4) & 0xf0;
CS_H;
send_byte(0xfa);
delay(5);
send_byte(hdata);
delay(1);
send_byte(ldata);
delay(1);
CS_L;
}

void LCD12864_init()
{
P2DIR |= BIT0 + BIT1 + BIT2;
delay(10);
CS_H;
LCD12864_write_cmd(0x34);
delay(1);
LCD12864_write_cmd(0x30);
delay(1);
LCD12864_write_cmd(0x0c);//
delay(1);
LCD12864_write_cmd(0x01);
delay(1);
LCD12864_write_cmd(0x02);
delay(1);
}

void LCD12864_pos(uchar x,uchar y)
{
uchar pos;
switch(x)
{
case 1:pos = 0x80;break;
case 2:pos = 0x90;break;
case 3:pos = 0x88;break;
case 4:pos = 0x98;break;
default:pos = 0x80;
}
pos += y;
LCD12864_write_cmd(pos);
}

void LCD12864_write(uchar add,uchar *str)
{
uchar k;
LCD12864_write_cmd(add);
for(k=0;k<*str;k++)
{
    LCD12864_write_data(*str);
    str++;
}
}

void IO_init()
{
P1DIR &=~BIT0;
P1REN |= BIT0;
P2DIR = 0XFF;
P2OUT = 0XFF;
}

void shuju()
{
uchar j;
maxr = 0;
maxaver = 0;
for(j = 0;j < 128;j++)
{
    if((result>maxaver) && (result<1024))
    {
      maxaver = result;
    }
}
    maxr = (maxaver*2.00)/1023;
    max = maxr*10000;
    dis = max;
   
    LCD12864_pos(2,2);
    LCD12864_write_data(zifu);
    LCD12864_write_data('.');
    LCD12864_write_data(zifu);
    LCD12864_write_data(zifu);
    LCD12864_write_data(zifu);
    LCD12864_write_data(zifu);

}

void ADC_init(void)
{
ADC10CTL0 = ADC10ON + ADC10SHT_3 + MSC + ADC10IE + REF2_5V + REFON + SREF_1;
ADC10CTL1 |= CONSEQ_2 + INCH_0 + ADC10DIV_3;
//ADC10AE0 |= 0XFF;
// ADC10CTL0 &=~ADC10IFG;
// ADC10DTC1 = 0x40;
}

void main(void)
{
WDTCTL = WDTPW + WDTHOLD;

LCD12864_init();
Sys_init();
ADC_init();
_EINT();

   LCD12864_pos(1,1);
   LCD12864_write(0x81,"采样结果:");
   LCD12864_write(0x99,"By:Watermelon");

while(1)
{
    ADC10CTL0 &=~ENC;
    while(ADC10CTL1 & ADC10BUSY);
    ADC10SA = result;
    ADC10CTL0 |= ENC + ADC10SC;//启动
    _NOP();
//   ADC10CTL0&=~ADC10IFG;

    _BIS_SR(LPM0_bits + GIE);
}

}

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
result = ADC10MEM;
// index += 1;
if(index == 128)
{
    shuju();
    index = 0;
}
_NOP();

ADC10CTL0 &=~ADC10IFG;
//_BIC_SR_IRQ(CPUOFF + GIE);
}



页: [1]
查看完整版本: msp430g2553AD10采样正弦波峰值

Baidu
map