ADC多路转换

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
AD 多路转换
来源:第九单片机论坛 wusong01
这几天有事,耽误了几天。今天好好把 ADC 研究了一下。前几天写了一个单通道单词转换 的 AD 程序,后来发现,只用单通道的话太浪费资源了。今天就把程序改进了一下,用了两 个模拟输入口(再加几个输入口是一样的,今天只是为了测试程序),输出用 lcd1602 显示 转换后的数字量和电压值。这样一来,咱们就可以用 1 个 AD 来转换 10 种不同的模拟信号 了。把程序先贴出来,附件在下面,供大家参考下。有不足的地方,请大家指正哦。不懂的 地方也可以跟帖,咱们一起讨论。
//************************************ ********//
#include<msp430g2553.h>
#include<1602.h>
#define uint unsigned int
#define uchar unsigned char
uchar table_num[]={"0123456789"};
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 的模拟输入通道
//**************************************************// //**********ADC10 双通道 A0、A1 采样*******************// //*******通过 ADC 将两路模拟信号转换为数字信号********// //*******通过 lcd1602 显示转换以后的数字量和电压值****//
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++)
//**** |
P2.0|-->D0(lcd) *********//
//**** |
~| ~
*********//
ห้องสมุดไป่ตู้//**** |
P2.7|-->D7(lcd) *********//
//**** | msp430g2553 |
*********//
//******* 制作人:wusong *******************//
//********--------------------------- *******************//
//****-->|P1.0(ADC) (lcdrs)P1.6|-->
*********//
//****-->|P1.1(ADC) (lcden)P1.7|-->
*********//
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;
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;//退出低功耗模式 }
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
相关文档
最新文档