查看: 1555|回复: 0
打印 上一主题 下一主题

基于MSP430G2553内部ADC10多通道(2通道)详解

[复制链接]
跳转到指定楼层
沙发
发表于 2015-10-6 00:34:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
其中的液晶显示这里就不再多述了

#include "lcd1602.h"

uchar d[16]="The Volt1: .   V";

uchar d1[16]="The Volt0: .   V";

uchar table_num[]={"0123456789"};

uint a[8],b[3];

uint i,j,ad1,ad0,real;

void display()

{

   delay(250);

   uint ptr[4];

   

   ad1=(int)(b[1]);//根据需要,可以更改这里的数值,将量程调到0~1024

   ad0=(int)(b[2]);//根据需要,可以更改这里的数值,将量程调到0~1024

   //通道A1的值

    real=(int)((3.3*ad1)/1023*1000);//扩大1000倍

    ptr[0] = real / 1000;        

     ptr[1] = (real - ptr[0]*1000)/100;

     ptr[2] = (real - ptr[0]*1000 - ptr[1]*100)/10;

     ptr[3] = (real - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);
     d[10]=table_num[ptr[0]];

     for(i=1;i<4;i++)

       d[i+11]=table_num[ptr[i]];

     display_string(d,0xc0);        

   //通道A0的值

    real=(int)((3.3*ad0)/1023*1000);//扩大1000倍

    ptr[0] = real / 1000;        

     ptr[1] = (real - ptr[0]*1000)/100;

     ptr[2] = (real - ptr[0]*1000 - ptr[1]*100)/10;

     ptr[3] = (real - ptr[0]*1000 - ptr[1]*100 - ptr[2]*10);
     d1[10]=table_num[ptr[0]];

     for(i=1;i<4;i++)

       d1[i+11]=table_num[ptr[i]];

     display_string(d1,0x80);            

}

void main()

{      
   WDTCTL = WDTPW + WDTHOLD;

   //主系统时钟切换为外部高速晶振   

   if (CALBC1_8MHZ == 0xFF || CALDCO_8MHZ == 0xFF)

   {

       while(1);   // If calibration constants erased, trap CPU!!

   }

   // Configure Basic Clock

   BCSCTL1 = CALBC1_8MHZ;     // Set range

   DCOCTL = CALDCO_8MHZ;    // Set DCO step + modulation*/      

   

   P2SEL=0x00;//P2为I/O模式

  P2DIR|=0xff;//P2为LCD输出

  P1SEL|=BIT1+BIT2+BIT0;//P1.1和P1.2设置为ADC功能A1和A2

   

   ADC10CTL1|=CONSEQ_3+INCH_2+INCH_0+INCH_1;//序列通道多次转换+最大通道为A2

   ADC10CTL0|=ADC10SHT_2+MSC+ADC10ON+ADC10IE;

   ADC10DTC1|=0x08;//一共采样8次

  ADC10AE0|=BIT0+BIT1+BIT3;//打开A0和A1的模拟输入通道

  

   init_lcd();//lcd初始化

  

   while(1)

   {

     ADC10CTL0&=~ENC;//关闭采样使能

    while(ADC10CTL1&BUSY);//检测AD是否繁忙

    ADC10CTL0|=ENC+ADC10SC;//启动ADC

     ADC10SA=(unsigned int)a;//获取a[]的首地址。首先对A1、A0采样,放入a[0]和a[1]中。再对A1、A0采样,放入a[2]和a[3]中,如此循环下去。

    _BIS_SR(LPM0_bits+GIE);//低功耗模式0,开中断

     for(i=0;i<2;i++)

     {

       b[i]=0;

       for(j=0;j<4;j++)

         b[i]+=a[i+j*2];//b[0]=a[偶数]相加之和,b[1]=a[奇数]相加之和,每个b有4组数

    }

     for(i=0;i<2;i++)

     {  

       b[i]=b[i]/4;//对b[0],b[1]求平均值

      _NOP();

     }

     display();//lcd显示

  }

}

#pragma vector=ADC10_VECTOR

__interrupt void ADC(void)

{

      LPM0_EXIT;//退出低功耗模式

}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

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