| 
 
| 哪位大神帮忙看下哪里出现的问题本来是采样0-3.3V输出,现在只有0-2V采样正常,2V-3.3V采样不正常,请问下问题出在哪里? main.c
 
 #include "config.h"
 
 #define keyin (P1IN & 0x0f)
 #define   Num_of_Results   32
 #define ANGLE 360
 #define AVRVALUE 330
 
 uint16_t results[Num_of_Results];    //保存ADC转换结果的数组
 uint16_t average;
 uint8_t tcnt = 0;
 
 void delay(void);
 uint8_t Data[]="a:aaa\n"; //发送的字符串,字符串末尾通常都会有一个默认的\0结束符
 
 /*******************************************
 函数名称:ADC12ISR
 功    能:ADC中断服务函数,在这里用多次平均的
 计算P6.0口的模拟电压数值
 参    数:无
 返回值  :无
 ********************************************/
 
 #pragma vector=ADC_VECTOR
 __interrupt void ADC12ISR (void)
 {
 static uint8_t index = 0;
 
 results[index++] = ADC12MEM0;               // Move results
 if(index == Num_of_Results)
 {
 uint8_t i;
 
 average = 0;
 for(i = 0; i < Num_of_Results; i++)
 {
 average += results;
 }
 average >>= 5;                            //除以32
 
 index = 0;
 tcnt++;
 if(tcnt == 250)      //主要是降低串口发送速度
 {
 LPM1_EXIT;
 tcnt = 0;
 }
 }
 }
 
 
 
 
 void main()
 {
 uint8_t i;
 uint8_t buffer[5];
 uint8_t buffer1[4];
 WDTCTL = WDTPW + WDTHOLD;
 P2DIR |= BIT0;
 P2OUT |= BIT0;   //L8输出,熄灭   为1熄灭,为0点亮
 InitUART(); //调用初始化函数
 Init_ADC();
 _EINT();
 buffer[4] = '\0';
 buffer1[3]='\0';
 uint16_t vol_100=0;
 uint16_t ang_val=0;
 while(1)
 {
 
 if(keyin != 0x0f)
 {
 delay();
 if(keyin != 0x0f)
 {
 while(keyin != 0x0f);
 P2OUT ^= BIT0;
 //uart0发送ON
 sendString("ON");
 }
 }
 LPM1;
 
 
 Hex2Dec(average,buffer);
 for(i = 0; i < 4; i++)
 buffer += 0x30;
 sendString(buffer);
 
 
 /*
 Trans_val(average,buffer);
 buffer[3] = buffer[2];
 buffer[2] = buffer[1];
 buffer[1] = 0x2e - 0x30;
 
 vol_100=buffer[0]*100+buffer[2]*10+buffer[3]*1;
 for(i = 0; i < 4; i++)
 {
 buffer += 0x30;
 }
 sendString(buffer);
 ang_val=(ANGLE*vol_100)/AVRVALUE;
 buffer1[0]=ang_val/100;
 buffer1[1]=ang_val%100/10;
 buffer1[2]=ang_val%10;
 for(i = 0; i < 3; i++)
 {
 buffer1 += 0x30;
 }
 sendString(buffer1);
 */
 
 
 }
 }
 
 
 /*******************************************
 函数名称:delay
 功    能:用于消抖的延时
 参    数:无
 返回值  :无
 ********************************************/
 void delay(void)
 {
 uint16_t tmp;
 
 for(tmp = 12000;tmp > 0;tmp--);
 }
 
 
 
 
 ADC_Fun.c
 #include "config.h"
 //#define ANGLE 360
 //#define AVRVALUE 2048
 /********************************************
 函数名称:Init_ADC
 功    能:初始化ADC
 参    数:无
 返回值  :无
 ********************************************/
 void Init_ADC(void)
 {
 P6SEL |= 0x01;                            // 使能ADC通道
 ADC12CTL0 = ADC12ON+SHT0_15+MSC;          // 打开ADC,设置采样时间
 ADC12CTL1 = SHP+CONSEQ_2;                 // 使用采样定时器
 ADC12IE = 0x01;                           // 使能ADC中断
 ADC12CTL0 |= ENC;                         // 使能转换
 ADC12CTL0 |= ADC12SC;                     // 开始转换
 }
 /********************************************
 函数名称:Hex2Dec
 功    能:将16进制ADC转换数据变换成十进制
 表示形式
 参    数:Hex_Val--16进制数据
 ptr--指向存放转换结果的指针
 返回值  :无
 ********************************************/
 void Hex2Dec(uint16_t Hex_val,uint8_t *ptr)
 {
 ptr[0] = Hex_val / 1000;
 ptr[1] = (Hex_val - ptr[0]*1000)/100;
 ptr[2] = (Hex_val - ptr[0]*1000 - ptr[1]*100)/10;
 ptr[3] = (Hex_val - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);
 }
 /*******************************************
 函数名称:Trans_val
 功    能:将16进制ADC转换数据变换成三位10进制
 真实的模拟电压数据,并在液晶上显示
 参    数:Hex_Val--16进制数据
 返回值  :无
 ********************************************/
 void Trans_val(uint16_t Hex_Val,uint8_t *ptr)
 {
 uint32_t caltmp;
 uint16_t Curr_Volt;
 uint8_t t1;
 
 caltmp = Hex_Val;
 caltmp = (caltmp << 5) + Hex_Val;           //caltmp = Hex_Val * 33
 
 caltmp = (caltmp << 3) + (caltmp << 1);     //caltmp = caltmp * 10
 Curr_Volt = caltmp >> 12;                   //Curr_Volt = caltmp / 2^n
 ptr[0] = Curr_Volt / 100;                   //Hex->Dec变换
 t1 = Curr_Volt - (ptr[0] * 100);
 ptr[1] = t1 / 10;
 ptr[2] = t1 - (ptr[1] * 10);
 }
 
 //转化成角度值
 /*
 void Conv_AngleVal(uint16_t Hex_Val,uint8_t *ptr)
 {
 uint16_t cir_angle;
 uint8_t temp;
 uint8_t emp1;
 cir_angle=(ANGLE*Hex_Val)/AVRVALUE;
 ptr[0]=(cir_angle/100);
 temp=cir_angle-(ptr[0]*100);
 ptr[1]=temp/10;
 ptr[2]=temp-ptr[1]*10;
 //temp1=ptr[0];
 //ptr[0]=ptr[3];
 //ptr[3]=temp1;
 }
 | 
 |