STC12C5A60S2 AD 轉(zhuǎn)換
STC系列單片機中的STC89LE516AD/X2提供了8路8位精度的高速A/D轉(zhuǎn)換器,位于P1口上,從而省去了片外ADC的麻煩。這8路ADC為電壓輸入型,可做按鍵掃描,電池電壓檢測,頻譜檢測等。ADC轉(zhuǎn)換過程需要17個機器周期。通過對相關(guān)功能寄存器的適當配置,就可以控制其工作。下面就對相關(guān)功能寄存器進行介紹。
A/D轉(zhuǎn)換寄存器總表:
(1) P1_ADC_EN:特殊功能寄存器
P1.x作為A/D轉(zhuǎn)換輸入通道來用允許特殊功能寄存器。相應位為“1”時,對應的P1.x口作為A/D轉(zhuǎn)換使用,內(nèi)部上拉電阻自動斷開。
ADC_START是模擬/數(shù)字轉(zhuǎn)換(ADC)啟動控制位,設(shè)置為1時,開始轉(zhuǎn)換。
ADC_FLAG是模擬/數(shù)字轉(zhuǎn)換結(jié)束標志位,當A/D轉(zhuǎn)換完成后,ADC_FLAG=1。
(3) ADC_DATA: A/D轉(zhuǎn)換結(jié)果特殊功能寄存器
模擬/數(shù)字轉(zhuǎn)換結(jié)果計算公式為 結(jié)果=256×Vin/Vcc
Vin是模擬輸入通道輸入電壓,Vcc為單片機實際工作電壓,用單片機工作電壓作為模擬參考電壓。
內(nèi)置ADC的使用例程:
STC_ADC.h:
sfr P1_ADC_EN=0x97;
sfr ADC_CONTR=0xc5;
sfr ADC_DATA=0xc6;
int GetAD(unsigned char channel)//channel為要取的通道號(0~7)
{
unsigned char AD_finished=0;
ADC_DATA=0;
ADC_CONTR=channel;
ADC_CONTR|=0x08;
while(!AD_finished)
AD_finished=(ADC_CONTR&0x10);
ADC_CONTR&=0xF7;
return (ADC_DATA);
}
void AD_Init(unsigned char ADin)// ADC 初始化,ADin為八位2進制數(shù),分別對應AD7~0,置1代表打開此路
{
P1=P1|ADin;//要設(shè)置為A/D轉(zhuǎn)換的P1.x口,先設(shè)為高
P1_ADC_EN=ADin;
}
_main.c:
#include
#include <stc_adc.h>
/*
-------------------------------------------------
此程序用以說明STC單片機ADC的使用方法
-------------------------------------------------
*/
void delay(unsigned time)
{
while(time--);
}
void main()
{
AD_Init(0x63);//0110,0011,要設(shè)置為A/D轉(zhuǎn)換的P1.x口,先設(shè)置為高
//0110,0011,P1的P1.0,P1.1,P1.5,P1.6設(shè)置為A/D轉(zhuǎn)換輸入腳
//斷開P1.0,P1.1,P1.5,P1.6內(nèi)部上拉電阻
while(1)
{
P2=GetAD(0);
delay(10000);
P2=GetAD(1);
delay(10000);
P2=GetAD(5);
delay(10000);
P2=GetAD(6);
delay(10000);
}
}
|