本程序采用的是八路ADC單次采集的模式,根據配置,在單次的模式下轉換完成后ADC12SC會自動復位,因此需要在循環中進行ADC12CTL0 |= ADC12SC;操作,而如果配置成連續采集的模式,只需要在程序開始將ADC12SC置位一次就可以,但是就需要注意當進入中斷后如果不手動禁止中斷會一直停留在循環中,因此在采集到需要的數據后需要將ADC關閉或者中斷使能禁止才能重新回到主函數,這一點需要注意。
八路單次采集的程序如下:
[cpp] view plain copy/***************************************
八路AD多路單次采集基亞5110液晶顯示
采集模式:多路單次
****************************************/
#include 《msp430x14x.h》
#include “LCD5110.h”
#define uint unsigned int
#define uchar unsigned char
unsigned char ad0[]=“1:0.0V”;
unsigned char ad1[]=“2:0.0V”;
unsigned char ad2[]=“3:0.0V”;
unsigned char ad3[]=“4:0.0V”;
unsigned char ad4[]=“5:0.0V”;
unsigned char ad5[]=“6:0.0V”;
unsigned char ad6[]=“7:0.0V”;
unsigned char ad7[]=“8:0.0V”;
uchar flag=1;
uint temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;
void Init_Clk()
{
uchar i;
BCSCTL1&=~XT2OFF; //打開XT振蕩器
do
{
IFG1 &= ~OFIFG; //清除振蕩錯誤標志
for(i = 0; i 《 100; i++)
_NOP(); //延時等待
}
while ((IFG1 & OFIFG) != 0); //如果標志為1繼續循環等待
IFG1&=~OFIFG;
BCSCTL2|=SELM1+SELS;//MCLK 8M and SMCLK 1M
}
void Init_ADC()
{
ADC12CTL0 = ADC12ON+SHT0_8+MSC; // 打開ADC+設置采樣時間
ADC12CTL1 = SHP+CONSEQ_1; // 使用采樣時序電路信號+多路單次模式
//上面的寄存器配置采樣保持觸發源選擇時ADC12SC,采集信號使用采樣時序電路產生的信號
// 轉換模式為多路單次復轉換 上面的設置必須在ENC=0的情況下設置
//設置每個通道的輸入端口和參考電壓,參考電壓默認為AVCC 3.3V
ADC12MCTL0 = INCH_0;
ADC12MCTL1 = INCH_1;
ADC12MCTL2 = INCH_2;
ADC12MCTL3 = INCH_3;
ADC12MCTL4 = INCH_4;
ADC12MCTL5 = INCH_5;
ADC12MCTL6 = INCH_10;
ADC12MCTL7 = INCH_11+EOS; // 最后一個通道
ADC12IE = BIT7; // 最后一個通道轉換完成后使能ADC中斷
ADC12CTL0 |= ENC; // 使能轉換
}
/*******************************************
函數名稱:Trans_val
功 能:將16進制ADC轉換數據變換成三位10進制
真實的模擬電壓數據,并在液晶上顯示
參 數:Hex_Val--16進制數據
n--變換時的分母等于2的n次方
返回值 :無
********************************************/
void Trans_val(uchar ptr[6],uint Hex_Val)
{
unsigned long caltmp;
uint Curr_Volt;
caltmp = Hex_Val;
caltmp = (caltmp 《《 5) + Hex_Val; //caltmp = Hex_Val * 3
Curr_Volt = caltmp 》》 12; //Curr_Volt = caltmp / 2^n
// 參考電壓為3.3V,所以計算公式應該為Hex_val*3.3/2^n
// 乘除計算通過移位來進行可以有效的提高程序運行效率
ptr[2] = (Curr_Volt / 10)+0x30; //個位
ptr[4] = (Curr_Volt % 10)+0x30; //小數位
}
void main()
{
Init_Clk();
Init_ADC();
WDTCTL = WDTPW + WDTHOLD;
LCD_init();
LCD_showsh(0, 0, “電壓采集:”);
_EINT();//開啟全局中斷
P5DIR|=BIT5;
P3OUT|=~BIT5;
while (1)
{
ADC12CTL0 |= ADC12SC;
LCD_prints(0,2,ad0);
LCD_prints(8,2,ad1);
LCD_prints(0,3,ad2);
LCD_prints(8,3,ad3);
LCD_prints(0,4,ad4);
LCD_prints(8,4,ad5);
LCD_prints(0,5,ad6);
LCD_prints(8,5,ad7);
}
}
/*******************************************
函數名稱:ADC12ISR
功 能:ADC中斷服務函數
參 數:無
返回值 :無
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
temp0 = ADC12MEM0;
Trans_val(ad0,temp0);
temp1 = ADC12MEM1;
Trans_val(ad1,temp1);
temp2 = ADC12MEM2;
Trans_val(ad2,temp2);
temp3 = ADC12MEM3;
Trans_val(ad3,temp3);
temp4 = ADC12MEM4;
Trans_val(ad4,temp4);
temp5 = ADC12MEM5;
Trans_val(ad5,temp5);
temp6 = ADC12MEM6;
Trans_val(ad6,temp6);
temp7 = ADC12MEM7;
Trans_val(ad7,temp7);
}
-
msp430
+關注
關注
180文章
2403瀏覽量
229611 -
adc
+關注
關注
99文章
6533瀏覽量
545744
發布評論請先 登錄
相關推薦
評論