MSP430单片机AD转换实验_第1页
MSP430单片机AD转换实验_第2页
MSP430单片机AD转换实验_第3页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、AD转换实验一、转换原理MSP430F149勺A/D转换器原理请参考相关书籍。 实验板上与AD相关的硬件电路:RV310K33J6P61S:ICAl)输入电路RV4III-10Kf|1 1|3EF1P50编程工作实际就是对以下寄存器的操作:寄存器类型寄存器缩写寄存器的含义转换控制奇存器ADC12CTL0转换控制寄存器0ADC12CTL1转换控制寄存器1中断 控制 寄存器ADC12IFG中断标志奇存器ADC12IE中断使能寄存器ADC12IV中断向量寄存器存储及其 控制寄存器ADC12MCTL ADC12MCTL存储控制寄存器015ADC12MEM0 -ADC12MEM15存储寄存器015设计主

2、程序和中断服务程序。二、转换程序1、程序1:转换结果发送到 PC主程序中进行 A/D初始化,中断服务程序读A/D转换结果,主程序中通过串口发送结果。“main.c ”主程序与中断程序:/*程序功能:将ADC对P6.0端口电压的转换结果按转换数据和对应的 模拟电压的形式通过串口发送到PC机屏幕上显示通信格式:N.8.1, 9600测试说明:打开串口调试精灵,正确设置通信格式,观察接收数据*/#i nclude #include allfunc.h#i nclude UARTO_Fu nc.c#in clude ADC_Fu nc.c#defi ne Num_of_Results 32uint r

3、esultsNum_of_Results; /保存 ADC转换结果的数组uint average;uchar tent = 0;主函数 */*void mai n( void )uchar i;uchar buffer5;WDTCTL = WDTPW + WDTHOLD; / 关狗/*下面六行程序关闭所有的10 口 */P1DIR =0XFF;P1OUT =0XFF;P2DIR =0XFF;P2OUT =0XFF;P3DIR =0XFF;P3OUT =0XFF;P4DIR =0XFF;P4OUT =0XFF;P5DIR =0XFF;P5OUT =0XFF;P6DIR =0XFF;P6OUT =

4、0XFF;关闭电平转换关闭数码管显示P6DIR |= BIT2;P6OUT |= BIT2; /P6DIR|=BIT6;P6OUT&=BIT6;/Ini tUART();Ini t_ADC(); _EINT();buffer4 = 0;while(1)LPM1;Hex2Dec(average,buffer);for(i = 0; i 4; i+) bufferi += 0x30;PutStri ngO(The digital value is:);PutStri ng(buffer);Tran s_val(average,buffer); buffer3 = buffer2; buffer2

5、= buffer1;buffer1 = 0x2e - 0x30;for(i = 0; i 4; i+) bufferi += 0x30;PutStri ng0(The an alog value is:);PutStri ng(buffer);/*函数名称:ADC12ISR功能: ADC中断服务函数,在这里用多次平均的计算P6.0 口的模拟电压数值参数:无返回值:无*/#pragma vector=ADC_VECTOR_in terrupt void ADC12ISR (void)/ Move resultsstatic uchar in dex = 0;results ndex+ = ADC

6、12MEM0; if(in dex = Num_of_Results) uchar i;average = 0;for(i = 0; i = 5;/除以32in dex = 0;ten t+;if(tc nt = 250)/主要是降低串口发送速度LPM1_EXIT;tent = 0;“ADC_Func.c” A/D转换相关程序:#in elude typedef un sig ned int uint;/*函数名称:Ini t_ADC功能:初始化ADC参数:无返回值:无*void In it_ADC(void)使能ADC通道打开ADC设置采样时间 使用采样定时器使能ADC中断使能转换开始转换P

7、6SEL |= 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)ptr0 = Hex_val / 1000;ptr1 = (Hex_val - ptr0*1000)/100;

