求助,基于msp430g2553的AD转换在LCD上显示的程序
时间:10-02
整理:3721RD
点击:
如题,在论坛上找来自己改了改AD多通道转换在LCD上显示结果,可为什么在P1.0和P1.1没有接任何电压的时候LCD上就一直显示有值,在两个引脚接上电源后也不能显示电压,而是数值一直跳动,求大神帮忙看看
uchar d[16]="The Volt1: . V";
uchar d1[16]="The Volt0: . V";
uchar table_num[]={"0123456789"};
unsigned int a[8],b[3];
uint i,j,ad1,ad0,real;
void display()
{
delay(250);
uint ptr[4];
ad1=(int)(b[1]);//根据需要,可以更改这里的数值,将量程调到0~1024
ad0=(int)(b[2]);//根据需要,可以更改这里的数值,将量程调到0~1024
//通道A1的值
real=(int)((3.3*ad1)/1023*1000);//扩大1000倍
ptr[0] = real / 1000;
ptr[1] = (real - ptr[0]*1000)/100;
ptr[2] = (real - ptr[0]*1000 - ptr[1]*100)/10;
ptr[3] = (real - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);
d[10]=table_num[ptr[0]];
for(i=1;i<4;i++)
d[i+11]=table_num[ptr];
LCD_Disp_string(0,0,d);
// display_string(d,0xc0);
//通道A0的值
real=(int)((3.3*ad0)/1023*1000);//扩大1000倍
ptr[0] = real / 1000;
ptr[1] = (real - ptr[0]*1000)/100;
ptr[2] = (real - ptr[0]*1000 - ptr[1]*100)/10;
ptr[3] = (real - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);
d1[10]=table_num[ptr[0]];
for(i=1;i<4;i++)
d1[i+11]=table_num[ptr];
LCD_Disp_string(0,1,d1);
//display_string(d1,0x80);
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P1SEL|=BIT1+BIT0;//P1.1和P1.0置为ADC功能A1和A0
ADC10CTL1|=CONSEQ_3+INCH_1;//序列通道多次转换+最大通道为A2
ADC10CTL0|=ADC10SHT_2+MSC+ADC10ON+ADC10IE;
ADC10DTC1|=0x08;//一共采样8次
ADC10AE0|=BIT0+BIT1;//打开A0和A1的模拟输入通道
IO_Init();
LCD_Init();;//lcd初始化
while(1)
{
ADC10CTL0&=~ENC;//关闭采样使能
while(ADC10CTL1&BUSY);//检测AD是否繁忙
ADC10CTL0|=ENC+ADC10SC;//启动ADC
ADC10SA=(unsigned int)a;//获取a[]的首地址。首先对A1、A0采样,放入a[0]和a[1]中。再对A1、A0采样,放入a[2]和a[3]中,如此循环下去。
_BIS_SR(LPM0_bits+GIE);//低功耗模式0,开中断
for(i=0;i<2;i++)
{
b=0;
for(j=0;j<4;j++)
b+=a[i+j*2];//b[0]=a[偶数]相加之和,b[1]=a[奇数]相加之和,每个b有4组数
}
for(i=0;i<2;i++)
{
b=b/4;//对b[0],b[1]求平均值
_NOP();
}
display();//lcd显示
}
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC(void)
{
LPM0_EXIT;//退出低功耗模式
}
uchar d[16]="The Volt1: . V";
uchar d1[16]="The Volt0: . V";
uchar table_num[]={"0123456789"};
unsigned int a[8],b[3];
uint i,j,ad1,ad0,real;
void display()
{
delay(250);
uint ptr[4];
ad1=(int)(b[1]);//根据需要,可以更改这里的数值,将量程调到0~1024
ad0=(int)(b[2]);//根据需要,可以更改这里的数值,将量程调到0~1024
//通道A1的值
real=(int)((3.3*ad1)/1023*1000);//扩大1000倍
ptr[0] = real / 1000;
ptr[1] = (real - ptr[0]*1000)/100;
ptr[2] = (real - ptr[0]*1000 - ptr[1]*100)/10;
ptr[3] = (real - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);
d[10]=table_num[ptr[0]];
for(i=1;i<4;i++)
d[i+11]=table_num[ptr];
LCD_Disp_string(0,0,d);
// display_string(d,0xc0);
//通道A0的值
real=(int)((3.3*ad0)/1023*1000);//扩大1000倍
ptr[0] = real / 1000;
ptr[1] = (real - ptr[0]*1000)/100;
ptr[2] = (real - ptr[0]*1000 - ptr[1]*100)/10;
ptr[3] = (real - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);
d1[10]=table_num[ptr[0]];
for(i=1;i<4;i++)
d1[i+11]=table_num[ptr];
LCD_Disp_string(0,1,d1);
//display_string(d1,0x80);
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
P1SEL|=BIT1+BIT0;//P1.1和P1.0置为ADC功能A1和A0
ADC10CTL1|=CONSEQ_3+INCH_1;//序列通道多次转换+最大通道为A2
ADC10CTL0|=ADC10SHT_2+MSC+ADC10ON+ADC10IE;
ADC10DTC1|=0x08;//一共采样8次
ADC10AE0|=BIT0+BIT1;//打开A0和A1的模拟输入通道
IO_Init();
LCD_Init();;//lcd初始化
while(1)
{
ADC10CTL0&=~ENC;//关闭采样使能
while(ADC10CTL1&BUSY);//检测AD是否繁忙
ADC10CTL0|=ENC+ADC10SC;//启动ADC
ADC10SA=(unsigned int)a;//获取a[]的首地址。首先对A1、A0采样,放入a[0]和a[1]中。再对A1、A0采样,放入a[2]和a[3]中,如此循环下去。
_BIS_SR(LPM0_bits+GIE);//低功耗模式0,开中断
for(i=0;i<2;i++)
{
b=0;
for(j=0;j<4;j++)
b+=a[i+j*2];//b[0]=a[偶数]相加之和,b[1]=a[奇数]相加之和,每个b有4组数
}
for(i=0;i<2;i++)
{
b=b/4;//对b[0],b[1]求平均值
_NOP();
}
display();//lcd显示
}
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC(void)
{
LPM0_EXIT;//退出低功耗模式
}
可以代做 1 0 0 2 9 2 5 0 9 4
一,判断显示是否正确,就是随意给一个数值,看是否能正确显示。
二,判断数据格式转换是否正确,随意给一个数值,经过格式转换后,进行显示,看是否正确。
三,进行单次AD转换,看转换结果是否正确。
四,进行多次AD转换,看结果是否正确。
五,注意变量的类型定义,注意变量的数值会否超出变量类型的定义。
非常感谢,我现在显示是没问题的,问题就是在模拟输入引脚没有接东西的时候也在采样,这时候不应该是0吗?
做AD输入的引脚通常是要处于悬空状态,可以查芯片手册,引脚在作为AD输入时的设置要求,这 时候不外接输入有可能是任意电压,并且可能会随意变化,可以查查芯片手册,引脚在作为AD输入时的设置要求,以及电路连接要求
我查了G2553作为模拟输入时的两个端口, ADC10AE0 |=BIT0+BIT1; //打开模拟输入通道
ADC10CTL1 = CONSEQ_3 + + ADC10div_0 + INCH_1; 这两句已经定义了P1.0和P1.1作为模拟输入,这时候电压加在别的引脚上不会引起LCD显示的变化,应该是已经定义好了,但是这两个引脚上有电压值