当前位置:文档之家› MSP430单片机AD转换实验

MSP430单片机AD转换实验

MSP430单片机AD转换实验
MSP430单片机AD转换实验

AD转换实验

一、转换原理

MSP430F149勺A/D转换器原理请参考相关书籍。实验板上与AD相关的硬件电路:

RV3

10K

------------ 3-3\

J6

P61

SI?2

Al)输入电路

RV4

III-10K f > 2 ;

|||

二、转换程序

1、程序1:转换结果发送到PC

主程序中进行A/D初始化,中断服务程序读A/D转换结果,主程序中通过串口发送结果。

“ main 、c ”主程序与中断程序:

/*********************************************************

程序功能:将ADC 对P6、0端口电压的转换结果按转换数据与对应的 模拟电压的形式通过

串口发送到

PC 机屏幕上显示

通信格式 :N 、 8、 1, 9600

测试说明 :打开串口调试精灵 ,正确设置通信格式 ,观察接收数据 **********************************************************/ #include #include "allfunc 、 h" #include "UART0_Func 、 c" #include "ADC_Func 、 c" #define Num_of_Results 32 uint results[Num_of_Results]; // 保存 ADC 转换结果的数组

uint average; uchar tcnt = 0; /*********************** void main( void )

{

uchar i; uchar buffer[5];

WDTCTL = WDTPW + WDTHOLD; // 关狗 /* 下面六行程序关闭所有的 IO 口 */ P1DIR = 0XFF;P1OUT = 0XFF; P2DIR = 0XFF;P2OUT

=

0XFF;

P3DIR = 0XFF;P3OUT

=

0XFF;

P4DIR = 0XFF;P4OUT

=

0XFF;

P5DIR = 0XFF;P5OUT

=

0XFF;

P6DIR = 0XFF;P6OUT = 0XFF; P6DIR |= BIT2;P6OUT |= BIT2; // P6DIR|=BIT6;P6OUT&=~BIT6; //

InitUART(); Init_ADC(); _EINT(); buffer[4] = '\0';

主函数 *********************

关闭电平转换

关闭数码管显示

while(1)

{

LPM1;

Hex2Dec(average,buffer);

for(i = 0; i < 4; i++) buffer[i] += 0x30;

PutString0("The digital value is: ");

PutString(buffer);

Trans_val(average,buffer); buffer[3] = buffer[2]; buffer[2] = buffer[1];

buffer[1] = 0x2e - 0x30; for(i = 0; i < 4; i++) buffer[i] += 0x30;

PutString0("The analog value is: "); PutString(buffer);

}

}

/******************************************* 函数名称:ADC12ISR

功能:ADC中断服务函数,在这里用多次平均的

计算P6、0 口的模拟电压数值

参数: 无返回值: 无********************************************/ #pragma

