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

付费下载

下载本文档

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

文档简介

1、A/D转换实验一、转换原理MSP430F149勺A/D转换器原理请参考相关书籍.实验板上与AD相关的硬件电路:RV5j 10K匚13 八J6P61SW2AD输入电路RV4J 1QK|神h13 3VJ7P50SIP2编程工作实际就是对以下存放器的操作:存放器类型存放器缩写存放器的含义转换限制ADC12CTL0转换限制存放器0存放器ADC12CTL1转换限制存放器1中断ADC12IFG中断标志奇存器限制ADC12IE中断使能存放器存放器ADC12IV中断向量存放器存 储及其限制存放器ADC12MCTL ADC12MCTL存储限制存放器015ADC12MEM0 ADC12MEM15存储存放器015设

2、计主程序和中断效劳程序.二、转换程序1、程序1:转换结果发送到 PC主程序中进行 A/D初始化,中断效劳程序读 A/D转换结果,主程序中通过串口发送结果.主程序与中断程序:/*程序功能:将ADC对端口电压的转换结果按转换数据和对应的模拟电压的形式通过串口发送到PC机屏幕上显示通信格式:9600测试说明:翻开串口调试精灵,正确设置通信格式,观察接收数据*/ #include <> #include "" #include "" #include ""保存ADC专换结果的数组#define NumofResults 32 ui

3、nt resultsNum_of_Results; / uint average;/*uchar tcnt = 0;主函数 */void main( void )关狗关闭电平转换关闭数码管显示uchar i;uchar buffer5;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 =

4、 0XFF;P6OUT = 0XFF;P6DIR |= BIT2;P6OUT |= BIT2; /P6DIR|=BIT6;P6OUT&=BIT6;/InitUART();Init_ADC();_EINT();buffer4 = '0'while(1)LPM1;Hex2Dec(average,buffer);for(i = 0; i < 4; i+)bufferi += 0x30;PutString0("The digital value is:");PutString(buffer);Trans_val(average,buffer);buff

5、er3 = buffer2;buffer2 = buffer1;buffer1 = 0x2e - 0x30;for(i = 0; i < 4; i+)bufferi += 0x30;PutString0("The analog value is:");PutString(buffer);/*函数名称:ADC12ISR功能:ADC中断效劳函数,在这里用屡次平均的计算口的模拟电压数值参数:无返回值:无*/#pragma vector=ADC_VECTOR_interrupt void ADC12ISR (void)static uchar index = 0;result