8、ptr2 = (Hex_val - ptr0*1000 - ptr1*100)/10;ptr3 = (Hex_val - ptr0*1000 - ptr1*100 - ptr2*10);/*函数名称:Tran s_val功能:将16进制ADC转换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参数:Hex_Val-16 进制数据返回值:无*/void Tran s_val(u int Hex_Val,uchar *ptr)un sig ned long caltmp;ui nt Curr_Volt;uchar t1;caltmp = Hex_Val;caltmp = (caltmp 5

9、) + Hex_Val; /caltmp = Hex_Val * 33caltmp = (caltmp 3) + (caltmp 12;Curr_Volt = caltmp / 25变换ptr0 = Curr_Volt / 100;Hex-Dect1 = Curr_Volt - (ptr0 * 100);ptr1 = t1 / 10;ptr2 = t1 - (ptr1 * 10);“ UART0_Fu nc.c” 串口程序:#i nclude typedef un sig ned char uchar;/*函数名称:In itUART功能:初始化UART端 口参数:无返回值:无* void I

10、n itUART(void)/ P3.4,5 = USART0 TXD/RXD/ En able USART0 T/RXD/ 8-bit character/ UCLK = ACLK/ 32k/9600 - 3.41/P3SEL |= 0x30;ME1 |= URXE0 + UTXE0;UCTL0 |= CHAR;UTCTL0 |= SSEL0;UBR00 = 0x03;UBR10 = 0x00;UCTLO &= SWRST;/Initialize USART state machine/*函数名称:Sen d1Char功能:向PC机发送一个字符参数:sendchar-要发送的字符返回值:无*

11、 Jvoid Sen d1Char(uchar sen dchar)while (!(IFG1 & UTXIFGO); /TXBUF0 = sen dchar;等待发送寄存器为空/*函数名称:PutSt ing功能:向PC机发送字符串并换行指令参数:ptr-指向发送字符串的指针返回值:无*/void PutStri ng(uchar *ptr)while(*ptr != 0)Sen d1Char(*ptr+);/while (!(IFG1 & UTXIFGO);TXBUF0 = n;/*函数名称:PutSti ngO功能:向PC机发送字符串,无换行参数:ptr-指向发送字符串的指针返回值:无*

12、/void PutStri ng0(uchar *ptr)while(*ptr != 0)Sen d1Char(*ptr+);/发送数据发送换行指令发送数据2、程序2:转换结果显示在 1602显示模块上/*#defi ne DataDir#defi ne DataPort#defi ne Busy#defi ne CtrlDir#defi ne CLR_RS P6OUT&=BIT3;#defi ne SET_RS P6OUT|=BIT3;#defi ne CLR_RW P6OUT&=BIT4;#defi ne SET_RW P6OUT|=BIT4;#defi ne CLR_EN P6OUT&=

13、BIT5; #defi ne SET_EN P6OUT|=BIT5;/*/RS = P6.3RW = P6.4EN = P6.5“ ma in .c ”程序#in clude #in clude cry1602.h typedef un sig ned char uchar; typedef un sig ned int uint;定义 */P2DIRP2OUT0x80P6DIR函数名称:DispNchar功能:让液晶从某个位置起连续显示参数:x-位置的列坐标y-位置的仃坐标n-字符个数ptr-指向字符存放位置的指N个字符返回值:无*/void DispNChar(uchar x,uchar

14、y, uchar n, uchar *ptr) uchar i;for (i=0;i n ;i+)Disp1Char(x+,y,ptri);if (x = 0x0f)x = 0;y A= 1;LocateXY向液晶输入显示字符位置的坐标信息X-位置的列坐标/* 函数名称: 功 能:参 数:y-位置的行坐标返回值:无*void LocateXY(uchar x,uchar y)uchar temp;temp = x&OxOf;y &= 0x01;如果在第if(y) temp |= 0x40; / temp |= 0x80;LcdWriteComma nd(temp,1);DispIChar在某个

15、位置显示一个字符位置的列坐标位置的行坐标显示的字符数据x-/* 函数名称: 功 能:参 数:y- data-返回值:无*/ void Disp1Char(uchar x,uchar y,uchar data)LocateXY( x, y );LcdWriteData( data );/*函数名称:LcdReset功 能:对1602液晶模块进行复位操作参 数:无返回值:无*/void LcdReset(void) CtrlDir |= 0x07;DataDir = 0xFF;/控制线端口设为输出状态 数据端口设为输出状态/规定的复位操作LcdWriteComma nd(0x38, 0);Dela

16、y5ms();LcdWriteComma nd(0x38, 0);Delay5ms();LcdWriteComma nd(0x38, 0);Delay5ms();LcdWriteComma nd(0x38, 1);LcdWriteComma nd(0x08, 1);LcdWriteComma nd(0x01, 1);LcdWriteComma nd(0x06, 1);LcdWriteComma nd(0x0c, 1);/* 函数名称:LcdWriteComma nd 功能:向液晶模块写入命令参数:cmd-命令,chk-是否判忙的标志,返回值:无/显示模式设置/显示关闭/ 显示清屏/写字符时整体

17、不移动/显示开,不开游标,不闪烁1:判忙,0:不判*/void LcdWriteComma nd(uchar cmd,uchar chk)if (chk) WaitForE nable(); /检测忙信号?CLR_RS;CLR_RW;_NOP();_NOP();SET_EN;_NOP();_NOP(); CLR_EN;/DataPort = cmd;/将命令字写入数据端口产生使能脉冲信号/*函数名称:LcdWriteData功能:向液晶显示的当前地址写入显示数据参数:data-显示字符数据返回值:无*/void LcdWriteData( uchar data )WaitForE nable(

18、);/等待液晶不忙SET_RS;CLR_RW;_NOP();DataPort = data; /将显示数据写入数据端口_NOP();SET_EN;/产生使能脉冲信号_NOP();_NOP();CLR_EN;/*函数名称:WaitForE nable功能:等待1602液晶完成内部操作参 数:无 返回值:无*/void WaitForE nable(void)P2DIR &= 0x00; / 将P4 口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();_NOP();检测忙标志while(P2IN & Busy)!=0); /CLR_EN;P2DIR |= 0xFF

