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

MSP430单片机AD转换实验

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

实验板上与AD相关的硬件电路:编程工作实际就是对以下寄存器的操作:寄存器类型寄存器缩写寄存器的含义转换控制寄存器ADC12CTL0转换控制寄存器0 ADC12CTL1转换控制寄存器1中断控制寄存器ADC12IFG中断标志寄存器ADC12IE中断使能寄存器ADC12IV中断向量寄存器存储及其控制寄存器ADC12MCTL0 ~ ADC12MCTL15存储控制寄存器0~15 ADC12MEM0 ~ADC12MEM15存储寄存器0~15设计主程序和中断服务程序。

二、转换程序1、程序1:转换结果发送到PC主程序中进行A/D初始化,中断服务程序读A/D转换结果,主程序中通过串口发送结果。

“”主程序与中断程序:/*********************************************************程序功能:将ADC对端口电压的转换结果按转换数据和对应的模拟电压的形式通过串口发送到PC机屏幕上显示-----------------------------------------------------------通信格式: 9600-----------------------------------------------------------测试说明:打开串口调试精灵,正确设置通信格式,观察接收数据**********************************************************/#include <>#include ""#include ""#include ""#define Num_of_Results 32uint 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中断服务函数,在这里用多次平均的计算口的模拟电压数值参数:无返回值:无********************************************/#pragma vector=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;}}}“” A/D转换相关程序:#include <>typedef unsigned int uint;/********************************************函数名称:Init_ADC功能:初始化ADC参数:无返回值:无********************************************/void Init_ADC(void){P6SEL |= 0x01; // 使能ADC通道ADC12CTL0 = ADC12ON+SHT0_15+MSC; // 打开ADC,设置采样时间 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){ptr[0] = Hex_val / 1000;ptr[1] = (Hex_val - ptr[0]*1000)/100;ptr[2] = (Hex_val - ptr[0]*1000 - ptr[1]*100)/10;ptr[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 * 33caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10Curr_Volt = caltmp >> 12; //Curr_Volt = caltmp / 2^n ptr[0] = Curr_Volt / 100; //Hex->Dec变换t1 = Curr_Volt - (ptr[0] * 100);ptr[1] = t1 / 10;ptr[2] = t1 - (ptr[1] * 10);}“”串口程序:#include <>typedef unsigned char uchar;/*******************************************函数名称:InitUART功能:初始化UART端口参数:无返回值:无********************************************/void InitUART(void){P3SEL |= 0x30; // ,5 = USART0 TXD/RXDME1 |= URXE0 + UTXE0; // Enable USART0 T/RXDUCTL0 |= CHAR; // 8-bit characterUTCTL0 |= SSEL0; // UCLK = ACLKUBR00 = 0x03; // 32k/9600 -UBR10 = 0x00; //UMCTL0 = 0x4A; // ModulationUCTL0 &= ~SWRST; // Initialize USART state machine }/*******************************************函数名称:Send1Char功能:向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'; //发送换行指令}/*******************************************函数名称:PutSting0功能:向PC机发送字符串,无换行参数:ptr--指向发送字符串的指针返回值:无********************************************/void PutString0(uchar *ptr){while(*ptr != '\0'){Send1Char(*ptr++); // 发送数据 }}2、程序2:转换结果显示在1602显示模块上“”程序#include <>#include ""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 =#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) {uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);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行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; //数据端口设为输出状态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:不判返回值:无********************************************/void LcdWriteCommand(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 data ){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); //检测忙标志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--);}}“”程序#include <>#include ""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 =#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) {uchar i;for (i=0;i<n;i++){Disp1Char(x++,y,ptr[i]);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行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; //数据端口设为输出状态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:不判返回值:无********************************************/void LcdWriteCommand(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 data ){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); //检测忙标志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--);}}。

相关主题