MSP430 ADC12 使用P6.1没有反应啊!很急啊 谢谢

2019-03-24 14:47发布

/*********************************************************
程序功能:将ADC对P6.1端口电压的转换结果按转换数据在液晶上显示
**********************************************************/
#include <msp430.h>
#include "allfunc.h"
#include "ADC_Func.c"
#include  "cry12864.C"

#define   Num_of_Results   32
uint results[Num_of_Results];    //保存ADC转换结果的数组
uint average;
uchar tcnt = 0;

/***********************主函数***********************/
void main( void )
{
    uchar i;
    uchar buffer[5];
   
    WDTCTL = WDTPW + WDTHOLD;           //关狗
   
    /*下面六行程序关闭所有的IO口*/
    P1DIR = 0XFF;P1OUT = 0XFF;
    P2DIR = 0XFF;P2OUT = 0XFF;
    P3DIR = 0XFF;P3OUT = 0XFF;
    P4DIR = 0XFF;P4OUT = 0XFF;
    P5DIR = 0XFF;P5OUT = 0XFF;
    P6DIR = 0XFF;P6OUT = 0XFF;
   
    P6DIR |= BIT2;P6OUT |= BIT2;        //关闭电平转换
   
    Init_ADC();
    _EINT();
   
    buffer[4] = '';
    while(1)
    {
        LPM1;
        Hex2Dec(average,buffer);
        for(i = 0; i < 4; i++)
            buffer += 0x30;
        
        
        Ini_Lcd();                  //初始化液晶
   
        Disp_HZ(0x80,buffer,2);
        
        LPM4;
    }
   
}

/*******************************************
函数名称:ADC12ISR
功    能:ADC中断服务函数,在这里用多次平均的
          计算P6.0口的模拟电压数值
参    数:无      
返回值  :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
    static uchar index = 0;
  
    results[index++] = ADC12MEM1;               // Move results
    if(index == Num_of_Results)
    {
        uchar 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;
        }
    }
}




这是.C文件
#include <msp430.h>

typedef unsigned int  uint;
typedef unsigned char uchar;
/********************************************
函数名称:Init_ADC
功    能:初始化ADC
参    数:无
返回值  :无
********************************************/
void Init_ADC(void)
{
    P6SEL |= 0x02;                            // 使能ADC通道
    ADC12CTL0 = ADC12ON+SHT0_15+MSC;          // 打开ADC,设置采样时间
    ADC12CTL1 = SHP+CONSEQ_2;                 // 使用采样定时器
    ADC12MCTL1 = INCH_1;
    ADC12IE = 0x02;                           // 使能ADC中断
    ADC12CTL0 |= ENC;                         // 使能转换
    ADC12CTL0 |= ADC12SC;                     // 开始转换
}
/********************************************
函数名称:Hex2Dec
功    能:将16进制ADC转换数据变换成十进制
          表示形式
参    数:Hex_Val--16进制数据  
          ptr--指向存放转换结果的指针
返回值  :无
********************************************/
void Hex2Dec(uint Hex_val,uchar *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(uint Hex_Val,uchar *ptr)
{
    unsigned long caltmp;
    uint Curr_Volt;
    uchar 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);
} 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
willard2010
1楼-- · 2019-03-24 20:14
 精彩回答 2  元偷偷看……
willard2010
2楼-- · 2019-03-25 01:29
< :TI_MSP430_内容页_SA7 --> 最可能的问题就是初始化的问题 可是我不知道怎么设置 希望能告诉我! 谢谢
lllhhheee
3楼-- · 2019-03-25 06:59

void initADC12(){
    P6SEL = 0x02;               //设置P6.0为模拟输入通道
    ADC12CTL0 &= ~(ENC);        //设置ENC为0,从而修改ADC12寄存器的值
    ADC12CTL0 |= ADC12ON + SHT0_8 + MSC; //打开ADC12内核
    ADC12CTL1 = SHP + CONSEQ_2+CSTARTADD_1;
    ADC12MCTL1 |= INCH_1;
    ADC12IE = 0x02;             //使能中断ADC12IFG.0
    ADC12CTL0 |= ENC;           //使能转换
   _EINT();
    ADC12CTL0 |= ADC12SC;       //开始转换
}

这么写

你使用了MCTL1通道,在ADC12CTL1里面没有设置

加上ADC12CTL0 &= ~(ENC);  不然设置无效 。    

[ 本帖最后由 lllhhheee 于 2012-3-14 16:19 编辑 ]
willard2010
4楼-- · 2019-03-25 10:03
 精彩回答 2  元偷偷看……

一周热门 更多>

相关问题

    相关文章