MSP430单片机AD转换实验Word格式文档下载.docx
《MSP430单片机AD转换实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《MSP430单片机AD转换实验Word格式文档下载.docx(24页珍藏版)》请在冰点文库上搜索。
“main.c”主程序与中断程序:
/*********************************************************
程序功能:
将ADC对P6.0端口电压的转换结果按转换数据和对应的
模拟电压的形式通过串口发送到PC机屏幕上显示
-----------------------------------------------------------
通信格式:
N.8.1,9600
测试说明:
打开串口调试精灵,正确设置通信格式,观察接收数据
**********************************************************/
#include<
msp430.h>
#include"
allfunc.h"
UART0_Func.c"
ADC_Func.c"
#defineNum_of_Results32
uintresults[Num_of_Results];
//保存ADC转换结果的数组
uintaverage;
uchartcnt=0;
/***********************主函数***********************/
voidmain(void)
{
uchari;
ucharbuffer[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("
Thedigitalvalueis:
"
);
PutString(buffer);
Trans_val(average,buffer);
buffer[3]=buffer[2];
buffer[2]=buffer[1];
buffer[1]=0x2e-0x30;
Theanalogvalueis:
}
}
/*******************************************
函数名称:
ADC12ISR
功能:
ADC中断服务函数,在这里用多次平均的
计算P6.0口的模拟电压数值
参数:
无
返回值:
无
********************************************/
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
staticucharindex=0;
results[index++]=ADC12MEM0;
//Moveresults
if(index==Num_of_Results)
average=0;
Num_of_Results;
average+=results[i];
average>
>
=5;
//除以32
index=0;
tcnt++;
if(tcnt==250)//主要是降低串口发送速度
LPM1_EXIT;
tcnt=0;
“ADC_Func.c”A/D转换相关程序:
typedefunsignedintuint;
/********************************************
Init_ADC
初始化ADC
voidInit_ADC(void)
P6SEL|=0x01;
//使能ADC通道
ADC12CTL0=ADC12ON+SHT0_15+MSC;
//打开ADC,设置采样时间
ADC12CTL1=SHP+CONSEQ_2;
//使用采样定时器
ADC12IE=0x01;
//使能ADC中断
ADC12CTL0|=ENC;
//使能转换
ADC12CTL0|=ADC12SC;
//开始转换
Hex2Dec
将16进制ADC转换数据变换成十进制
表示形式
Hex_Val--16进制数据
ptr--指向存放转换结果的指针
voidHex2Dec(uintHex_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;
ptr[3]=(Hex_val-ptr[0]*1000-ptr[1]*100-ptr[2]*10);
}
Trans_val
将16进制ADC转换数据变换成三位10进制
真实的模拟电压数据,并在液晶上显示
voidTrans_val(uintHex_Val,uchar*ptr)
unsignedlongcaltmp;
uintCurr_Volt;
uchart1;
caltmp=Hex_Val;
caltmp=(caltmp<
<
5)+Hex_Val;
//caltmp=Hex_Val*33
3)+(caltmp<
1);
//caltmp=caltmp*10
Curr_Volt=caltmp>
12;
//Curr_Volt=caltmp/2^n
ptr[0]=Curr_Volt/100;
//Hex->
Dec变换
t1=Curr_Volt-(ptr[0]*100);
ptr[1]=t1/10;
ptr[2]=t1-(ptr[1]*10);
“UART0_Func.c”串口程序:
typedefunsignedcharuchar;
InitUART
初始化UART端口
voidInitUART(void)
P3SEL|=0x30;
//P3.4,5=USART0TXD/RXD
ME1|=URXE0+UTXE0;
//EnableUSART0T/RXD
UCTL0|=CHAR;
//8-bitcharacter
UTCTL0|=SSEL0;
//UCLK=ACLK
UBR00=0x03;
//32k/9600-3.41
UBR10=0x00;
//
UMCTL0=0x4A;
//Modulation
UCTL0&
=~SWRST;
//InitializeUSARTstatemachine
Send1Char
向PC机发送一个字符
sendchar--要发送的字符
voidSend1Char(ucharsendchar)
while(!
(IFG1&
UTXIFG0));
//等待发送寄存器为空
TXBUF0=sendchar;
PutSting
向PC机发送字符串并换行指令
ptr--指向发送字符串的指针
voidPutString(uchar*ptr)
while(*ptr!
='
)
Send1Char(*ptr++);
//发送数据
TXBUF0='
\n'
//发送换行指令
PutSting0
向PC机发送字符串,无换行
voidPutString0(uchar*ptr)
2、程序2:
转换结果显示在1602显示模块上
“main.c”程序
msp430x14x.h>
cry1602.h"
/**************宏定义***************/
#defineDataDirP2DIR
#defineDataPortP2OUT
#defineBusy0x80
#defineCtrlDirP6DIR
#defineCLR_RSP6OUT&
=~BIT3;
//RS=P6.3
#defineSET_RSP6OUT|=BIT3;
#defineCLR_RWP6OUT&
=~BIT4;
//RW=P6.4
#defineSET_RWP6OUT|=BIT4;
#defineCLR_ENP6OUT&
=~BIT5;
//EN=P6.5
#defineSET_ENP6OUT|=BIT5;
DispNchar
让液晶从某个位置起连续显示N个字符
x--位置的列坐标
y--位置的行坐标
n--字符个数
ptr--指向字符存放位置的指针
voidDispNChar(ucharx,uchary,ucharn,uchar*ptr)
for(i=0;
i<
n;
i++)
Disp1Char(x++,y,ptr[i]);
if(x==0x0f)
{
x=0;
y^=1;
}
LocateXY
向液晶输入显示字符位置的坐标信息
voidLocateXY(ucharx,uchary)
uchartemp;
temp=x&
0x0f;
y&
=0x01;
if(y)temp|=0x40;
//如果在第2行
temp|=0x80;
LcdWriteCommand(temp,1);
Disp1Char
在某个位置显示一个字符
data--显示的字符数据
voidDisp1Char(ucharx,uchary,uchardata)
LocateXY(x,y);
LcdWriteData(data);
LcdReset
对1602液晶模块进行复位操作
voidLcdReset(void)
CtrlDir|=0x07;
//控制线端口设为输出状态
DataDir=0xFF;
//数据端口设为输出状态
LcdWriteCommand(0x38,0);
//规定的复位操作
Delay5ms();
LcdWriteCommand(0x38,0);
LcdWriteCommand(0x38,1);
//显示模式设置
LcdWriteCommand(0x08,1);
//显示关闭
LcdWriteCommand(0x01,1);
//显示清屏
LcdWriteCommand(0x06,1);
//写字符时整体不移动
LcdWriteCommand(0x0c,1);
//显示开,不开游标,不闪烁
LcdWriteCommand
向液晶模块写入命令
cmd--命令,
chk--是否判忙的标志,1:
判忙,0:
不判
voidLcdWriteCommand(ucharcmd,ucharchk)
if(chk)WaitForEnable();
//检测忙信号?
CLR_RS;
CLR_RW;
_NOP();
DataPort=cmd;
//将命令字写入数据端口
SET_EN;
//产生使能脉冲信号
CLR_EN;
LcdWriteData
向液晶显示的当前地址写入显示数据
data--显示字符数据
voidLcdWriteData(uchardata)
WaitForEnable();
//等待液晶不忙
SET_RS;
DataPort=data;
//将显示数据写入数据端口
WaitForEnable
等待1602液晶完成内部操作
voidWaitForEnable(void)
P2DIR&
=0x00;
//将P4口切换为输入状态
SET_RW;
while((P2IN&
Busy)!
=0);
//检测忙标志
P2DIR|=0xFF;
//将P4口切换为输出状态
Delay5ms
延时约5ms
voidDelay5ms(void)
{
uinti=40000;
while(i!
=0)
i--;
Delay400ms
延时约400ms
voidDelay400ms(void)
uchari=50;
uintj;
while(i--)
j=7269;
while(j--);
“cry1602.c”程序
temp|=0x8