19、; /将P4 口切换为输出状态 /*函数名称:Delay5ms功能:延时约5ms参数:无返回值:无*void Delay5ms(void)uint i=40000;while (i != 0)I-;/*函数名称:Delay400ms功能:延时约400ms参数:无返回值:无*void Delay400ms(void)uchar i=50;uint j;while(i-)j=7269; while(j-);“cry1602.c ”程序#in clude #in clude cry1602.h typedef un sig ned char uchar; typedef un sig ned int

20、 uint;/*定义 */#defi ne DataDirP2DIR#defi ne DataPortP2OUT#defi ne Busy#defi ne CtrlDir0x80P6DIR#defi ne CLR_RS P6OUT&=BIT3;#defi ne SET_RS P6OUT|=BIT3;#defi ne CLR_RW P6OUT&=BIT4;#defi ne SET_RW P6OUT|=BIT4;#defi ne CLR_EN P6OUT&=BIT5; #defi ne SET_EN P6OUT|=BIT5;/*/RS = P6.3RW = P6.4EN = P6.5函数名称:Di

21、spNchar功 能:让液晶从某个位置起连续显示N个字符参 数:X-位置的列坐标y- 位置的行坐标n-字符个数ptr-指向字符存放位置的指针返回值:无*/void DispNChar(uchar x,uchar y, uchar n, uchar *ptr) uchar i;for (i=0;i n ;i+)Disp1Char(x+,y,ptri);if (x = 0x0f)x = 0;y A= 1;未*函数名称:LocateXY功能:向液晶输入显示字符位置的坐标信息参数:x-位置的列坐标y-位置的仃坐标返回值:无*/void LocateXY(uchar x,uchar y)uchar te

22、mp;temp = x&OxOf;y &= 0x01;if(y) temp |= 0x40; /如果在第 2 行temp |= 0x80;LcdWriteComma nd(temp,1);/* 函数名称:DispIChar功 能:在某个位置显示一个字符 参 数:X-位置的列坐标y- 位置的行坐标data-显示的字符数据返回值:无void Disp1Char(uchar x,uchar y,uchar data) LocateXY( x, y ); LcdWriteData( data );/*函数名称:LcdReset功能:对1602液晶模块进行复位操作参数:无返回值:无*Ivoid LcdR

23、eset(void)CtrlDir |= 0x07;/DataDir = 0xFF;/LcdWriteComma nd(0x38, 0);Delay5ms();LcdWriteComma nd(0x38, 0); Delay5ms();LcdWriteComma nd(0x38, 0); Delay5ms();LcdWriteComma nd(0x38, 1);LcdWriteComma nd(0x08, 1);LcdWriteComma nd(0x01, 1);LcdWriteComma nd(0x06, 1);LcdWriteComma nd(0x0c, 1);/* 函数名称:LcdWriteComma nd 功能:向液晶模块写入命令参数:cmd-命令,chk-是否判忙的标志,返回值:无控制线端口设为输出状态 数据端口设为输出状态/ 规定的复位操作/显示模式设置/显示关闭/ 显示清屏/写字符时整体不移动/显示开,不开游标,不闪烁1:判忙,0:不判*/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论