报告五
- 格式:docx
- 大小:712.13 KB
- 文档页数:29
//计算四次转换结果均值
a=r/256; b=(r-256*a)/16; c=r-256*a-16*b;
//计算第三位数码管显示的值 //计算第二位数码管显示的值 //计算第一位数码管显示的值
while(1) {
P2OUT=LED[c]; P1OUT|=BIT0; P1OUT&=~(BIT1+BIT2); delay(); P2OUT=LED[b]; P1OUT|=BIT1; P1OUT&=~(BIT0+BIT2); delay(); P2OUT=LED[a]; P1OUT|=BIT2; P1OUT&=~(BIT0+BIT1); delay(); } }
实验名称:实验 10_A.模拟信号转换接口 姓名:袁鹏学号:2013011780 实验班号:33
一、实验目的 了解模/数转换和数/模转换工作原理,掌握MSP430 单片机内ADC10 模/数转换模块的 控制和应用。 二、实验任务 1. 模/数转换器ADC10 的编程控制 利用 MSP430G2553 内部的ADC10 模数转换器,采用单通道单次转换方式,对实验板 上的一路模拟信号进行A/D 转换,模拟信号为一个0~VCC 的直流电压信号,信号大小 通过拨码可调电阻的阻值改变,。对每个模拟信号转换4 次,求平均值后,将得到的10 位转换结果通过3 个数码管以16 进制形式显示出来, 如数字量0x3AE, 则数码管上显示 3AE。记录 3 个模拟信号的转换结果,将数字量换算为模拟量,与示波器测量的结果比 较。
机器号:42
实现方法:将A0管脚设置为模拟信号输入,即使用P1.0来接收模拟信号,将P1.0与 可调电阻Vin引脚相连, 使用查询方式编程控制A/D转换并将转换结果通过三位数码管以 16进制显示出来。具体代码如下: #include "io430.h" #include "in430.h" void delay() //延时函数
int main ( void ) { WDTCTL = WDTPW + WDTHOLD; _DINT(); //关闭看门狗
P2SEL=0; P2SEL2=0; P2DIR=0xff; P2OUT=0;
//置 P2.0~P2.7 为输出
P1SEL&=~(BIT0+BIT1+BIT2); P1SEL2&=~(BIT0+BIT1+BIT2); P1DIR|=(BIT0+BIT1+BIT2); P1OUT|=(BIT0+BIT1+BIT2);
������������������−������������− 转换为实际电压值即可,具体代码如下: ������������+ −������������−
#include "io430.h" #include "in430.h" void delay() { unsigned int i; for(i=0;i<0x5ff;i++); } //延时函数
P1SEL&=~(BIT0+BIT1+BIT2); P1SEL2&=~(BIT0+BIT1+BIT2); P1DIR|=(BIT0+BIT1+BIT2); P1OUT|=(BIT0+BIT1+BIT2);
//置 P1.0~P1.2 为输出
ADC10AE0|=BIT0; ADC10CTL0|=ADC10ON+ENC;
//控制第一个数码管显示的数字
//控制第二个数码管显示的数字
ห้องสมุดไป่ตู้
//控制第三个数码管显示的数字
实验时 ADC10 的参考电压 VR+ = VCC, 用示波器测量实验板 VCC 的实际大小为 3.60V。 三次测量结果与示波器测量结果如下, 根据 ADC10 转换公式:NADC=1023×������������+ −������������−换算, 结 果误差较小,说明 A/D 转换器精度比较可靠。 显示数字 A/D 转换结果(V) 0x00bd 0.67 0x02df 2.59 2.58 0x0313 2.80 2.68
}
r=(result[0]+result[1]+result[2]+result[3])/4;
//计算四次转换结果均值
a=r/256; b=(r-256*a)/16; c=r-256*a-16*b;
//计算第三位数码管显示的值 //计算第二位数码管显示的值 //计算第一位数码管显示的值
while(1) {
������������������−������������−
示 波 器 测 量 结 果 0.67 (V) 思考:
1) 如果模拟信号是从P1.4 接入,如何编程?请在实验板上连线,并完成。
如果模拟信号是从P1.4接入,那么只需将A4管脚设为允许模拟信号输入,再设 置采样通道INCH为0100即可。具体代码如下: #include "io430.h" #include "in430.h" void delay() { unsigned int i; for(i=0;i<0x5ff;i++); } //延时函数
//允许 A0 管脚模拟信号输入 //给内核供电,允许转换
for(i=0;i<4;i++) {
ADC10CTL0|=ADC10SC; while((ADC10CTL0&ADC10IFG)==0); result[i]=ADC10MEM; }
//软件启动采样 //查询转换是否完成 //保存转换结果
r=(result[0]+result[1]+result[2]+result[3])/4;
} #pragma vector=TIMER0_A0_VECTOR __interrupt void time() { ADC10CTL0|=ADC10SC; while((ADC10CTL0&ADC10IFG)==0); r=ADC10MEM; ADC10CTL0&=~ENC; ADC10CTL0|=ENC; //启动一次采样 //软件启动采样 //查询转换是否完成 // 中断程序
//置 P1.0~P1.2 为输出
ADC10AE0|=BIT4; ADC10CTL1|=INCH2; ADC10CTL0|=ADC10ON+ENC;
//允许 A4 管脚模拟信号输入 //选择 A4 通道为采样通道 //给内核供电,允许转换
ADC10CTL0&=~ENC;//启动一次采样 ADC10CTL0|=ENC;
//置 P1.0~P1.2 为输出
ADC10AE0|=BIT4; ADC10CTL1|=INCH2; ADC10CTL0|=ADC10ON+ENC;
//允许 A4 管脚模拟信号输入 //选择 A4 通道为采样通道 //给内核供电,允许转换
for(i=0;i<4;i++) { ADC10CTL0|=ADC10SC; while((ADC10CTL0&ADC10IFG)==0); result[i]=ADC10MEM; //软件启动采样 //查询转换是否完成 //保存转换结果
a=r/256; b=(r-256*a)/16; c=r-256*a-16*b; }
//计算第三位数码管显示的值 //计算第二位数码管显示的值 //计算第一位数码管显示的值
2. (选做) 制作一个量程为0~VCC 的数字电压表B 将任务1 中A/D 转换得到的10 位数字量对应的模拟电压值通过数3 个数码管显示出来, 即显示到小数点后两位,如数字量0x3AE, 参考电压3.6V,对应3.04V,则数码管上显 示3.04。请记录3 组测量值,并与示波器测量的结果进行比较。 实现方法:只需在任务一的基础上,将数码管显示的16进制数通过ADC10转换公式 NADC=1023×
unsigned int a=0,b=0,c=0,r=0; 的显示数字,r 为转换结果
//定义变量,其中 abc 分别为数码管 123
unsigned char LED[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xC6,0xa1,0x86,0x 8e}; //LED 灯 unsigned int result[32]; int main ( void ) { WDTCTL = WDTPW + WDTHOLD; unsigned int i; //关闭看门狗
TA0CTL|=TACLR+TASSEL_2+MC_1; 增计数方式 TA0CCR0=624; TA0CCTL0|=CCIE; _EINT();
//采用 SMCLK 时钟源,清零计数器,选择
//设置初值,控制采样时间 // 打开中断允许
while(1) { P2OUT=LED[c]; P1OUT|=BIT0; P1OUT&=~(BIT1+BIT2); delay(); P2OUT=LED[b]; P1OUT|=BIT1; P1OUT&=~(BIT0+BIT2); delay(); P2OUT=LED[a]; P1OUT|=BIT2; P1OUT&=~(BIT0+BIT1); delay(); } //控制第三个数码管显示的数字 //控制第二个数码管显示的数字 //控制第一个数码管显示的数字
{ unsigned int i; for(i=0;i<0x5ff;i++); } unsigned int a=0,b=0,c=0,r=0; 的显示数字,r 为转换结果 //定义变量,其中 abc 分别为数码管 123