以下程序是基于新唐M051單片機(jī)運(yùn)行:
/******************************************************************
*注 意:硬件上的AVDD一定要接上基準(zhǔn)電壓
******************************************************************/
#include "SmartM_M0.h"
#define DEBUGMSG printf
#define ADC_CLOCK_DIVIDER 0x00040000
#define ADC_CLK_Source 0x00000000
#define ADC_CLOCK_DIVIDER 0x00040000
#define ADC_CLK_Source 0x00000000
#define AREF_VOLTAGE 4480
STATIC VOID AdcInit(VOID)
{
if(ADC_CLK_Source==0x00000004)
{
PLLCON |= PLL_SEL;
PLL_Enable();
STATIC VOID AdcInit(VOID)
{
if(ADC_CLK_Source==0x00000004)
{
PLLCON |= PLL_SEL;
PLL_Enable();
/* 等待PLL穩(wěn)定 */
while((CLKSTATUS & PLL_STB) == 0);
}
while((CLKSTATUS & PLL_STB) == 0);
}
/* 復(fù)位ADC */
set_ADC_RST;
clr_ADC_RST;
set_ADC_RST;
clr_ADC_RST;
/* ADC時(shí)鐘使能 */
set_ADEN_CLK;
if (ADC_CLK_Source==0x00000000 )
{
ADCClkSource_ex12MHZ;
}
else if(ADC_CLK_Source==0x00000004 )
{
ADCClkSource_PLL;
}
else if(ADC_CLK_Source==0x00000008 )
{
ADCClkSource_int22MHZ;
}
set_ADEN_CLK;
if (ADC_CLK_Source==0x00000000 )
{
ADCClkSource_ex12MHZ;
}
else if(ADC_CLK_Source==0x00000004 )
{
ADCClkSource_PLL;
}
else if(ADC_CLK_Source==0x00000008 )
{
ADCClkSource_int22MHZ;
}
/* 設(shè)置ADC分頻器 */
CLKDIV=ADC_CLOCK_DIVIDER;
/* ADC使能 */
set_ADEN;
set_CALEN;
CLKDIV=ADC_CLOCK_DIVIDER;
/* ADC使能 */
set_ADEN;
set_CALEN;
while(!(ADCALR&CALDONE));
/* 單次轉(zhuǎn)換模式 */
setAD_SIG;
clr_DIFFEN;
setAD_SIG;
clr_DIFFEN;
/* 設(shè)置ADC通道 */
set_CHEN0;
/* 使能P1.0為模擬輸入引腳 */
set_ADC0_channel;
/* 禁止P1.0數(shù)字輸入通道 */
P1_OFFD |= OFFD0;
/* 設(shè)置P1.0引腳為輸入模式Configure P1.0 as input mode */
P10_InputOnly;
/* 清除ADC中斷標(biāo)志位 */
set_ADF;
}
set_CHEN0;
/* 使能P1.0為模擬輸入引腳 */
set_ADC0_channel;
/* 禁止P1.0數(shù)字輸入通道 */
P1_OFFD |= OFFD0;
/* 設(shè)置P1.0引腳為輸入模式Configure P1.0 as input mode */
P10_InputOnly;
/* 清除ADC中斷標(biāo)志位 */
set_ADF;
}
/****************************************
*函數(shù)名稱:main
*輸 入:無(wú)
*輸 出:無(wú)
*功 能:函數(shù)主體
******************************************/
INT32 main(VOID)
{
UINT32 unVoltageValue;
*函數(shù)名稱:main
*輸 入:無(wú)
*輸 出:無(wú)
*功 能:函數(shù)主體
******************************************/
INT32 main(VOID)
{
UINT32 unVoltageValue;
PROTECT_REG //ISP下載時(shí)保護(hù)FLASH存儲(chǔ)器
(
PWRCON |= XTL12M_EN; //默認(rèn)時(shí)鐘源為外部晶振
while((CLKSTATUS & XTL12M_STB) == 0); //等待12MHz時(shí)鐘穩(wěn)定
CLKSEL0 = (CLKSEL0 & (~HCLK)) | HCLK_12M;//設(shè)置外部晶振為系統(tǒng)時(shí)鐘
)
UartInit(12000000,9600); //波特率設(shè)置為9600bps
AdcInit();
while(1)
{
set_ADST; //啟動(dòng)ADC
while(ADSR&ADF==0); //等待ADC結(jié)束
set_ADF; //清空ADC結(jié)束標(biāo)志位
{
set_ADST; //啟動(dòng)ADC
while(ADSR&ADF==0); //等待ADC結(jié)束
set_ADF; //清空ADC結(jié)束標(biāo)志位
unVoltageValue = AREF_VOLTAGE*(ADDR0&0xFFF)/4096;//將ADC值轉(zhuǎn)換為電壓值
DEBUGMSG("Voltage %d mv \r\n",unVoltageValue);
Delayms(500);
}
}
}
}