MSP430单片机AD转换实验.doc

上传人:知****量 文档编号:13007059 上传时间:2022-04-27 格式:DOC 页数:16 大小:91KB
返回 下载 相关 举报
MSP430单片机AD转换实验.doc_第1页
第1页 / 共16页
MSP430单片机AD转换实验.doc_第2页
第2页 / 共16页
点击查看更多>>
资源描述

《MSP430单片机AD转换实验.doc》由会员分享,可在线阅读,更多相关《MSP430单片机AD转换实验.doc(16页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、. .A/D转换实验一、转换原理MSP430F149的A/D转换器原理请参考相关书籍。实验板上与AD相关的硬件电路:编程工作实际就是对以下存放器的操作:存放器类型存放器缩写存放器的含义转换控制存放器ADC12CTL0转换控制存放器0ADC12CTL1转换控制存放器1中断控制存放器ADC12IFG中断标志存放器ADC12IE中断使能存放器ADC12IV中断向量存放器存储及其控制存放器ADC12MCTL0 ADC12MCTL15存储控制存放器015ADC12MEM0 ADC12MEM15存储存放器015设计主程序和中断效劳程序。二、转换程序1、程序1:转换结果发送到PC主程序中进展A/D初始化,中

2、断效劳程序读A/D转换结果,主程序中通过串口发送结果。“main.c主程序与中断程序:/*程序功能:将ADC对P6.0端口电压的转换结果按转换数据和对应的 模拟电压的形式通过串口发送到PC机屏幕上显示-通信格式:N.8.1, 9600-测试说明:翻开串口调试精灵,正确设置通信格式,观察接收数据*/#include #include allfunc.h#include UART0_Func.c#include ADC_Func.c#define Num_of_Results 32uint resultsNum_of_Results; /保存ADC转换结果的数组uint average;uchar

3、 tt = 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 = 0XFF;P6OUT = 0XFF; P6DIR |= BIT2;P6OUT |= BIT2; /关闭

4、电平转换 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); buffer3 = buffer2; buffer2 = buffer1; buffer1 = 0x2e - 0

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

6、_of_Results) uchar i; average = 0; for(i = 0; i = 5; /除以32 index = 0; tt+; if(tt = 250) /主要是降低串口发送速度 LPM1_EXIT; tt = 0; “ADC_Func.cA/D转换相关程序:#include typedef unsigned int uint;/*函数名称:Init_ADC功 能:初始化ADC参 数:无返回值 :无*/void Init_ADC(void) P6SEL |= 0x01; / 使能ADC通道 ADC12CTL0 = ADC12ON+SHT0_15+MSC; / 翻开ADC,

7、设置采样时间 ADC12CTL1 = SHP+CONSEQ_2; / 使用采样定时器 ADC12IE = 0x01; / 使能ADC中断 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); /*函数名称: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 = (caltm

9、p 5) + Hex_Val; /caltmp = Hex_Val * 33 caltmp = (caltmp 3) + (caltmp 12; /Curr_Volt = caltmp / 2n ptr0 = Curr_Volt / 100; /Hex-Dec变换 t1 = Curr_Volt - (ptr0 * 100); ptr1 = t1 / 10; ptr2 = t1 - (ptr1 * 10);“UART0_Func.c串口程序:#include typedef unsigned char uchar;/*函数名称:InitUART功能:初始化UART端口参数:无返回值 :无*/vo

10、id InitUART(void) P3SEL |= 0x30; / P3.4,5 = USART0 TXD/RXDME1 |= URXE0 + UTXE0; / Enable USART0 T/RXD UCTL0 |= CHAR; / 8-bit character UTCTL0 |= SSEL0; / UCLK = ACLK UBR00 = 0x03; / 32k/9600 - 3.41 UBR10 = 0x00; /UMCTL0 = 0x4A; / Modulation UCTL0 &= SWRST; / Initialize USART state machine/*函数名称:Send

11、1Char功 能:向PC机发送一个字符参 数:sendchar-要发送的字符返回值 :无*/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; /

