1-簡介
簡介MSP430單片機ADC12模塊 序列單次采集的 應用范例。
2-例程
//******************************************************************************
//MSP430F149 ADC12模塊+串行通訊的實驗程序
//使用ADC12采集實驗,將采集到數據送向PC.(序列單次采集)
//P3.4為發送,P3.5為接收 晶體使32768HZ/8MHZ. 串行波特率B/S
//使用SMCLK作為波特率發器時,不能使用LPM2,LPM3!
//以下程序已驗證通過,初學者可直接使用.由時間倉促和水平有限,請讀者批評指正.
//編寫:www.Microcontrol.cn/DC
//******************************************************************************
#include #define ADCOK 0x01//B0為ADC12完成轉換標志. //******************************************** //表區 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; //變量區 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);//數據變換 void send_data(unsigned char *p); //串行口發送數組 void send_adc12_data(unsigned int *p,unsigned int adcn);//發送ADC12數據 //******************************************** void main(void) { init(); //主循環 for (;;) { LPM0; ADC12CTL0 |= ADC12SC; //sampling open,AD轉換完成后(ADC12BUSY=0),ADC12SC自動復位; while((ADC12IFG & BIT0) == 0); //等轉換結束 gbit &= ~ADCOK; //清轉換完成標志 send_adc12_data(ADC,2);//發送數據 } } //******************************************************************************** void init(void) { P1DIR=0x01;P1OUT=0x0f; //LED設置 BaudrateSetup(6); ADC12setup(); gbit=0x00; _EINT(); // 全局中斷使能 } //********************************************************************************** //串口接收中斷,退出LPM0模式. #pragma vector=USART0RX_VECTOR __interrupt void usart0_rx (void) { LPM0_EXIT; } //********************************************************************************** //ADC12初始化 void ADC12setup(void) { //ADC12設置************************** P6SEL |= 0x03; //使用A/D通道 A0,A1 ADC12CTL0 = ADC12ON+MSC+SHT0_2 ;//開ADC12內核,設SHT0=2 (N=4) ADC12CTL1 = SHP+CONSEQ_1 ; //SAMPCON信號選為采樣定時器輸出,序列單次 //ADC12內部參考電壓設置 ADC12CTL0 |= REF2_5V; //選用內部參考電壓為2.5V ADC12CTL0 |= REFON; //內部參考電壓打開 ADC12MCTL0 |= SREF_1+INCH_0; //R+=2.5V R-=VSS,A0輸入 ADC12CTL1 |= REF2_5V; //選用內部參考電壓為2.5V ADC12CTL1 |= REFON; //內部參考電壓打開 ADC12MCTL1 |= SREF_1+INCH_1+EOS;//R+=2.5V R-=VSS,A1輸入,結束位 //轉換允許 ADC12IE =0x02; //使能中斷ADC12IFG A1 ADC12CTL0 |= ENC ; //轉換允許(上升沿) } //********************************************************************************** //UART0初始化 void BaudrateSetup(unsigned char U0) { unsigned int i; if(U0>5) //當U0>5時,啟用XT2 { BCSCTL1 &= ~XT2OFF; //啟動XT2, do {IFG1 &= ~OFIFG; //清OSCFault標志 for(i=0xFF;i>0;i--); //延時等待 } while((IFG1 & OFIFG) != 0);//查OSCFault,為0時轉換完成 BCSCTL2 |= SELS; //SMCLK為XT2 } //UART0 P1OUT=0x00; if(U0>5){UTCTL0=SSEL1;} // 時鐘源:SMCLK else{UTCTL0=SSEL0;} // 時鐘源:ACLK UCTL0 &= ~SWRST; // SWRST復位, USART允許 UCTL0=CHAR; // 8bit ME1|=UTXE0 + URXE0; // Enable Tx0,Rx0 IE1|=URXIE0; // RX使能 UBR00=BaudrateUBR0[U0]; // 低位分頻器因子 UBR10=BaudrateUBR1[U0]; // 高位分頻器因子 UMCTL0=BaudrateUMCTL[U0]; // 波特率調整因子 P3SEL |= 0x30; // 將P3.4,5使用外圍模塊 = USART0 TXD/RXD P3DIR |= 0x10; // 將P3.4設為輸出(發),P3.5默認為輸入(收) } //********************************************************************************** //數據變換 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]; } //********************************************************************************** //串行口發送數組 void send_data(unsigned char *p) {unsigned int n; timp=RXBUF0; for(n=0;p[n]!=0xff;n++) { while ((IFG1 & UTXIFG0) == 0);// USART0發送UTXIFG0=1,表示UTXBUF準備好發送一下字符 TXBUF0 = p[n]; } } //********************************************************************************** //發送ADC12數據 //*p為數據區,adcn為數量 void send_adc12_data(unsigned int *p,unsigned int adcn) { unsigned int j; for(j=0;j data_converter(display_buffer,p[j]);//數據變換 send_data(display_buffer); //發送數據 } } //**********************************************************************************
上一篇:基于MSK4226的直流有刷電機四象限控制
下一篇:類R—F轉換頻率測量溫度方法詳解
推薦閱讀
史海拾趣