大连创客空间

 找回密码
 立即注册吧!

QQ登录

只需一步,快速开始

一键登录:

搜索
查看: 17823|回复: 139
收起左侧

【大赛原创经验贴】ADC10多路转换

  [复制链接]
发表于 2012-7-19 16:11:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多交流,硬件的世界向你敞开大门!

您需要 登录 才可以下载或查看,没有帐号?立即注册吧!

x
本帖最后由 wusong01 于 2013-7-6 08:20 编辑

这几天有事,耽误了几天。今天好好把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;//退出低功耗模式
}


ADC_双通道.rar (27.47 KB, 下载次数: 1246)
回复

使用道具 举报

发表于 2012-7-19 17:09:25 | 显示全部楼层
正在看AD呢。。。
回复 支持 反对

使用道具 举报

发表于 2012-7-19 17:13:13 | 显示全部楼层
CONSEQ_3不是单次转换吧?

点评

写错了,呵呵,是多次转换  详情 回复 发表于 2012-7-19 22:01
回复 支持 反对

使用道具 举报

发表于 2012-7-19 17:13:37 | 显示全部楼层
CONSEQ_3不是单次转换吧?
回复 支持 反对

使用道具 举报

发表于 2012-7-19 19:01:56 | 显示全部楼层
ADC10单通道.rar (19.65 KB, 下载次数: 31, 售价: 1 九币)
回复 支持 反对

使用道具 举报

发表于 2012-7-19 20:08:03 | 显示全部楼层
  不错,我最近也刚做了这个试验!呵呵,走了不少弯路.幸好还是成功了!

点评

嗯,一起交流学习,嘿嘿~~~  详情 回复 发表于 2012-7-20 00:35
求关于ADC的例子。。  详情 回复 发表于 2012-7-19 20:48
回复 支持 反对

使用道具 举报

发表于 2012-7-19 20:48:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2012-7-19 20:56:49 | 显示全部楼层
just_soso 发表于 2012-7-19 20:48
求关于ADC的例子。。

楼主的不就是吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-19 22:01:18 | 显示全部楼层
丹熙静蓝 发表于 2012-7-19 17:13
CONSEQ_3不是单次转换吧?

写错了,呵呵,是多次转换
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-20 00:35:09 | 显示全部楼层
Friday 发表于 2012-7-19 20:08
不错,我最近也刚做了这个试验!呵呵,走了不少弯路.幸好还是成功了!

嗯,一起交流学习,嘿嘿~~~
回复 支持 反对

使用道具 举报

发表于 2012-7-20 12:04:46 | 显示全部楼层
单通道单词转换的AD程序你还有吗?

点评

单通道的有,就业放在上面吧  详情 回复 发表于 2012-7-20 16:24
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-20 16:24:28 | 显示全部楼层
a498487989 发表于 2012-7-20 12:04
单通道单词转换的AD程序你还有吗?

单通道的有,就业放在上面吧
回复 支持 反对

使用道具 举报

发表于 2012-7-20 17:25:07 | 显示全部楼层
LCD没显示···
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-20 17:26:50 | 显示全部楼层
不会吧,你仔细检查下程序还有电路什么的

点评

对,就是采集内部温度,用12864显示的有吗?  详情 回复 发表于 2012-7-20 17:39
回复 支持 反对

使用道具 举报

发表于 2012-7-20 17:39:08 | 显示全部楼层
wusong01 发表于 2012-7-20 17:26
不会吧,你仔细检查下程序还有电路什么的

对,就是采集内部温度,用12864显示的有吗?

点评

12864还没有写  详情 回复 发表于 2012-7-20 17:44
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-20 17:44:37 | 显示全部楼层
a498487989 发表于 2012-7-20 17:39
对,就是采集内部温度,用12864显示的有吗?

12864还没有写

点评

12864的,,我弄了一个,,但是有警告!!!!还是可以显示的、、  详情 回复 发表于 2012-7-21 13:23
回复 支持 反对

使用道具 举报

发表于 2012-7-20 18:57:53 | 显示全部楼层
谢谢!!给力呀!!
回复 支持 反对

使用道具 举报

发表于 2012-7-20 19:24:55 | 显示全部楼层
wusong01 发表于 2012-7-20 17:26
不会吧,你仔细检查下程序还有电路什么的

找到原因了,你用的是IAR吧? 我用的是CCS,要加volatile,要不然会被优化,乱码
回复 支持 反对

使用道具 举报

发表于 2012-7-20 19:51:53 | 显示全部楼层
吴同学,实在太佩服你了,ADC10SA赋值法太经典了,学习了

点评

同样的感受,楼主这赋值写的确实经典 模板啊!!!  详情 回复 发表于 2012-8-4 14:15
回复 支持 反对

使用道具 举报

发表于 2012-7-20 21:08:35 | 显示全部楼层
我对这个不太了解,学习了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册吧!

本版积分规则

单片机开发者1群:235808606;会员QQ 6群:254085994; 1群:12835691(满); 2群:121061287(满); 3群:237320668(满);4群:249652919(满);5群:253578883(满);大赛1群:187926790(满),2群:231577758(满),3群:249652919(满)。 TI杯4群:58129202(满)。
载入中

QQ|手机版|小黑屋|Archiver|大连创客空间 ( 辽ICP备15004617号-2  

GMT+8, 2017-1-24 05:01 , Processed in 0.300318 second(s), 44 queries .

地址:辽宁省大连市高新园区火炬路7号17层 QQ:2401085253

Copyright © 2010-2015 创客空间(大连)科技有限公司 All Rights Reserved.

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