12、发送换行指令/*函数名称:PutSting0功 能:向PC机发送字符串,无换行参 数:ptr-指向发送字符串的指针返回值 :无*/void PutString0(uchar *ptr) while(*ptr != 0) Send1Char(*ptr+); / 发送数据 2、程序2:转换结果显示在1602显示模块上“main.c程序#include #include cry1602.htypedef unsigned char uchar;typedef unsigned int uint;/*宏定义*/#define DataDir P2DIR#define DataPort P2OUT#de

13、fine 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-指向

14、字符存放位置的指针返回值 :无*/void DispNChar(uchar x,uchar y, uchar n,uchar *ptr) uchar i;for (i=0;in;i+)Disp1Char(x+,y,ptri);if (x = 0x0f) x = 0; y = 1;/*函数名称:LocateXY功 能:向液晶输入显示字符位置的坐标信息参 数:x-位置的列坐标 y-位置的行坐标返回值 :无*/void LocateXY(uchar x,uchar y) uchar temp;temp = x&0x0f;y &= 0x01;if(y) temp |= 0x40; /如果在第2行tem

15、p |= 0x80;LcdWritemand(temp,1);/*函数名称:Disp1Char功 能:在某个位置显示一个字符参 数: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; /数据端

16、口设为输出状态 LcdWritemand(0x38, 0); /规定的复位操作Delay5ms();LcdWritemand(0x38, 0);Delay5ms();LcdWritemand(0x38, 0);Delay5ms();LcdWritemand(0x38, 1);/显示模式设置 LcdWritemand(0x08, 1);/显示关闭 LcdWritemand(0x01, 1); /显示清屏LcdWritemand(0x06, 1);/写字符时整体不移动LcdWritemand(0x0c, 1);/显示开,不开游标,不闪烁/*函数名称:LcdWritemand功 能:向液晶模块写入命

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

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

19、测忙标志CLR_EN;P2DIR |= 0xFF; /将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程序#include #include cry1602.htypedef unsigned char uc

20、har;typedef unsigned int uint;/*宏定义*/#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 P

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

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

23、作参数:无返回值 :无*/void LcdReset(void) CtrlDir |= 0x07; /控制线端口设为输出状态 DataDir = 0xFF; /数据端口设为输出状态 LcdWritemand(0x38, 0); /规定的复位操作Delay5ms();LcdWritemand(0x38, 0);Delay5ms();LcdWritemand(0x38, 0);Delay5ms();LcdWritemand(0x38, 1);/显示模式设置 LcdWritemand(0x08, 1);/显示关闭 LcdWritemand(0x01, 1); /显示清屏LcdWritemand(0x

24、06, 1);/写字符时整体不移动LcdWritemand(0x0c, 1);/显示开,不开游标,不闪烁/*函数名称:LcdWritemand功 能:向液晶模块写入命令参 数:cmd-命令, chk-是否判忙的标志,1:判忙,0:不判返回值 :无*/void LcdWritemand(uchar cmd,uchar chk) if (chk) WaitForEnable(); / 检测忙信号?CLR_RS;CLR_RW; _NOP();DataPort = cmd; /将命令字写入数据端口 _NOP();SET_EN; /产生使能脉冲信号_NOP();_NOP();CLR_EN;/*函数名称:

25、LcdWriteData功 能:向液晶显示的当前地址写入显示数据参 数:data-显示字符数据返回值 :无*/void LcdWriteData( uchar data ) WaitForEnable(); /等待液晶不忙SET_RS;CLR_RW; _NOP(); DataPort = data; /将显示数据写入数据端口 _NOP();SET_EN; /产生使能脉冲信号_NOP(); _NOP(); CLR_EN;/*函数名称:WaitForEnable功 能:等待1602液晶完成内部操作参 数:无返回值 :无*/void WaitForEnable(void) P2DIR &= 0x00

26、; /将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-; /*函数名称:Delay400ms功 能:延时约400ms参 数:无返回值 :无*/void Delay400ms(void) uchar i=50;uint j;while(i-)j=7269;while(j-);. .word.

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 研究报告 > 设计方案

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