打印

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

[复制链接]
5178|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huigoushang|  楼主 | 2012-3-14 22:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*********************************************************
程序功能:将ADC对P6.1端口电压的转换结果按转换数据在液晶上显示
**********************************************************/
#include
#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] = '\0';
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

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);
}
评分
参与人数 1威望 +1 收起 理由
寞水 + 1 很给力!

相关帖子

沙发
huigoushang|  楼主 | 2012-3-14 22:23 | 只看该作者
我使用P6.0的时候 就可以在液晶上显示的
最可能的问题就是初始化的问题 可是我不知道怎么设置 希望能告诉我! 谢谢

使用特权

评论回复
板凳
G21372| | 2012-3-14 22:45 | 只看该作者
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);  不然设置无效 。

使用特权

评论回复
地板
yangguangaisha| | 2012-3-14 22:55 | 只看该作者
楼上好强啊

使用特权

评论回复
5
tianm| | 2012-3-15 10:57 | 只看该作者
多检查代码 一般都是忽略了什么

使用特权

评论回复
6
shenmu2012| | 2012-4-11 14:17 | 只看该作者
3楼的兄弟的却很细心的啊,做这个ADC采集数据时,涉及到寄存器是非常多的,一个没注意到,总会出现楼主的问题滴,我一般每次使用时都是对照课本的。。。

使用特权

评论回复
7
shenmu2012| | 2012-4-11 14:19 | 只看该作者
heh ,顺便说一句,我楼上说的对照资料课本的笨是笨了点,不过古语有道:“磨刀不误砍柴工”嘛。。。

使用特权

评论回复
8
寞水| | 2013-11-19 17:10 | 只看该作者
给力

使用特权

评论回复
9
xfhyzq| | 2015-5-3 12:45 | 只看该作者
我也遇到类似的问题,谢谢解答

使用特权

评论回复
10
Monkeywong| | 2018-4-24 16:57 | 只看该作者
同求!

#include  <msp430x24x.h>
#define uchar unsigned char
#define uint unsigned int
uchar const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,  //共阴数码管段选码表,无小数点
                               0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

uchar Index,flag,Disbuf[8];
void delayms(uint t)
{
    uint i;
    while(t--)
      for(i=1000;i>0;i--);//进过参数的调整1330
}
void VoltDataProcess(uint Volt)
{
    float temp;
     uchar i;
     unsigned long t;
   temp=((float)(Volt))*5/4096;
   t=(unsigned long)(temp*1000);
    while(t)
    {
       Disbuf[7-i++]=table[t%10];
       t=t/10;
      
    }
  
   
    for(;i<8;i++)
    {
      if(i<=3)
      {
        if(i==3)
        {
          Disbuf[7-i]=table[0];
          continue;
        }  
        Disbuf[7-i]=table[0];
        continue;
      }
      Disbuf[7-i]=0x00;
    }
    Disbuf[4]|=0x80;
   
   
     
   
}
void main(void)
{
  WDTCTL = WDTPW + WDTHOLD;                 // 关闭看门狗
  ADC12CTL0 &= ~(ENC);
  ADC12CTL0 = SHT0_2 + ADC12ON;             // 打开ADC12模块、设置采样时间
  ADC12CTL1 = CSTARTADD_1+SHP;                          // 选择信号源自采样定时器,设置为单通道转换
  ADC12MCTL1 |= INCH_1;
  ADC12IE = 0x02;                           // 使能中断
  ADC12CTL0 |= ENC;                         // 使能转化
  P6DIR = 0xFD;                            // P6.1, i/p
  P6SEL|= 0x02;                            // 使能ADC12模块的A1

  P1DIR=0xFF;            // 设置方向
  P1SEL=0;            // 设置为普通I/O 口
  P2DIR=0xFF;
  P2SEL=0;
  P2OUT=0x00;  
  P3DIR=0xFF;            // 设置方向
  P3SEL=0;            // 设置为普通I/O 口
   
  P1OUT=0x00;
  P3OUT=0xFF;
  ADC12CTL0 |= ADC12SC;                   // 开始转换
  //_BIS_SR(CPUOFF + GIE);                  // LPM0, ADC12_ISR will force exit
  _BIS_SR(LPM0_bits+ GIE);//进入低功耗睡眠模式
   while(1)
    {
      
          ADC12IE=0x00;
          P3OUT=0xFF;
          P1OUT=Disbuf[Index];
          P3OUT=~(1<<Index);
          ADC12IE=0x02;
          if(++Index==8)
          {
            Index=0;
            ADC12CTL0 |= ADC12SC;
          }
          delayms(1);
         
    }
}

// ADC12 interrupt service routine
#pragma vector=ADC12_VECTOR
__interrupt void ADC12_ISR (void)
{   
    VoltDataProcess(ADC12MEM0);
     LPM0_EXIT;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

168

主题

1677

帖子

1

粉丝