MSP430单片机AD转换实验.docx
- 文档编号:7471154
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:20
- 大小:29.50KB
MSP430单片机AD转换实验.docx
《MSP430单片机AD转换实验.docx》由会员分享,可在线阅读,更多相关《MSP430单片机AD转换实验.docx(20页珍藏版)》请在冰豆网上搜索。
MSP430单片机AD转换实验
AD转换实验
、转换原理
MSP430F149勺A/D转换器原理请参考相关书籍。
实验板上与AD相关的硬件电路:
RV§
10K
J6
P61
SIP2
A1)输入电路
编程工作实际就是对以下寄存器的操作:
寄存器类型
寄存器缩写
寄存器的含义
转换控制
ADC12CTL0
转换控制寄存器0
寄存器
ADC12CTL1
转换控制寄存器1
中断
ADC12IFG
中断标志奇存器
控制
ADC12IE
中断使能寄存器
寄存器
ADC12IV
中断向量寄存器
存储
及其
控制寄存器
ADC12MCTL~ADC12MCTL
存储控制寄存器0~15
ADC12MEM0-
ADC12MEM15
存储寄存器0~15
设计主程序和中断服务程序。
二、转换程序
1、程序1:
转换结果发送到PC
主程序中进行A/D初始化,中断服务程序读A/D转换结果,主程序中通过串口发送结果。
“”主程序与中断程序:
/*********************************************************
程序功能:
将ADC对端口电压的转换结果按转换数据和对应的
模拟电压的形式通过串口发送到PC机屏幕上显示
通信格式:
9600
测试说明:
打开串口调试精灵,正确设置通信格式,观察接收数据
**********************************************************/#include<>#include""#include""#include""
保存ADC转换结果的数组
#defineNum_of_Results32uintresults[Num_of_Results];//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;
for(i=0;i<4;i++)
buffer[i]+=0x30;
PutString0("Theanalogvalueis:
");
PutString(buffer);
}
}
/*******************************************
函数名称:
ADC12ISR
功能:
ADC中断服务函数,在这里用多次平均的
计算口的模拟电压数值
参数:
无
返回值:
无
********************************************/
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
staticucharindex=0;
results[index++]=ADC12MEM0;//Moveresults
if(index==Num_of_Results)
uchari;
average=0;
for(i=0;i { average+=results[i]; } average>>=5;//除以32 index=0; tcnt++; if(tcnt==250)//主要是降低串口发送速度 { LPM1_EXIT; tcnt=0; } } } “”A/D转换相关程序: #include<> typedefunsignedintuint; /******************************************** 函数名称: Init_ADC 功能: 初始化ADC 参数: 无 返回值: 无 ******************************************voidInit_ADC(void) { 使能ADC通道 打开ADC设置采样时间 使用采样定时器 使能ADC中断 使能转换 开始转换 P6SEL|=0x01;// ADC12CTL0=ADC12ON+SHT0_15+MSC;// ADC12CTL1=SHP+CONSEQ_2;// ADC12IE=0x01;// 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进制 真实的模拟电压数据,并在液晶上显示 参数: Hex_Val--16进制数据 返回值: 无 ********************************************/ voidTrans_val(uintHex_Val,uchar*ptr) { unsignedlongcaltmp; uintCurr_Volt; uchart1; 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); } “”串口程序: #include<> typedefunsignedcharuchar; /******************************************* 函数名称: InitUART 功能: 初始化UART端口 参数: 无返回值: 无 ********************************************/voidInitUART(void) P3SEL|=0x30; //,5=USART0TXD/RXD ME1|=URXE0+UTXE0; //EnableUSART0T/RXD UCTL0|=CHAR; //8-bitcharacter UTCTL0|=SSEL0; //UCLK=ACLK //32k/9600- UBR00=0x03; // 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! ='\0') { Send1Char(*ptr++);//发送数据 } while(! (IFG1&UTXIFG0)); TXBUF0='\n';//发送换行指令 } /******************************************* 函数名称: PutSting0 功能: 向PC机发送字符串,无换行 参数: ptr--指向发送字符串的指针 返回值: 无 ********************************************/ voidPutString0(uchar*ptr) { while(*ptr! ='\0') { Send1Char(*ptr++);//发送数据 2、程序2: 转换结果显示在1602显示模块上 “”程序 #include<> #include"" typedefunsignedcharuchar;typedefunsignedintuint; /************** 宏定义************* #defineDataDir P2DIR #defineDataPort P2OUT #defineBusy 0x80 #defineCtrlDir P6DIR **/ #defineCLR_RSP6OUT&=~BIT3; //RS= #defineSET_RSP6OUT|=BIT3; #defineCLR_RWP6OUT&=~BIT4; //RW= #defineSET_RWP6OUT|=BIT4; #defineCLR_ENP6OUT&=~BIT5; //EN= #defineSET_ENP6OUT|=BIT5; /******************************************* 函数名称: DispNchar 功能: 让液晶从某个位置起连续显示N个字符 参数: x--位置的列坐标 y--位置的行坐标 n--字符个数 ptr--指向字符存放位置的指针 返回值: 无 ******************************************voidDispNChar(ucharx,uchary,ucharn,uchar*ptr) { uchari; for(i=0;i { Disp1Char(x++,y,ptr[i]); if(x==0x0f) { x=0; yA=1; } } } /******************************************* 函数名称: LocateXY 功 能: 向液晶输入显示字符位置的坐标信息 参 数: x--位置的列坐标 y-- 位置的行坐标 返回值: 无 ****************************************** voidLocateXY(ucharx,uchary) { uchartemp; temp=x&0x0f; y&=0x01; if(y)temp|=0x40;//如果在第2行temp|=0x80; LcdWriteCommand(temp,1); }/*******************************************函数名称: Disp1Char 功能: 在某个位置显示一个字符 参数: x--位置的列坐标 y--位置的行坐标 data--显示的字符数据 返回值: 无********************************************/voidDisp1Char(ucharx,uchary,uchardata){ LocateXY(x,y); LcdWriteData(data); } /******************************************* 函数名称: LcdReset 功能: 对1602液晶模块进行复位操作 参数: 无 返回值: 无********************************************/voidLcdReset(void) CtrlDir|=0x07; // 控制线端口设为输出状态 数据端口设为输出状态 //规定的复位操作 //显示模式设置 //显示关闭 //显示清屏 //写字符时整体不移动 //显示开,不开游标,不闪烁 1: 判忙,0: 不判 DataDir=0xFF;// LcdWriteCommand(0x38,0); Delay5ms(); LcdWriteCommand(0x38,0); Delay5ms(); LcdWriteCommand(0x38,0); Delay5ms(); LcdWriteCommand(0x38,1); LcdWriteCommand(0x08,1); LcdWriteCommand(0x01,1); LcdWriteCommand(0x06,1); LcdWriteCommand(0x0c,1); } /*******************************************函数名称: LcdWriteCommand功能: 向液晶模块写入命令 参数: cmd--命令, chk--是否判忙的标志, 返回值: 无 ********************************************/ voidLcdWriteCommand(ucharcmd,ucharchk) { if(chk)WaitForEnable();//检测忙信号 CLR_RS; CLR_RW; _NOP(); DataPort=cmd;//将命令字写入数据端口 _NOP(); SET_EN;//产生使能脉冲信号 _NOP(); _NOP(); CLR_EN; } /******************************************* 函数名称: LcdWriteData 功能: 向液晶显示的当前地址写入显示数据 参数: data--显示字符数据 返回值: 无 ********************************************/ voidLcdWriteData(uchardata) { WaitForEnable();//等待液晶不忙 SET_RS; CLR_RW; _NOP(); DataPort=data;//将显示数据写入数据端口 _NOP(); SET_EN;//产生使能脉冲信号 _NOP(); _NOP(); CLR_EN; } /******************************************* 函数名称: WaitForEnable 功能: 等待1602液晶完成内部操作 参数: 无 返回值: 无 ********************************************/ voidWaitForEnable(void) { P2DIR&=0x00;//将P4口切换为输入状态 CLR_RS; SET_RW; _NOP(); SET_EN; _NOP(); _NOP(); while((P2IN&Busy)! =0);//检测忙标志 CLR_EN; 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--); } } “”程序 #include<> #include"" typedefunsignedcharuchar;typedefunsignedintuint; ************ 宏定义 ************* #defineDataDirP2DIR#defineDataPortP2OUT #defineBusy0x80 #defineCtrlDirP6DIR#defineCLR_RSP6OUT&=~BIT3;//RS= #defineSET_RSP6OUT|=BIT3; #defineCLR_RWP6OUT&=~BIT4;//RW #defineSET_RWP6OUT|=BIT4; #defineCLR_ENP6OUT&=~BIT5;//EN#defineSET_ENP6OUT|=BIT5; ***************************************** 函数名称: DispNchar N个字符 功能: 让液晶从某个位置起连续显示 参数: x--位置的列坐标 y-- 位置的行坐标 n-- 字符个数 ptr-- 指向字符存放位置的指针 返回值: 无 ********************************************/ voidDispNChar(ucharx,uchary,ucharn,uchar*ptr){ uchari; for(i=0;i { Disp1Char(x++,y,ptr[i]); if(x==0x0f) { x=0; yA=1; } } } /******************************************* 函数名称: LocateXY 功 能: 向液晶输入显示字符位置的坐标信息 参 数: x--位置的列坐标 y-- 位置的行坐标 返回值: 无 ****************************************** voidLocateXY(ucharx,uchary) uchartemp; temp=x&0x0f; y&=0x01; if(y)temp|=0x40;//如果在第2行temp|=0x80; LcdWriteCommand(temp,1); } /******************************************* 函数名称: Disp1Char 功能: 在某个位置显示一个字符 参数: x--位置的列坐标 y--位置的行坐标 data--显示的字符数据 返回值: 无********************************************/voidDisp1Char(ucharx,uchary,uchardata){ LocateXY(x,y); LcdWriteData(data); } /******************************************* 函数名称: LcdReset 功能: 对1602液晶模块进行复位操作参数: 无 控制线端口设为输出状态 数据端口设为输出状态 //规定的复位操作 //显示模式设置 //显示关闭 //显示清屏 //写字符时整体不移动 //显示开,不开游标,不闪烁 1: 判忙,0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MSP430 单片机 AD 转换 实验