《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.