6、sindex+ = ADC12MEM0; / Move resultsif(index = Num_of_Results)uchar i;average = 0;for(i = 0; i < Num_of_Results; i+)(average += resultsi;average >>= 5;/除以 32index = 0;tcnt+;if(tcnt = 250)/主要是降低串口发送速度(LPM1_EXIT;tcnt = 0;A/D转换相关程序:#include <>typedef unsigned int uint;/*函数名称:Init_ADC功能:初始

7、化ADC参数:无void Init_ADC(void)P6SEL |= 0x01;/ADC12CTL0 = ADC12ON+SHT0_15+MSC;/ADC12CTL1 = SHP+CONSEQ_2;/ADC12IE = 0x01;/ADC12CTL0 |= ENC;/ADC12CTL0 |= ADC12SC;/使能ADC通道翻开ADC设置采样时间使用采样定时器使能ADC中断使能转换开始转换/*函数名称:Hex2Dec台匕目匕:将16进制ADC转换数据变换成十进制表布形式Hex Val-16进制数据ptr-指向存放转换结果的指针返回值:无*/ void Hex2Dec(uint Hex_val

8、,uchar *ptr)ptr0 = Hex_val / 1000;ptr1 = (Hex_val - ptr0*1000)/100;ptr2 = (Hex_val - ptr0*1000 - ptr1*100)/10;ptr3 = (Hex_val - ptr0*1000 - ptr1*100 - ptr2*10);/*函数名称:Trans val功 能:将16进制ADC转换数据变换成三位10进制真实的模拟电压数据,并在液晶上显示参 数:Hex_Val-16 进制数据返回值:无*/void Trans_val(uint Hex_Val,uchar *ptr)(unsigned long ca

9、ltmp;uint Curr_Volt;uchar t1;caltmp = Hex_Val;caltmp = (caltmp << 5) + Hex_Val; /caltmp = Hex_Val * 33caltmp = (caltmp << 3) + (caltmp << 1); /caltmp = caltmp * 10Curr_Volt = caltmp >> 12;/Curr_Volt = caltmp / 2Anptr0 = Curr_Volt / 100;/Hex->Dec变换t1 = Curr_Volt - (ptr0 * 1

10、00);ptr1 = t1 / 10;ptr2 = t1 - (ptr1 * 10);)串口程序:#include <>typedef unsigned char uchar;/*函数名称:InitUART功 能:初始化UAR嘲口数:无返回值:无*/void InitUART(void)(P3SEL |= 0x30;ME1 |= URXE0 + UTXE0;UCTL0 |= CHAR;UTCTL0 |= SSEL0;UBR00 = 0x03;UBR10 = 0x00;UMCTL0 = 0x4A;UCTL0 &= SWRST;/ ,5 = USART0 TXD/RXD/ En

11、able USART0 T/RXD/ 8-bit character/ UCLK = ACLK/ 32k/9600 -/ Modulation/ Initialize USART state machine/*函数名称:Send1Char功能:向PC机发送一个字符参数:sendchar-要发送的字符返回值:无*/void Send1Char(uchar sendchar)(while (!(IFG1 & UTXIFG0); /TXBUF0 = sendchar;等待发送存放器为空,*函数名称:PutSting功 能:向PC机发送字符串并换行指令参 数:ptr-指向发送字符串的指针返回值

12、:无*/ 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显示模块上程序#inclu

13、de <>#include ""typedef unsigned char uchar;typedef unsigned int uint;/*宏定义 */#define DataDir P2DIR #define DataPort P2OUT#define Busy0x80# define CtrlDir P6DIR# define CLR_RS P6OUT&=BIT3; /RS =# define SET_RS P6OUT|=BIT3;# define CLR_RW P6OUT&=BIT4;/RW =# define SET_RW P6OUT

14、|=BIT4;# define CLR_EN P6OUT&=BIT5;/EN =# 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<n;i+)(Disp1Char(x+,y,ptri);if (x = 0x0f)(x = 0;y A= 1;)/*函数名称:LocateXY功 能:向液晶输

15、入显示字符位置的坐标信息参 数:x-位置的列坐标y- 位置的行坐标返回值:无*;void LocateXY(uchar x,uchar y)(uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; /如果在第2行temp |= 0x80;LcdWriteCommand(temp,1);/*函数名称:Disp1Char功 能:在某个位置显示一个字符x-位置的列坐标y-位置的行坐标data-显示的字符数据返回值:无*/ void Disp1Char(uchar x,uchar y,uchar data)LocateXY( x,

16、y );LcdWriteData( data );/*函数名称:LcdReset功 能:对1602液晶模块进行复位操作参 数:无返回值:无*/ void LcdReset(void)CtrlDir |= 0x07;/限制线端口设为输出状态DataDir = 0xFF;/数据端口设为输出状态LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 0);Delay5ms();LcdWriteCommand(0x38, 1);LcdWriteCommand(0x08,

17、1);LcdWriteCommand(0x01, 1);LcdWriteCommand(0x06, 1);LcdWriteCommand(0x0c, 1);/ 规定的复位操作/显示模式设置/显不'关闭/显示清屏/写字符时整体不移动/显示开,不开游标,不闪烁/*函数名称:LcdWriteCommand功 能:向液晶模块写入命令参 数:cmd-命令,chk-是否判忙的标志,1:判忙,0:不判返回值:无*/void LcdWriteCommand(uchar cmd,uchar chk)if (chk) WaitForEnable(); /检测忙信号CLR_RS;CLR_RW;_NOP();

18、DataPort = cmd; /将命令字写入数据端口_NOP();SET_EN;/产生使能脉冲信号_NOP();_NOP();CLR_EN;)/*函数名称:LcdWriteData功能:向液晶显示的当前地址写入显示数据参数:data-显示字符数据返回值:无*/*void LcdWriteData( uchar data )WaitForEnable(); /等待液晶不忙SET_RS;CLR_RW;_NOP();将显示数据写入数据端口DataPort = data; / _NOP();SET_EN;/产生使能脉冲信号_NOP();_NOP();CLR_EN;/*函数名称:WaitForEnab

19、le功 能:等待1602液晶完成内部操作参 数:无返回值:无*/void WaitForEnable(void)P2DIR &= 0x00; 将P4 口切换为输入状态CLR_RS;SET_RW;_NOP();SET_EN;_NOP();检测忙标志_NOP();while(P2IN & Busy)!=0); /CLR_EN;P2DIR |= 0xFF; / 将P4 切换为输出状态函数名称:Delay5ms 功 能:延时约5ms 参 数:无 返回值:无*/ void Delay5ms(void)uint i=40000;while (i != 0)i-;/*函数名称:Delay40

20、0ms 功 能:延时约400ms 参 数:无 返回值:无*/ void Delay400ms(void)uchar i=50;uint j;while(i-)j=7269;程序#include <> #include "" typedef unsigned char uchar;typedef unsigned int uint;/*宏定义 */#define DataDirP2DIR#define DataPortP2OUT#define Busy0x80#define CtrlDir P6DIR# define CLR_RS P6OUT&=BIT3;

21、/RS =# define SET_RS P6OUT|=BIT3;# define CLR_RW P6OUT&=BIT4;RW =# define SET_RW P6OUT|=BIT4;# define CLR_EN P6OUT&=BIT5;EN =# define SET_EN P6OUT|=BIT5;/*函数名称:DispNchar功能:让液晶从某个位置起连续显示N个字符参 数:x-位置的列坐标y-位置的行坐标n-字符个数ptr-指向字符存放位置的指针返回值:无*/ void DispNChar(uchar x,uchar y, uchar n,uchar *ptr)uch

22、ar 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&0x0f;y &= 0x01;if(y) temp |= 0x40; /如果在第2行temp |= 0x80;LcdWriteCommand(temp,1);,*函数名称:Disp1Char功 能:在某个位置显示一个字符参

23、数: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;/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- 是否判忙的标志,1:判忙,0:不判返回值

温馨提示

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

评论

0/150

提交评论