STC15 片内ADC驱动代码
以下代码从STC-ISP中例程修改而来
INNER_AD.c
#include "INNER_AD.h"
/*----------------------------
读取ADC结果
----------------------------*/
uint Get_ADC_Result(uchar ch) //channel
{
ADC_RES = 0; //清除结果寄存器
ADC_RESL = 0;
ADC_POWER | ADC_SPEEDHH | CHANNEL | ADC_START;
ADC_CONTR |= ADC_START;
//ADC_START=1时开始AD转换,转换结束ADC_START=0
_nop_(); //等待4个NOP
_nop_();
_nop_();
_nop_();
while (!(ADC_CONTR & ADC_FLAG)); //等待ADC转换完成
ADC_CONTR &= ~ADC_FLAG;
//AD转换结束,ADC_FLAG=1。 需要软件清除ADC_FLAG标志
//return ADC_RES;
return (ADC_RES<<2) | ADC_RESL; //返回10bit ADC结果
}
/*----------------------------
初始化ADC
----------------------------*/
void Init_ADC() //建议AD转换时不改变IO口电平,有利于AD精度
{
P1ASF = 1 << CHANNEL; //设置P1.0口为AD口 见手册878页
ADC_RES = 0; //清除结果寄存器
ADC_RESL = 0;
ADC_CONTR = ADC_POWER | ADC_SPEEDHH;
Delay_ADC_Power_Up(2); //ADC上电并延时
}
/*----------------------------
软件延时
----------------------------*/
void Delay_ADC_Power_Up(uint n)
{
uint x;
while (n--)
{
x = 10000;
while (x--);
}
}
INNER_AD.h
#ifndef _INNER_AD_H
#define _INNER_AD_H
#include <STC15.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ADC_POWER 0x80 //ADC电源控制位
#define ADC_FLAG 0x10 //ADC完成标志
#define ADC_START 0x08 //ADC起始控制位
#define ADC_SPEEDLL 0x00 //540个时钟
#define ADC_SPEEDL 0x20 //360个时钟
#define ADC_SPEEDH 0x40 //180个时钟
#define ADC_SPEEDHH 0x60 //90个时钟
#define CHANNEL 0x00 //选择通道0,P1.0作为模拟输入
void Init_ADC();
void Delay_ADC_Power_Up(uint n);
uint Get_ADC_Result(uchar ch);
#endif