微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STC15W系列单片机自带的ADC使用方法以及时需要注意的问题

STC15W系列单片机自带的ADC使用方法以及时需要注意的问题

时间:11-27 来源:互联网 点击:
以下代码和文字说明,参考了STC公司提供的技术手册(STC15.pdf)。

具体代码如下:

#include
#include"init.h"
#include"led.h"
#include"buzzer.h"
#include"delayms.h"
#include"uart.h"

//ADC_CONTR寄存器的位取值
#define ADC_POWER0x80//打开ADC转化器电源
#define ADC_FLAG0x10//ADC完成标志位
#define ADC_START0x08//ADC开始控制位

#define ADC_SPEEDLL0x00//540个时钟周期转换一次
#define ADC_SPEEDL0x20//360个时钟周期转换一次
#define ADC_SPEEDH0x40//180个时钟周期转换一次
#define ADC_SPEEDHH0x60// 90个时钟周期转换一次

#define ADC_CH10x01//选择通道1
#define ADC_CH20x02//选择通道2
#define ADC_CH30x03//选择通道3
#define ADC_CH40x04//选择通道4

//初始化ADC

void init_ADC(void)
{
P1ASF= 0x1e; //P11-P14口作为模拟功能A/D使用
ADC_RES= 0;//清除结果寄存器
ADC_RESL= 0;
PCON&= 0xdf;//ADCRES存放高8位ADC结果,ADCRESL[1:0]存放低2位结果
ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_CH2;//启动转换,通道2
delayms(1);//ADC上电延时

EA= 1;//CPU开启总中断
EADC = 1;//允许ADC中断
}

void main(void)
{
init_IO(); //初始化
init_sym();

init_uart();
init_ADC();
while(1)
{
while(!(ADC_CONTR & ADC_FLAG));//等待ADC完成
ADC_CONTR &= !ADC_FLAG;//清除ADC中断
sendData(ADC_RES);
sendData(ADC_RESL);
led_ye_on();
ADC_RES= 0;//获取ADC结果后,清除结果寄存器
ADC_RESL= 0;

//AD转换结束后会自动停止转换,所以这里再次开启ADC
//并且一定要重新开启ADC电源、设置ADC通道和ADC转换速率
ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ADC_CH2;//启动转换,通道2

delayms(1000);
}
}

自带ADC的使用方法请参照以上代码。

需要注意的问题:

1、在启动AD转换前,给AD转换器上电,并且上电后需要延时一下;

2、对ADC控制寄存器(ADC_CONTR)的操作最好是直接赋值,不要用‘&’和‘|’;

3、在ADC转换过程中不要改变I/O口的状态,即使试图改变也会失败;

4、ADC实现一次转换结束后,AD转换将会自动关闭,如果要实现连续转换,则需要再次启动AD转换(将ADC_CONTR 寄存器的ADC_START位1)。因为需要对ADC_CONTR寄存器直接赋值,所以 要对ADC_CONTR寄存器再次赋值(该值和ADC初始化中的值一致)。实践也证明了,如果直接利用或语句将ADC_START置位(ADC_CONTR |= ADC_START;),则AD转换失败,通过调试测试,初步判断是ADC_CONTR寄存器的ADC_POWER位不等于1,也就是说启动AD转换前,AD转换器没有上电,这样AD转换自然不会成功。

5、如果需要改变I/O口的状态,最好是在AD转换开始之前进行。

以上的内容纯属个人学习体会,如有不当之处,请指正!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top