vector=ADC_VECTOR __interrupt void ADC12ISR (void) { static uchar index = 0;

results[index++] = ADC12MEM0; // Move results if(index == Num_of_Results) {

uchar i;

average = 0;

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

{ average += results[i];

average >>= 5; // 除以 32

index = 0; tcnt++;

if(tcnt == 250) // 主要就是降低串口发送速度 { LPM1_EXIT; tcnt = 0; } }

}

“ADC_Func 、 c ” A/D 转换相关程序 : #include typedef unsigned int uint; /******************************************** 函数名称 :Init_ADC 功 能: 初始化 ADC 参 数: 无 返回值 : 无

********************************************/ void Init_ADC(void) {

P6SEL |= 0x01; // ADC12CTL0 =

ADC12ON+SHT0_15+MSC; // ADC12CTL1 =

SHP+CONSEQ_2; // ADC12IE = 0x01; // ADC12CTL0 |= ENC; // ADC12CTL0 |= ADC12SC; //

}

/******************************************** 函数名称 :Hex2Dec

功 能:将16进制ADC 专换数据变换成十进制

表示形式

数:Hex_Val--16 进制数据 ptr--

指向存放专换结果的指针

返回值 : 无 ********************************************/ void Hex2Dec(uint Hex_val,uchar *ptr) { ptr[0] = Hex_val / 1000;

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

使能ADC 通道

打开ADC 设置采样时间 使用采样定时器 使能ADC 中断 使能专换 开始专换

、 41

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

}

/******************************************* 函数名称 :Trans_val

功 能:将16进制ADC 专换数据变换成三位 10进制

真实的模拟电压数据 , 并在液晶上显示

数:Hex_Val--16 进制数据

返回值 : 无

********************************************/ void Trans_val(uint Hex_Val,uchar *ptr)

{

unsigned long caltmp; uint Curr_Volt; uchar t1;

caltmp = Hex_Val;

caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33 caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10 Curr_Volt = caltmp >> 12; 〃Curr_Volt = caltmp / 25 ptr[0] = Curr_Volt / 100;

//Hex->Dec

t1 = Curr_Volt - (ptr[0] * 100); ptr[1] = t1 / 10;

ptr[2] = t1 - (ptr[1] * 10);

}

“UARTO_Func c ”串口程序: #include typedef unsigned char uchar;

/******************************************* 函数名称 :InitUART 功 能:初始化UART 端 口

参 数: 无 返回值 : 无

********************************************

// P3 、 4,5 =

// Enable USART0 T/RXD

// 8-bit character

// UCLK = ACLK

// 32k/9600 - 3 // // Modulation

void InitUART(void)

{

P3SEL |= 0x30; ME1 |= URXE0 + UTXE0;

UCTL0 |= CHAR; UTCTL0 |= SSEL0; UBR00 = 0x03; UBR10 = 0x00; UMCTL0 = 0x4A;

变换

USART0 TXD/RXD

// Initialize USART state machine

}

/*******************************************

函数名称:Send1Char

功能:向PC机发送一个字符

参数:se ndchar--要发送的字符

返回值:无

********************************************

void Send1Char(uchar sendchar)

{

while (!(IFG1 & UTXIFG0)); //

TXBUF0 = sendchar;

等待发送寄存器为空

} /******************************************* 函

数名称:PutSting

功能:向PC机发送字符串并换行指令

参数:ptr--指向发送字符串的指针

返回值: 无

********************************************/

void PutString(uchar *ptr)

{

while(*ptr != '\0')

{

Send1Char(*ptr++); //

}

while (!(IFG1 & UTXIFG0));

TXBUF0 = '\n'; //

} /******************************************* 函数名称:PutSting0

功能:向PC机发送字符串,无换行

参数:ptr--指向发送字符串的指针

返回值: 无

********************************************/ void PutString0(uchar *ptr)

{

while(*ptr != '\0')

{

Send1Char(*ptr++); // }

}

发送数据发送换行指令

发送数据

2、程序2: 转换结果显示在1602 显示模块上

UCTL0 &= ~SWRST;

“ main、c” 程序

#include #include "cry1602 、h" typedef unsigned char uchar; typedef unsigned int uint;

/************** 宏定义***************/

#define DataDir P2DIR

#define DataPort P2OUT

#define Busy 0x80

#define CtrlDir P6DIR

#define CLR_RS P6OUT&=~BIT3; //RS = P6 、3

#define SET_RS P6OUT|=BIT3;

#define CLR_RW P6OUT&=~BIT4; //RW = P6 、4

#define SET_RW P6OUT|=BIT4;

#define CLR_EN P6OUT&=~BIT5; //EN = P6 、5

#define SET_EN P6OUT|=BIT5;

/*******************************************

函数名称:DispNchar

功能:让液晶从某个位置起连续显示N个字符参数: x-- 位置的列坐标

y-- 位置的行坐标

n-- 字符个数

ptr-- 指向字符存放位置的指针

返回值: 无

******************************************

void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) uchar i;

for (i=0;i

{

Disp1Char(x++,y,ptr[i]);

if (x == 0x0f)

{

x = 0;

y A= 1;

}

}

}

/*******************************************

函数名称:LocateXY

功能: 向液晶输入显示字符位置的坐标信息

参数:x-- 位置的列坐标

相关主题
文本预览
相关文档 最新文档