ADC10多路转换

来源:互联网 发布:淘宝改版中国质造 编辑:程序博客网 时间:2024/05/17 22:36


这几天有事,耽误了几天。今天好好把ADC研究了一下。前几天写了一个单通道单词转换的AD程序,后来发现,只用单通道的话太浪费资源了。今天就把程序改进了一下,用了两个模拟输入口(再加几个输入口是一样的,今天只是为了测试程序),输出用lcd1602显示转换后的数字量和电压值。这样一来,咱们就可以用1个AD来转换10种不同的模拟信号了。把程序先贴出来,附件在下面,供大家参考下。有不足的地方,请大家指正哦。不懂的地方也可以跟帖,咱们一起讨论。
//**************************************************//
//**********ADC10双通道A0、A1采样*******************//
//*******通过ADC将两路模拟信号转换为数字信号********//
//*******通过lcd1602显示转换以后的数字量和电压值****//
//********--------------------------- *******************//
//****-->|P1.0(ADC)   (lcdrs)P1.6|-->             *********//
//****-->|P1.1(ADC)  (lcden)P1.7|-->            *********//
//****    |                           P2.0|-->D0(lcd)  *********//
//****    |                              ~ |   ~           *********//
//****    |                           P2.7|-->D7(lcd) *********//
//****    |        msp430g2553     |               *********//
//*******     制作人:wusong    *******************//
//************************************ ********//

#include<msp430g2553.h>
#include<1602.h>

#define uint unsigned int
#define uchar unsigned char
uchar table_num[]={"0123456789"};
uint a[8],b[2],c,d,c_ge,c_shi,c_bai,c_qian,d_ge,d_shi,d_bai,d_qian;
uint i,j,num_1,num_0;

void display()
{
  delay_Nms(500);
  num_1=(int)(b[0]*1.08);//根据需要,可以更改这里的数值,将量程调到0~1024
  num_0=(int)(b[1]*1.08);//根据需要,可以更改这里的数值,将量程调到0~1024
  
  c=(int)(num_1*3.3);//转换为电压值
  c_ge=c/1000;
  c_shi=c%1000/100;
  c_bai=c%100/10;
  c_qian=c%10;
  
  d=(int)(num_0*3.3);//转换为电压值
  d_ge=d/1000;
  d_shi=d%1000/100;
  d_bai=d%100/10;
  d_qian=d%10;
  
  write_com(0x80);
  write_data(table_num[num_1/1000]);
  write_data(table_num[num_1%1000/100]);
  write_data(table_num[num_1%100/10]);
  write_data(table_num[num_1%10]);
  write_data('=');
  write_data(table_num[c_ge]);
  write_data('.');
  write_data(table_num[c_shi]);
  write_data(table_num[c_bai]);
  write_data(table_num[c_qian]);
  write_data('V');  
  write_com(0x80+0x40);
  write_data(table_num[num_0/1000]);
  write_data(table_num[num_0%1000/100]);
  write_data(table_num[num_0%100/10]);
  write_data(table_num[num_0%10]);
  write_data('=');
  write_data(table_num[d_ge]);
  write_data('.');
  write_data(table_num[d_shi]);
  write_data(table_num[d_bai]);
  write_data(table_num[d_qian]);
  write_data('V');
}

void main()
{
  WDTCTL=WDTPW+WDTHOLD;//关看门狗
  
  P2SEL=0x00;//P2为I/O模式
  P2DIR|=0xff;//P2为LCD输出
  P1DIR|=BIT6+BIT7;//P1.6和P1.7为LCD的输出
  P1SEL|=BIT1+BIT2;//P1.1和P1.2设置为ADC功能A1和A2
  
  ADC10CTL1|=CONSEQ_3+INCH_1;//序列通道单次转换+最大通道为A1
  ADC10CTL0|=ADC10SHT_2+MSC+ADC10ON+ADC10IE;
  ADC10DTC1|=0x08;//一共采样8次
  ADC10AE0|=BIT0+BIT1;//打开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=0;
      for(j=0;j<4;j++)
        b+=a[i+j*2];
    }
    for(i=0;i<2;i++)
    {  
      b=b/4;
    }
  display();//lcd显示
  }
}
#pragma vector=ADC10_VECTOR
__interrupt void ADC(void)
{
     LPM0_EXIT;//退出低功耗模式
}