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
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
********************************************/ 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
/******************************************* 函数名称 :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
/************** 宏定义***************/
#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-- 位置的列坐标