3547|4

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

MSP430 ADC12 使用P6.1没有反应啊!很急啊 谢谢 [复制链接]

/*********************************************************
程序功能:将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);
}

最新回复

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 编辑 ]  详情 回复 发表于 2012-3-14 15:38
 
点赞 关注

回复
举报

12

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
我使用P6.0的时候 就可以在液晶上显示的
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
最可能的问题就是初始化的问题 可是我不知道怎么设置 希望能告诉我! 谢谢
 
 
 

回复

21

帖子

0

TA的资源

一粒金砂(中级)

4
 

回复 楼主 willard2010 的帖子

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 编辑 ]

赞赏

1

查看全部赞赏

 
 
 

回复

12

帖子

0

TA的资源

一粒金砂(中级)

5
 

回复 4楼 lllhhheee 的帖子

非常感谢你啊~
谢谢~
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表