cc2530的AD在转换0v电压时,也就是把AD输入通道接地,会出现转换出的数据变为负数而不是0的问题,在其他电压就不会出现这种问题,不知道是不是我选的参考电压有问题。问题的解决方法是对转换出的二进制代码进行判断如果出现负数现将其转换成原码的形式。下面是程序
#include
#define uint unsigned int
#define uchar unsigned char
void delay(uint z)
{
uint t1,y;
for(t1=z;t1>0;t1--)
for(y=200;y>0;y--);
}
void init_CLK32()
{
CLKCONCMD&=0XBF;
while(CLKCONSTA&0X40);
CLKCONCMD&=0XF8;
}
void init_uart0()
{
PERCFG &=0xFE;//1111 1110 串口0选择备用位置1
P0SEL|=0x0C;//0000 1100IO口设置为片上外设模式
U0CSR|=0xC0;//1100 0000串口0的一般配置
U0UCR =0;
U0GCR|=8;//0000 1000波特率配置为9600
U0BAUD=59;
}
void UartTX_Send_String(uchar *Data,uchar len)
{
int j;
for(j=0;j<len;j++)
{
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
}
}
void init_AD()
{
ADCCON3=0X37;//0011 0100 内部产考电压,14分辨率, p0_0模拟输入
P0SEL|=0X80; //1000 0000
P0DIR&=0X7F; //0111 1111
APCFG|=0X80;//0010 0001
ADCCFG|=0X80;
}
float get_AD()
{
uint value;
uchar adc_h;
uchar adc_l;
ADCCON3=0XB7;//0011 0111 内部产考电压,14分辨率, p0_0模拟输入
P0SEL|=0X80; //1000 0000
P0DIR&=0X7F; //1101 1111
APCFG|=0X80;//0010 0001
ADCCFG|=0X80;
ADCCON1|=0X30;
ADCCON1|=0X40;//AD启动方式
while(!(ADCCON1&0X80));
adc_h=ADCH;
adc_l=ADCL;
if(adc_h&0X80)
{
adc_h =~(adc_h-1);
adc_l =~(adc_l);
}
value = adc_h;
value = value<<6;
value|=adc_l>>2;
return (float)(value/(float)8191)*3.3;
}
void main()
{
uchar tempdata[6];
float x=0;
init_CLK32();
init_uart0();
init_AD();
while(1)
{
x=get_AD();
tempdata[0]=(uchar)(x)%10+48;
tempdata[1]='.';
tempdata[2]=(uchar)(x*10)%10+48;
tempdata[3]=(uchar)(x*100)%10+48;
tempdata[4]='v';
tempdata[5]='\n';
UartTX_Send_String(tempdata,6);
delay(2000);
}
}