STC系列单片机中的STC89LE516AD/X2供给了8路8位精度的高速A/D转化器,坐落P1口上,然后省去了片外ADC的费事。这8路ADC为电压输入型,可做按键扫描,电池电压检测,频谱检测等。ADC转化进程需求17个机器周期。经过对相关功用寄存器的恰当装备,就可以操控其作业。下面就对相关功用寄存器进行介绍。
A/D转化寄存器总表:
寄存器 |
地址 |
称号 |
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转化 操控寄存器 |
- |
- |
- |
ADC_FLAG |
ADC_START |
CHS2 |
CHS1 |
CHS0 |
xxx0 0000 |
ADC_DATA |
C6H |
A/D转化 成果寄存器 |
- |
- |
- |
- |
- |
- |
- |
- |
0000 0000 |
(1) P1_ADC_EN:特别功用寄存器
P1.x作为A/D转化输入通道来用答应特别功用寄存器。相应位为“1”时,对应的P1.x口作为A/D转化运用,内部上拉电阻主动断开。
(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是模仿/数字转化(ADC)发动操控位,设置为1时,开端转化。
ADC_FLAG是模仿/数字转化完毕标志位,当A/D转化完成后,ADC_FLAG=1。
(3) ADC_DATA: A/D转化成果特别功用寄存器
模仿/数字转化成果计算公式为 成果=256×Vin/Vcc
Vin是模仿输入通道输入电压,Vcc为单片机实际作业电压,用单片机作业电压作为模仿参阅电压。
内置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进制数,别离对应AD7~0,置1代表翻开此路
{
P1=P1|ADin;//要设置为A/D转化的P1.x口,先设为高
P1_ADC_EN=ADin;
}
_main.c:
#include
#include
/*
————————————————-
此程序用以阐明STC单片机ADC的运用方法
————————————————-
*/
void delay(unsigned time)
{
while(time–);
}
void main()
{
AD_Init(0x63);//0110,0011,要设置为A/D转化的P1.x口,先设置为高
//0110,0011,P1的P1.0,P1.1,P1.5,P1.6设置为A/D转化输入脚
//断开P1.0,P1.1,P1.5,P1.6内部上拉电阻
while(1)
{
P2=GetAD(0);
delay(10000);
P2=GetAD(1);
delay(10000);
P2=GetAD(5);
delay(10000);
P2=GetAD(6);
delay(10000);
}
}