社区导航

 
查看: 1156|回复: 1

[资料分享] MSP430学习笔记9-ADC采集1602显示

[复制链接]

3360

TA的帖子

421

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

荣誉会员勋章

发表于 2013-11-29 19:00:37 | 显示全部楼层 |阅读模式
/*********************************************************
程序注意点:
首先可以选择是否开启内部参考电压还是使用外部参考电压
每个通道可以独立选择参考电压
如果连接了外部参考电压应该注意关闭内部参考电压防止损坏
单片机


程序功能:MCU的片内ADC对P6.0端口的电压进行转换
          将模拟电压值显示在1602液晶上。
----------------------------------------------------------
拨码开关设置:将LCD位拨至ON,其余位拨至OFF
测试说明:调节电位器W1的旋钮观察液晶显示数字变化。
*********************************************************/
#include  <msp430x14x.h>
#include  "cry1602.h"
#include  "cry1602.c"

//typedef unsigned char uchar;
//typedef unsigned int  uint;

#define   Num_of_Results   32

uchar shuzi[] = {"0123456789."};
uchar tishi[] = {"The volt is:"};

static uint results[Num_of_Results];    //保存ADC转换结果的数组                                                   
void Trans_val(uint Hex_Val);           
/************************主函数****************************/
void main(void)
{
        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;                      //关闭电平转换
        LcdReset();                                       //复位1602液晶
        DispNChar(2,0,12,tishi);                          //显示提示信息
        Disp1Char(11,1,'V');                              //显示电压单位
        P6SEL |= BIT0;                                    // 使能ADC通道
        ADC12CTL0 = ADC12ON+SHT0_8+MSC;                   // 打开ADC,设置采样时间
        // 上面的配置中并没有打开内部的参考电压
        // ADC12MCTLx用来选择通道和参考电压,这里面没有对此寄存器进行配置为默认值
        // 默认值是参考电压选择AVCC(3.3V),通道是A0,所以测量范围是0-3.3V
        ADC12CTL1 = SHP+CONSEQ_2;                         // 使用采样定时器
        //上面的寄存器配置采样保持触发源选择时ADC12SC,采集信号使用采样时序电路产生的信号
        // 转换模式为单路重复转换        上面的设置必须在ENC=0的情况下设置
        ADC12IE = BIT0;                                   // 使能ADC中断
        ADC12CTL0 |= ENC;                                 // 使能转换
        ADC12CTL0 |= ADC12SC;                             // 开始转换
        _EINT();                                                                        //开启全局中断
        LPM0;
}

/*******************************************
函数名称:ADC12ISR
功    能:ADC中断服务函数,在这里用多次平均的
          计算P6.0口的模拟电压数值
参    数:无      
返回值  :无
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
        static uint index = 0;

        results[index++] = ADC12MEM0;               // 将转换的结果存入数组
        if(index == Num_of_Results)                                        //如果数组存满
        {
                uchar i;
                unsigned long sum = 0;

                index = 0;                                                                //在从头开始存,会覆盖原有的数据
        for(i = 0; i < Num_of_Results; i++)                        //计算和
        {
                sum += results;
        }
        sum >>= 5;                                            //除以32
        Trans_val(sum);
        }
}

/*******************************************
函数名称:Trans_val
功    能:将16进制ADC转换数据变换成三位10进制
          真实的模拟电压数据,并在液晶上显示
参    数:Hex_Val--16进制数据
          n--变换时的分母等于2的n次方      
返回值  :无
********************************************/
void Trans_val(uint Hex_Val)
{
        unsigned long caltmp;
        uint Curr_Volt;
        uchar t1,i;
        uchar ptr[4];

        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
        // 参考电压为3.3V,所以计算公式应该为Hex_val*3.3/2^n
        // 乘除计算通过移位来进行可以有效的提高程序运行效率
        ptr[0] = Curr_Volt / 100;                   //Hex->Dec变换
        t1 = Curr_Volt - (ptr[0] * 100);
        ptr[2] = t1 / 10;
        ptr[3] = t1 - (ptr[2] * 10);
        ptr[1] = 10;                                //shuzi表中第10位对应符号"."
        //在液晶上显示变换后的结果
        for(i = 0;i < 4;i++)
                Disp1Char((6 + i),1,shuzi[ptr]);
}
此帖出自MSP430论坛


回复

使用道具 举报

12

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2013-12-6 21:26:57 | 显示全部楼层
楼主给力,能不能问一下楼主一般外接多大的分压电阻呢??


回复

使用道具 举报

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

本版积分规则

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

小黑屋|手机版|Archiver|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2018-10-23 05:30 , Processed in 0.089994 second(s), 16 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表