当前位置:文档之家› MSP430单片机AD转换实验

MSP430单片机AD转换实验

AD转换实验一、转换原理MSP430F149勺A/D转换器原理请参考相关书籍。

实验板上与AD相关的硬件电路:RV310K------------ 3-3\J6P61SI?2Al)输入电路RV4III-10K f > 2 ;|||二、转换程序1、程序1:转换结果发送到PC主程序中进行A/D初始化,中断服务程序读A/D转换结果,主程序中通过串口发送结果。

“ main 、c ”主程序与中断程序:/*********************************************************程序功能:将ADC 对P6、0端口电压的转换结果按转换数据与对应的 模拟电压的形式通过串口发送到PC 机屏幕上显示通信格式 :N 、 8、 1, 9600测试说明 :打开串口调试精灵 ,正确设置通信格式 ,观察接收数据 **********************************************************/ #include <msp430 、 h> #include "allfunc 、 h" #include "UART0_Func 、 c" #include "ADC_Func 、 c" #define Num_of_Results 32 uint results[Num_of_Results]; // 保存 ADC 转换结果的数组uint average; uchar tcnt = 0; /*********************** void main( void ){uchar i; uchar buffer[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("The digital value is: ");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("The analog value is: "); PutString(buffer);}}/******************************************* 函数名称:ADC12ISR功能:ADC中断服务函数,在这里用多次平均的计算P6、0 口的模拟电压数值参数: 无返回值: 无********************************************/ #pragmavector=ADC_VECTOR __interrupt void ADC12ISR (void) { static uchar index = 0;results[index++] = ADC12MEM0; // Move results if(index == Num_of_Results) {uchar i;average = 0;for(i = 0; i < Num_of_Results; i++){ average += results[i];average >>= 5; // 除以 32index = 0; tcnt++;if(tcnt == 250) // 主要就是降低串口发送速度 { LPM1_EXIT; tcnt = 0; } }}“ADC_Func 、 c ” A/D 转换相关程序 : #include <msp430 、 h> typedef unsigned int uint; /******************************************** 函数名称 :Init_ADC 功 能: 初始化 ADC 参 数: 无 返回值 : 无********************************************/ void Init_ADC(void) {P6SEL |= 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) { ptr[0] = Hex_val / 1000;ptr[1] = (Hex_val - ptr[0]*1000)/100; ptr[2] = (Hex_val - ptr[0]*1000 - ptr[1]*100)/10;使能ADC 通道打开ADC 设置采样时间 使用采样定时器 使能ADC 中断 使能专换 开始专换、 41ptr[3] = (Hex_val - ptr[0]*1000 - ptr[1]*100 - ptr[2]*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 = (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->Dect1 = Curr_Volt - (ptr[0] * 100); ptr[1] = t1 / 10;ptr[2] = t1 - (ptr[1] * 10);}“UARTO_Func c ”串口程序: #include <msp430 、h> typedef unsigned char uchar;/******************************************* 函数名称 :InitUART 功 能:初始化UART 端 口参 数: 无 返回值 : 无********************************************// P3 、 4,5 =// Enable USART0 T/RXD// 8-bit character// UCLK = ACLK// 32k/9600 - 3 // // Modulationvoid InitUART(void){P3SEL |= 0x30; ME1 |= URXE0 + UTXE0;UCTL0 |= CHAR; UTCTL0 |= SSEL0; UBR00 = 0x03; UBR10 = 0x00; UMCTL0 = 0x4A;变换USART0 TXD/RXD// Initialize USART state machine}/*******************************************函数名称:Send1Char功能:向PC机发送一个字符参数:se ndchar--要发送的字符返回值:无********************************************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'; //} /******************************************* 函数名称:PutSting0功能:向PC机发送字符串,无换行参数:ptr--指向发送字符串的指针返回值: 无********************************************/ void PutString0(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); // }}发送数据发送换行指令发送数据2、程序2: 转换结果显示在1602 显示模块上UCTL0 &= ~SWRST;“ main、c” 程序#include <msp430x14x 、h> #include "cry1602 、h" typedef unsigned char uchar; 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 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,ptr[i]);if (x == 0x0f){x = 0;y A= 1;}}}/*******************************************函数名称:LocateXY功能: 向液晶输入显示字符位置的坐标信息参数:x-- 位置的列坐标y-- 位置的行坐标返回值: 无******************************************void LocateXY(uchar x,uchar y) {uchar temp;temp = x&0x0f; y &=0x01;如果在第 2 行if(y) temp |= 0x40; //temp |= 0x80;LcdWriteCommand(temp,1);}/******************************************* 函数名称:Disp1Char功能: 在某个位置显示一个字符参数:x-- 位置的列坐标y-- 位置的行坐标data-- 显示的字符数据返回值: 无********************************************/ voidDisp1Char(uchar x,uchar y,uchar data) {LocateXY( x, y );LcdWriteData( data );} /******************************************* 函数名称:LcdReset功能: 对1602 液晶模块进行复位操作参数: 无返回值: 无********************************************/ voidLcdReset(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-- 就是否判忙的标志返回值 : 无********************************************/void LcdWriteCommand(uchar cmd,uchar chk) {/******************************************* 函数名称 :LcdWriteData 功 能: 向液晶显示的当前地址写入显示数据 参数 :data-- 显示字符数据返回值 : 无 ********************************************/ void LcdWriteData( uchar data ) {WaitForEnable(); // 等待液晶不忙 SET_RS; CLR_RW; _NOP(); DataPort = data;// 将显示数据写入数据端口CLR_RS;CLR_RW; _NOP();DataPort = cmd; _NOP();//将命令字写入数据端口SET_EN; _NOP(); _NOP(); CLR_EN;}//产生使能脉冲信号检测忙信号 ?// 显示模式设置 // 显示关闭 // 显示清屏// 写字符时整体不移动 // 显示开 , 不开游标 , 不闪烁,1: 判忙 ,0: 不判if (chk) WaitForEnable(); //_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); // 检测忙标志CLR_EN;P2DIR |= 0xFF; // 将P4 口切换为输出状态}/*******************************************函数名称:Delay5ms功能: 延时约5ms参数: 无返回值: 无******************************************** void Delay5ms(void){uint i=40000;while (i != 0)y-- 位置的行坐标i--;}}/******************************************* 函数名称 :Delay400ms 功 能: 延时约 400ms参 数: 无 返回值 : 无 ******************************************** void Delay400ms(void){uchar i=50;uint j;while(i--){j=7269;while(j--);}}“ cry1602、c ” 程序#include <msp430x14x 、 h> #include "cry1602 、 h" typedef unsigned char uchar; typedef unsigned int uint; 宏定义 ***************/P2DIRP2OUT0x80P6DIRn--字符个数 ptr--指向字符存放位置的指针 返回值 : 无********************************************/ void DispNChar(uchar x,uchar y, ucharn,uchar *ptr) { uchar i; for (i=0;i<n;i++) /************** #define DataDir #define DataPort #define Busy#define CtrlDir//RS = P6#define CLR_RS P6OUT&=~BIT3; #define SET_RS P6OUT|=BIT3;#define CLR_RW P6OUT&=~BIT4;#define SET_RW P6OUT|=BIT4;#define CLR_EN P6OUT&=~BIT5;#define SET_EN P6OUT|=BIT5;/******************************************* 函数名称 :DispNchar功 能:让液晶从某个位置起连续显示 N 个字符 参 数:X--位置的列坐标//RW = P6 、//EN = P6 、{Disp1Char(x++,y,ptr[i]);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功能: 在某个位置显示一个字符参数: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; //********************************************/void LcdWriteCommand(uchar cmd,uchar chk) { if (chk) WaitForEnable(); // 检测忙信号?CLR_RS;CLR_RW; _NOP(); 控制线端口设为输出状态数据端口设为输出状态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: 不判SET_EN; //_NOP();_NOP();CLR_EN;}/******************************************* 函数名称 :LcdWriteData功能: 向液晶显示的当前地址写入显示数据 参 数 :data-- 显示字符数据返回值 : 无********************************************/ void LcdWriteData( uchar data ){WaitForEnable(); // 等待液晶不忙SET_RS;CLR_RW; _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); // 检测忙标志 DataPort = cmd;_NOP();// 将命令字写入数据端口 产生使能脉冲信号 DataPort = data;// _NOP();将显示数据写入数据端口产生使能脉冲信号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--);。

相关主题