如何使用STC12C5A60S2自带的A/D转换器?

 

文章目录

前言 

二、使用步骤

1.配置需要作为A/D转换的IO口

  想要P1中哪个IO口作为A/D转换口,哪个口就置1

2.A/D转换器的控制寄存器—ADC_CONRT

  ADC_CONRT — 相对应的8位二进制

  第一位二进制:

  第二、三位二进制:

  第四位二进制:

  第五位二进制:

  第六、七、八位二进制:

3.转换结果

总结

 

 


前言 

在我们使用传统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;取十位完整结果:gif.latex?ADC_RES+ADC_RESL%3D%5Cfrac%7BVin%7D%7BVcc%7D*1024其中Vcc为单片机的供电电压,Vin为输入电压;取八位结果:gif.latex?ADC_RES%3D%5Cfrac%7BVin%7D%7BVcc%7D*256。 

转换结果代码如下:

 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;

}

133a38a0ab48420fbd4a9b7b32bb110a.jpeg 


 

总结

以上就是今天要讲的内容,本文仅仅简单介绍了STC12C5A60S2中A/D转换器的使用,其中有些内容是本人参考手册所得。(纯小白,不喜勿喷,欢迎大家斧正!!!)

 

物联沃分享整理
物联沃-IOTWORD物联网 » 如何使用STC12C5A60S2自带的A/D转换器?

发表评论