STC單片機(jī)內(nèi)置ADC的使用方法
A/D轉(zhuǎn)換寄存器總表:
本文引用地址:http://www.ex-cimer.com/article/201611/316198.htm寄存器 | 地址 | 名稱 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 初始初 |
P1_ADC_EN | 97H | 允許P1.x 成為A/D口 | P17 | P16 | P15 | P14 | P13 | P12 | P11 | P10 | 0000 0000 |
ADC_ CONTR | C5H | A/D轉(zhuǎn)換 控制寄存器 | - | - | - | ADC_FLAG | ADC_START | CHS2 | CHS1 | CHS0 | xxx0 0000 |
ADC_DATA | C6H | A/D轉(zhuǎn)換 結(jié)果寄存器 | - | - | - | - | - | - | - | - | 0000 0000 |
(1) P1_ADC_EN:特殊功能寄存器
P1.x作為A/D轉(zhuǎn)換輸入通道來用允許特殊功能寄存器。相應(yīng)位為“1”時(shí),對應(yīng)的P1.x口作為A/D轉(zhuǎn)換使用,內(nèi)部上拉電阻自動斷開。
(2) ADC_CONTR:特殊功能寄存器
CHS2/CHS1/CHS0是模擬輸入通道選擇,CHS2/CHS1/CHS0的取值如下表所示:
CHS2 | CHS1 | CHS0 | 模擬輸入通道選擇 |
0 | 0 | 0 | 選擇P1.0為A/D輸入 |
0 | 0 | 1 | 選擇P1.1為A/D輸入 |
0 | 1 | 0 | 選擇P1.2為A/D輸入 |
0 | 1 | 1 | 選擇P1.3為A/D輸入 |
1 | 0 | 0 | 選擇P1.4為A/D輸入 |
1 | 0 | 1 | 選擇P1.5為A/D輸入 |
1 | 1 | 0 | 選擇P1.6為A/D輸入 |
1 | 1 | 1 | 選擇P1.7為A/D輸入 |
ADC_START是模擬/數(shù)字轉(zhuǎn)換(ADC)啟動控制位,設(shè)置為1時(shí),開始轉(zhuǎn)換。
ADC_FLAG是模擬/數(shù)字轉(zhuǎn)換結(jié)束標(biāo)志位,當(dāng)A/D轉(zhuǎn)換完成后,ADC_FLAG=1。
(3) ADC_DATA: A/D轉(zhuǎn)換結(jié)果特殊功能寄存器
模擬/數(shù)字轉(zhuǎn)換結(jié)果計(jì)算公式為 結(jié)果=256×Vin/Vcc
Vin是模擬輸入通道輸入電壓,Vcc為單片機(jī)實(shí)際工作電壓,用單片機(jī)工作電壓作為模擬參考電壓。
內(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進(jìn)制數(shù),分別對應(yīng)AD7~0,置1代表打開此路
{
P1=P1|ADin;//要設(shè)置為A/D轉(zhuǎn)換的P1.x口,先設(shè)為高
P1_ADC_EN=ADin;
}
_main.c:
#include
#include
/*
-------------------------------------------------
此程序用以說明STC單片機(jī)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);
}
}
評論