1-簡(jiǎn)介 簡(jiǎn)介MSP430單片機(jī)ADC12模塊 序列單次采集的 應(yīng)用范例。
2-例程 //****************************************************************************** //MSP430F149 ADC12模塊+串行通訊的實(shí)驗(yàn)程序 //使用ADC12采集實(shí)驗(yàn),將采集到數(shù)據(jù)送向PC.(序列單次采集) //P3.4為發(fā)送,P3.5為接收 晶體使32768HZ/8MHZ. 串行波特率B/S //使用SMCLK作為波特率發(fā)器時(shí),不能使用LPM2,LPM3! //以下程序已驗(yàn)證通過(guò),初學(xué)者可直接使用.由時(shí)間倉(cāng)促和水平有限,請(qǐng)讀者批評(píng)指正. //編寫:www.Microcontrol.cn/DC //******************************************************************************
#include <msp430x14x.h>
#define ADCOK 0x01 //B0為ADC12完成轉(zhuǎn)換標(biāo)志.
//******************************************** //表區(qū) unsigned char number_table[]={0,1,2,3,4,5,6,7,8,9}; unsigned char display_buffer[]={0x00,0x00,0x00,0x00,0xff};
//*******************波特率***********300 600 1200 2400 4800 9600 19200 38400 76800 115200const //************************************[0]**[1]**[2]*[3]**[4]**[5]***[6]***[7]****[8]***[9]* unsigned char BaudrateUBR0[] ={0x6D,0x36,0x1B,0x0D,0x06,0x03, 0xA0, 0xD0, 0x68, 0x45}; unsigned const char BaudrateUBR1[] ={0x00,0x00,0x00,0x00,0x00,0x00, 0x01, 0x00, 0x00, 0x00}; unsigned const char BaudrateUMCTL[]={0x22,0xD5,0x03,0x6B,0x6F,0x4A, 0xC0, 0x40, 0x40, 0x4A};
unsigned char timp; //變量區(qū) unsigned int ADC0 ; //子程序聲明 void init (void); //初始化 void ADC12setup(void); //ADC12初始化 void BaudrateSetup(unsigned char U0); //UART0初始化 void data_converter(unsigned char *p,unsigned int vaule); //數(shù)據(jù)變換 void send_data(unsigned char *p); //串行口發(fā)送數(shù)組 void send_adc12_data(unsigned int *p,unsigned int adcn); //發(fā)送ADC12數(shù)據(jù) //********************************************
void main(void) { init(); //主循環(huán) for (;;) { LPM0; ADC12CTL0 |= ADC12SC; //sampling open,AD轉(zhuǎn)換完成后(ADC12BUSY=0),ADC12SC自動(dòng)復(fù)位; while((ADC12IFG & BIT0) == 0); //等轉(zhuǎn)換結(jié)束 gbit &= ~ADCOK; //清轉(zhuǎn)換完成標(biāo)志 send_adc12_data(ADC,2); //發(fā)送數(shù)據(jù) } }
//******************************************************************************** void init(void) { P1DIR=0x01;P1OUT=0x0f; //LED設(shè)置 BaudrateSetup(6); ADC12setup(); gbit=0x00; _EINT(); // 全局中斷使能 }
//********************************************************************************** //串口接收中斷,退出LPM0模式. #pragma vector=USART0RX_VECTOR __interrupt void usart0_rx (void) { LPM0_EXIT; }
//********************************************************************************** //ADC12初始化 void ADC12setup(void) { //ADC12設(shè)置************************** P6SEL |= 0x03; //使用A/D通道 A0,A1 ADC12CTL0 = ADC12ON+MSC+SHT0_2 ; //開(kāi)ADC12內(nèi)核,設(shè)SHT0=2 (N=4) ADC12CTL1 = SHP+CONSEQ_1 ; //SAMPCON信號(hào)選為采樣定時(shí)器輸出,序列單次
//ADC12內(nèi)部參考電壓設(shè)置 ADC12CTL0 |= REF2_5V; //選用內(nèi)部參考電壓為2.5V ADC12CTL0 |= REFON; //內(nèi)部參考電壓打開(kāi) ADC12MCTL0 |= SREF_1+INCH_0; //R+=2.5V R-=VSS,A0輸入
ADC12CTL1 |= REF2_5V; //選用內(nèi)部參考電壓為2.5V ADC12CTL1 |= REFON; //內(nèi)部參考電壓打開(kāi) ADC12MCTL1 |= SREF_1+INCH_1+EOS; //R+=2.5V R-=VSS,A1輸入,結(jié)束位
//轉(zhuǎn)換允許 ADC12IE =0x02; //使能中斷ADC12IFG A1 ADC12CTL0 |= ENC ; //轉(zhuǎn)換允許(上升沿) }
//********************************************************************************** //UART0初始化 void BaudrateSetup(unsigned char U0) { unsigned int i; if(U0>5) //當(dāng)U0>5時(shí),啟用XT2 { BCSCTL1 &= ~XT2OFF; //啟動(dòng)XT2, do { IFG1 &= ~OFIFG; //清OSCFault標(biāo)志 for(i=0xFF;i>0;i--); //延時(shí)等待 } while((IFG1 & OFIFG) != 0); //查OSCFault,為0時(shí)轉(zhuǎn)換完成 BCSCTL2 |= SELS; //SMCLK為XT2 } //UART0 P1OUT=0x00; if(U0>5){UTCTL0=SSEL1;} // 時(shí)鐘源:SMCLK else{UTCTL0=SSEL0;} // 時(shí)鐘源:ACLK UCTL0 &= ~SWRST; // SWRST復(fù)位, USART允許 UCTL0=CHAR; // 8bit ME1|=UTXE0 + URXE0; // Enable Tx0,Rx0 IE1|=URXIE0; // RX使能 UBR00=BaudrateUBR0[U0]; // 低位分頻器因子 UBR10=BaudrateUBR1[U0]; // 高位分頻器因子 UMCTL0=BaudrateUMCTL[U0]; // 波特率調(diào)整因子 P3SEL |= 0x30; // 將P3.4,5使用外圍模塊 = USART0 TXD/RXD P3DIR |= 0x10; // 將P3.4設(shè)為輸出(發(fā)),P3.5默認(rèn)為輸入(收) }
//********************************************************************************** //數(shù)據(jù)變換 void data_converter(unsigned char *p,unsigned int value) { unsigned int m,n,j=0; p[0]=number_table[value/1000]; m=value%1000; p[1]=number_table[m/100]; n=m%100; p[2]=number_table[n/10]; j=n%10; p[3]=number_table[j/1]; }
//********************************************************************************** //串行口發(fā)送數(shù)組 void send_data(unsigned char *p) {unsigned int n; timp=RXBUF0; for(n=0;p[n]!=0xff;n++) { while ((IFG1 & UTXIFG0) == 0); // USART0發(fā)送UTXIFG0=1,表示UTXBUF準(zhǔn)備好發(fā)送一下字符 TXBUF0 = p[n]; } }
//********************************************************************************** //發(fā)送ADC12數(shù)據(jù) //*p為數(shù)據(jù)區(qū),adcn為數(shù)量 void send_adc12_data(unsigned int *p,unsigned int adcn) { unsigned int j; for(j=0;j<adcn;j++) { data_converter(display_buffer,p[j]); //數(shù)據(jù)變換 send_data(display_buffer); //發(fā)送數(shù)據(jù) } } //********************************************************************************** //ADC12模塊例程(2)結(jié)速
|
|