2 qingshanchun qingshanchun 于 2014.08.03 19:23 提问

MSP430G2转换结果数据类型

以下是程序,软件用的IAR:

#include "io430.h"
#include "dandao_duocai.h"
#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 dataout P2OUT
unsigned int ADC10_Result[100];
int d,c;

void cheek_clock()
{
BCSCTL3_bit.LFXT1S0 = 0; //配置ACLK为12KHz
BCSCTL3_bit.LFXT1S1 = 1;

if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF) //配置MCLK为1MHz
while(1); //校准数据是否被擦除,若是则CPU挂起。
BCSCTL1=CALBC1_1MHZ;
DCOCTL=CALDCO_1MHZ;

}

///////----------采集一串数,并取出最大值

void zzzz()
{
//unsigned int ADC10_Result[100];
int i,j;
P1SEL|=BIT1;//P1.1第二功能

ADC10CTL1 |= CONSEQ_2; //单通道重复采样模式
ADC10CTL0 |= SREF_1+REFON+REF2_5V;//选择内部参考源2.5V,打开基准源

ADC10CTL0 |= ADC10SHT_3+MSC; //过采样率设置为64个采样周期,打开AD转换
ADC10CTL1|= ADC10SSEL_1+ADC10DIV_1+SHS_0; //ACLK2分频为采样时钟,用ADC10SC触发采集
ADC10CTL1 |=INCH_1; //选择通道A1

ADC10CTL0 |= ADC10ON; //开启ADC10
ADC10AE0 |= 0x02; //开启外部通道A1

ADC10CTL0&=~ADC10IFG;//清中断标志
for(int k=0;k<100;k++)
{
ADC10CTL0 |=ENC+ADC10SC; //开始转换
while((ADC10CTL0 &ADC10IFG)==0); //等待ADC10IFG标志变高(转换完成)
ADC10_Result[k]=ADC10MEM; //读取采样结果
delay_ms(2);
P1SEL&=~BIT1;//关P1.1第二功能。

}
////////--------取ADC10_Result[100] 中的最大数赋值给C

for(i=0;i<100;i++)
{
for(j = i + 1;j<100;j++)
if(ADC10_Result[i]<=ADC10_Result[j])
{
d=ADC10_Result[i];ADC10_Result[i]=ADC10_Result[j];ADC10_Result[j]=d;
}
}
c=ADC10_Result[99];
/////////--------取ADC10_Result[100] 中的最大数赋值给C

}

///////----------采集一串数,并取出最大值

void beishu()
{

if(c dataout=0x00;
if((c>=45)&&(c dataout=0x01;
if((c>=53)&&(c<613))
dataout=0x10;
else
dataout=0x11;
}

int main(void)
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
cheek_clock();
P2DIR|=(BIT0+BIT1+BIT2);
while(1)
{
zzzz(); /// ----调用
beishu();
dataout&=~BIT3;/////p1.3外接另一个芯片的使能端。低电平有效,
}

}

问题是:Error[Pe147]: declaration is incompatible with "unsigned char ADC10_Result[100]" (declared at line 6 of "D:\workspace_v5_1\lianxi\caiji_fangda\dandao_duocai.h") D:\workspace_v5_1\lianxi\caiji_fangda\main.c 7

补充:当我将unsigned int ADC10_Result[100];设置为局部变量时(也就是zzzz()子程序中的屏蔽部分)就不会有错。或者我把这个数组定义为unsigned char 类型且作为全局变量也可以,但是unsigned char 是8位的,而转换结果是10位,软件没报错。

1个回答

qingshanchun
qingshanchun   2014.08.04 11:09

补充:我改一点程序后,可以定义为全局变量了,以下是程序。但是还有一个不懂的地方就是unsigned char 是8位的,而转换结果是10位,软件没报错。求大神指导呀,,,

#include "io430.h"
#define CPU_F ((double)1000000)
#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 dataout P2OUT
unsigned int ADC10_Result[100];
int d,c;

void check_clock()
{
BCSCTL3_bit.LFXT1S0 = 0; //配置ACLK为12KHz
BCSCTL3_bit.LFXT1S1 = 1;

if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF) //配置MCLK为1MHz
while(1); //校准数据是否被擦除,若是则CPU挂起。
BCSCTL1=CALBC1_1MHZ;
DCOCTL=CALDCO_1MHZ;

}
void zzzz()
{

P1SEL|=BIT1;//P1.1第二功能

ADC10CTL1 |= CONSEQ_2; //单通道重复采样模式
ADC10CTL0 |= SREF_1+REFON+REF2_5V;//选择内部参考源2.5V,打开基准源

ADC10CTL0 |= ADC10SHT_3+MSC; //过采样率设置为64个采样周期,打开AD转换
ADC10CTL1|= ADC10SSEL_1+ADC10DIV_1+SHS_0; //ACLK2分频为采样时钟,用ADC10SC触发采集
ADC10CTL1 |=INCH_1; //选择通道A1

ADC10CTL0 |= ADC10ON; //开启ADC10
ADC10AE0 |= 0x02; //开启外部通道A1

ADC10CTL0&=~ADC10IFG;//清中断标志
for(int k=0;k<200;k++)
{
ADC10CTL0 |=ENC+ADC10SC; //开始转换
while((ADC10CTL0 &ADC10IFG)==0); //等待ADC10IFG标志变高(转换完成)
ADC10_Result[k]=ADC10MEM; //读取采样结果
delay_ms(1);
P1SEL&=~BIT1;//关P1.1第二功能。

}

int i,j;
for(i=0;i<100;i++)
{
  for(j = i + 1;j<100;j++)
    if(ADC10_Result[i]>=ADC10_Result[j])
     {
        d=ADC10_Result[i];ADC10_Result[i]=ADC10_Result[j];ADC10_Result[j]=d;
             }
 }
    c=ADC10_Result[99];

}

void beishu()
{

if(c dataout=0x00;
if((c>=45)&&(c dataout=0x01;
if((c>=53)&&(c<613))
dataout=0x10;
else
dataout=0x11;
}

int main(void)
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
check_clock();
P2DIR|=0xff;

while(1)
{
dataout&=~BIT2;
zzzz();
beishu();
delay_us(10);
}

}

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!