STC8A单片机ADC功能使用

本文详细介绍了STC8系列单片机中集成的12位15通道高速ADC转换器的工作原理和使用方法。内容涵盖ADC相关寄存器的功能说明、转换步骤及范例程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、概述

        STC8系列单片机内部集成了一个12位15通道的高速ADC转换器。ADC的时钟为系统时钟的2分频的16分频的32分频到系统时钟的2分频的16分频的512分频。转换结果有2种格式:左对齐和右对齐。

        注:ADC不能多通道同时进行,一次只能检测一个通道!

2、ADC相关的寄存器:

ADC_CONTR:ADC控制寄存器

        低4位(ADC_CHS):ADC通道选择位。

                

        第6位(ADC_FLAG):ADC转换标志位。当完成一次AD转换后硬件会自动将这位置1并触发ADC中断,必须手动清零。

        第7位(ADC_START):ADC转换启动控制位。写入1开始转换,转换完成后硬件自动置0.为0时无影响,即使ADC正在进行转换也不会停止。

        第8位(ADC_POWER):ADC电源控制位。写入1ADC芯片开始供电,写入0停止供电。

ADC_CFG:ADC配置寄存器

        低4位(SPEED):ADC时钟控制位。ADC时钟=SYSClk/2/16/SPEED.

                

        第6位(RESFMT):ADC转换结果控制位。为0时,转换结果左对齐。ADC_RES储存转换结果的高8位,ADC_RESL的高4位存储转换结果的低4位,ADC_RESL的低4位为0;为1时转换结果右对齐。ADC_RES的高4位为0,低4位储存转换结果的高4位。ADC_RESL储存转换结果的低8位。

ADC_RES和ADC_RESL:转换结果储存寄存器。

3、转换步骤:

        首先ADC通道设置为高阻输入模式。

                

                eg:P1M0=0X00;P1M1=0X01;//配置P1.0为高阻输入模式。

        然后开启AD转换器的电源、并且选定ADC转换通道。通过配置ADC_CONTR的值来控制。

                eg:ADC_CONTR=0x80;//开启ADC电源,同时选定转换通道为P1.0;

        配置ADC转换的时钟、数据储存格式。通过配置ADC_CFG的值来控制。

                eg:ADC_CFG=0x0f;//设置转换结果左对齐,同时ADC时钟为系统时钟的2分频的16分频的512分频;

        开始进行ADC转换。将ADC_CONTR寄存器的第7位置1即可。

                eg:ADC_CONTR=ADC_CONTR|0x40;//通过或运算将ADC_CONTR寄存器的第7位置1而不改变其它位的值。

        等待转换ADC完成。通过ADC_CONTR寄存器的第6位来判断是否转换完成。转换完成时这个位为1;

                eg:while(!(ADC_CONTR&0X20));//转换未完成时,第6位为0,与运算后结果为0,取反后为1。转换完成后,第6位为1,与运算后结果为0x20,取反后为0;

        清除转换标志位。将ADC_CONTR寄存器的第6位置0。

                eg:ADC_CONTR=ADC_CONTR&0x9f;//进行与运算,0xdf的第6位和第7位为0,与运算以后的值第6位和第7位一定为0。其余6位如果原来为1依旧为1,原来为0依旧为0。

        读取转换结果。保存ADC_RES和ADC_RESL寄存器的值,保存操作为ADCH_Value=ADC_RES ;  ADCL_Value=ADC_RESL; 保存后可以根据个人对寄存器清0,清零操作为:ADC_RES=0;ADC_RESL=0。

至此一次ADC转换就进行完成了。

注:在开始进入等待ADC转换结束之前可以先进行一段延时,如延时两个机器周期(_nop_();)

4、范例程序:

#include"main.h"
#include "intrins.h"

unsigned char ADCH_Value;
unsigned char ADCL_Value;

void main(void)
{
	P1M0 = 0x00;                                //设置P1.1为ADC口
    P1M1 = 0x02;
    ADC_CONTR = 0x81;                           //使能ADC模块
    ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16/16,右对齐
	ADC_CONTR |= 0x40;                      //启动AD转换
    _nop_();
    _nop_();
    while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
    ADC_CONTR = ADC_CONTR & 0x9f;			//清除ADC完成标志
	ADCH_Value=ADC_RES;						//保存ADC转换的值
	ADCL_Value=ADC_RESL;
	ADC_RES=0;								//寄存器清零
	ADC_RESL=0;
	while(1);
}

        

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值