5900|5

12

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

AD转换并显示转换结果 [复制链接]

/*************************************************************
程序功能:对P6.0对应的模拟通道进行多次转换后,将32次平均值
          在数码管上显示(数码管显示的只是ADC的转换结果而不
          是真实的模拟电压)
--------------------------------------------------------------
特别说明:如果不进行32次平均,我们会看到最低位不停的跳变。
--------------------------------------------------------------
测试说明:调节电位器R7的调整旋钮,观察显示数字的变化
*************************************************************/
#include  
typedef unsigned char uchar;
typedef unsigned int  uint;

uint Results[32];         //存放ADC的转换结果
uint Average;
//数码管7位段码:0--f
uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar DispBuf[4] = {0,0,0,0};

//记录显示位数的全局变量
uchar cnt = 0;

void main(void)
{
    WDTCTL = WDT_ADLY_1_9;                    // 设置内部看门狗工作在定时器模式,1.9ms中断一次
    IE1 |= WDTIE;                             // 使能看门狗中断
    P6SEL |= 0x01;                            // Enable A/D channel A0
    ADC12CTL0 = ADC12ON + SHT0_15 + MSC;      // Turn on ADC12, set sampling time
    ADC12CTL1 = SHP + CONSEQ_2;               // Use sampling timer, set mode
    ADC12IE = 0x01;                           // Enable ADC12IFG.0
    ADC12CTL0 |= ENC;                         // Enable conversions
    ADC12CTL0 |= ADC12SC;                     // Start conversion
   
    P4DIR = 0xff;                             //段选信号
    P5DIR = 0xff;                             //位选信号
   
    _EINT();
    while(1)
    {
        _BIS_SR(LPM0_bits + GIE); // Enter LPM0, Enable interrupts,
                                  //打开了全局中断,允许各种中断的发生
        DispBuf[0] = Average / 1000;          //更新数码管显示
        DispBuf[1] = (Average - DispBuf[0]*1000)/100;
        DispBuf[2] = (Average - DispBuf[0]*1000 - DispBuf[1]*100)/10;     
        DispBuf[3] = (Average - DispBuf[0]*1000 - DispBuf[1]*100 - DispBuf[2]*10);   
    }
}
/*******************************************
函数名称:ADC12ISR
功    能:ADC12的中断服务函数
参    数:无
返回值  :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
    static uchar index = 0;
   
    Results[index++] = ADC12MEM0;                      // Move results, IFG is cleared
    if(index == 31)
    {
         uchar i;
         
         Average = 0;
         for(i = 0; i < 32; i++)
            Average += Results;
         Average >>= 5;                  //除以32求平均值,没有经过计算vout=((float)Average*2.5 )/4095.0
                                                        //并将vout显示出来
         index = 0;
        _BIC_SR_IRQ(LPM0_bits);                   // Clear LPM0,退出低功耗模式
    }
}
/*******************************************
函数名称:watchdog_timer
功    能:看门狗中断服务函数,在这里输出数码管的
          段选和位选信号
参    数:无
返回值  :无
********************************************/
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
    P5OUT = 0xff;
    P4OUT = scandata[DispBuf[cnt]];        //输出段选信号
    P5OUT &= ~(1 << cnt);                  //输出位选信号
  
    cnt++;                                 //位计数变量在0~3之间循环
    if(cnt == 4) cnt = 0;
}

最新回复

   详情 回复 发表于 2012-7-13 16:34
 
点赞 关注

回复
举报

755

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
楼主是分享代码?还是ADC不稳定?
 
 

回复

53

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
这个程序我见过的,是别人的开发板程序吧
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(中级)

4
 

MSP430 10位AD转换

我用的是MSP430F2272,AD转换后进入中断服务程序,但是ADC10MEM中没有数值,会是什么问题?

 
 
 

回复

424

帖子

0

TA的资源

纯净的硅(高级)

5
 
ADC10MEM中没有数值?无论如何会有0x0000啊?!
打一下引脚的电平,比对一下
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

6
 

同问,msp430AD转换结果总是一种

 
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表