一、ADC是模数转换模块。


芯片引脚图

芯片引脚图
内部有一个数模转换器,把一个数字信号(也就是PWM)转成模拟信号与通道上的电压进行比较,由于是12位的所以数字信号,因此是从0到4096的占空比对5V电压进行转换依次与通道上的模拟电压进行比较,最终结果在寄存器中得到的数据就是需要的数字。
下面的图只是参考,注意15个通道每次只能转换一个,也就是在通道设置寄存器中设置的那个通道。


相关寄存器
先清空转换结果寄存器
配置寄存器中设置转换结果的格式和转换速度
设置要转换哪个通道,开启电源,启动转换
转换成功后ACD_FLAG会变成1,查这个位就行了,然后读取转换结果寄存器,并把ADC_FLAG置0。
void ADC_init(int pin,int speed) //ADC初始化函数
{
switch(pin)
{
//下面是设置IO端口的模式为开漏输出,通过两个寄存器相应的位都设置成1
case 0:P1M0 &= ~0x01; P1M1 |= 0x01; break; //ADC通道0
case 1:P1M0 &= ~0x02; P1M1 |= 0x02; break; //ADC通道1
case 2:P1M0 &= ~0x04; P1M1 |= 0x04; break; //ADC通道2
case 3:P1M0 &= ~0x08; P1M1 |= 0x08; break; //ADC通道3
case 4:P1M0 &= ~0x10; P1M1 |= 0x10; break; //ADC通道4
case 5:P1M0 &= ~0x20; P1M1 |= 0x20; break; //ADC通道5
case 6:P1M0 &= ~0x40; P1M1 |= 0x40; break; //ADC通道6
case 7:P1M0 &= ~0x80; P1M1 |= 0x80; break; //ADC通道7
}
ADC_RES=0; //清空结果寄存器高8位
ADC_RESL=0; //清空结果寄存器低8位
ADC_CONTR |= 0x80; //使能ADC模块,打开了ADC电源
ADCCFG = 0x20 | (16-speed);
//0x20设置数据输出格式为低8位+高4位,
//(16-speed)speed取0-16,与0x20按位或就是设置低四位的速度设置位,有16种速度
}
int ADC_get(int pin) //取得ADC转换值
{
int u;
switch(pin) //AD通道选择
{
//下面的0xc0-0xc7中的c是设置第7和第8位为1,也就是打开ADC电源并且启动转换,
//后面的0-7是选择通道。
case 0:ADC_CONTR=0xC0; break; //通道P10
case 1:ADC_CONTR=0xC1; break; //通道P11
case 2:ADC_CONTR=0xC2; break; //通道P12
case 3:ADC_CONTR=0xC3; break; //通道P13
case 4:ADC_CONTR=0xC4; break; //通道P14
case 5:ADC_CONTR=0xC5; break; //通道P15
case 6:ADC_CONTR=0xC6; break; //通道P16
case 7:ADC_CONTR=0xC7; break; //通道P17
}
_nop_(); //等待4空指令
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & 0x20)); //等待ADC转换完成
ADC_CONTR &= ~0x20; //清除ADC标志
u = ADC_RES*256+ADC_RESL; //结果转换
return u;
} 
