如何使用STC12C5A60S2自带的A/D转换器?
前言
在我们使用传统8051单片机的时候,常常使用某些需要进行A/D转换的模块,比如烟雾传感器(MQ-2)、超声波测距模块、人体红外传感器等等,这样会使我们的工作量增加不少。但是我们可以选择STC12C5A60S2单片机,它作为新一代8051单片机,内部集成了8路高速10位A/D转换器,可以省略外加A/D转换模块的步骤。
提示:以下是本篇文章正文内容,下面案例可供参考
一、STC12C5A60S2中A/D转换器的简单说明
STC12C5A60S2带A/D转换的单片机的A/D转换口在P1口(P1.7-P1.0),有8路10位 高速A/D转换,可做温度检测、电池、电压检测、按键扫描、频谱检测等。上电复位后P1口为弱上拉型I/O口,用户可以通过软件设置将8路中的任何一路设置为A/D转换,不需作为A/D使用的口可继续作为I/O口使用。
二、使用步骤
1.配置需要作为A/D转换的IO口
P1ASF寄存器
P1口模拟功能控制寄存器(该寄存器是只写寄存器,读无效)
想要P1中哪个IO口作为A/D转换口,哪个口就置1
例子如下:
配置P1.0口作为模拟功能A/D使用口(0000 0001)
P1ASF=0x01; //P1.0口作为模拟功能A/D使用(可选择)
配置P1所有IO口作为模拟功能A/D使用口(1111 1111)
P1ASF=0xff; //P1所有IO口作为模拟功能A/D使用
2.A/D转换器的控制寄存器—ADC_CONRT
我个人认为 ADC_CONRT寄存器的作用在A/D转换中最为重要,因为它同时包含了A/D转换器电源的开关、转换速度的控制、A/D转换器的结束标志位、A/D转换器的启动控制位、模拟输入通道的选择。
ADC_CONRT — 相对应的8位二进制
第一位二进制:
代表A/D转换器电源的开关,1表示开,0表示关。关闭A/D转换器表示 ADC_CONRT=0x00,开启表示为 ADC_CONRT=0x80。
第二、三位二进制:
代表A/D转换的速度,00代表540个时钟周期转换一次,01代表360个时钟周期转换一次,10代表180个时钟周期转换一次,11代表90个时钟周期转换一次。
第四位二进制:
代表A/D转换器的结束标志位,该标志位在A/D转换结束后一定要清零(我使用的时候是没有置1的,看手册的意思应该是转换完成后自动置1,最后全部清零就行)。
第五位二进制:
代表A/D转换器的启动控制位,置1的时候开始转换,转换结束为0.
第六、七、八位二进制:
代表模拟输入通道的选择,000表示P1.0,001表示P1.1,以此类推。
程序初始化:
void AD_change() //Only channel P1.4 { P1ASF=0x10; //P1.4口作为模拟功能A/D使用(可选择) 0001 0000 ADC_CONTR=0x00; //第一个0关闭A/D转换器电源 AUXR1=0x00; ADC_CONTR=0x80;//打开A/D转换器电源 Delay_us(2); ADC_CONTR=0x8c; //第五个数是数模转换启动标志 打开A/D转换器电源,同时打开数模转换 ,并选择P1.4作为输入通道 Delay_us(2); while(ADC_CONTR==0x8c);//1000 1100 ADC_CONTR=0; //清零 }
3.转换结果
ADC_RES和ADC_RESL是用于保存A/D转换结果的寄存器,当AUXR1=0x00时,转换结果的高八位存于
ADC_RES,低二位存于ADC_RESL;当AUXR1=0x04时,转换结果的高八位存ADC_RESL,
低二位存于ADC_RES;取十位完整结果:其中Vcc为单片机的供电电压,Vin为输入电压;取八位结果:
。
转换结果代码如下:
void main()
{
int resl;
float num;
ADC_one();
resl=ADC_RES;
resl=resl+ADC_RESL;
num=resl/1024.0*5; // num为A/D输入电压值
resl = 1024.0 * num/5;}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了STC12C5A60S2中A/D转换器的使用,其中有些内容是本人参考手册所得。(纯小白,不喜勿喷,欢迎大家斧正!!!)