STC15系列单片机ADC函数库的优化版
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
STC15系列单片机ADC函数库的20200208优化版;
作者:李彬,QQ:383048256
参考:STC官网函数库
优点:初始化P1任何端口后,main函数只需要循环调用ADC_Convert()函数即可循环完成所有配置的ADC端口模拟量采集。ADC转换结果放置在Dpj_ZongCunChu[]数组中,用于其他功能取用。
} ADC_InitTypeDef;
ADC_EXT voidADC_Inilize(ADC_InitTypeDef *ADCx);//ADC初始化函数
ADC_EXT u8ADC_Convert();//启动ADC转换函数
#endif
#endif
注意:使用ADC函数库时,应先初始化ADC(ADC_Inilize(ADC_InitTypeDef *ADCx)),再循环调用顺序转换(ADC_Convert())。
//#define CHS00x01//通道控制位
#define ADC_CH00
#define ADC_CH11
#define ADC_CH22
#define ADC_CH33
#define ADC_CH44
#define ADC_CH55
#define ADC_CH66
#define ADC_CH77
elseADC_CONTR &= ~ADC_POWER;//关闭ADC转换器电源
if(ADCx->ADC_AdjResult == ADC_RES_H2L8)PCON2 |= (1<<5);//10位AD结果的高2位放ADC_RES的低2位,低8位在ADC_RESL。
elsePCON2 &= ~(1<<5);//10位AD结果的高8位放ADC_RES,低2位在ADC_RESL的低2位。
{t=ADC_RES & 3;
t=(t<<8) + ADC_RESL;
}else//高8低2(提取ADC转换结果)
{t=ADC_RES;
t=(t<<2) + (ADC_RESL&3);
}
t=(u32)t*500/1024;//默认电源电压5V,检测电压乘100倍,保留2个小数点数字
//ADC各端口转换结果存储到单片机总存储空间
#define__ADC_H
#ifdef _ADC_C_
#define ADC_EXT
#else
#define ADC_EXT extern
#endif
//宏定义延时文件是否编译;0----不编译;1----编译
#define ADC_EN1
#if ADC_EN
#defineADC_P100x01//IO引脚Px.0
//函数: ADC初始化
//描述:
//参数: ADCx:结构参数,请参考adc.h里的定义.
//返回: none.
//版本: V1.0, 2012-10-22
//========================================================================
u8ADC_Power;//ADC功率允许/关闭ENABLE,DISABLE
u8ADC_AdjResult;//ADC结果调整,ADC_RES_H2L8,ADC_RES_H8L2
u8ADC_Polity;//优先级设置PolityHigh,PolityLow
u8ADC_Interrupt;//中断允许ENABLE,DISABLE
Dpj_ZongCunChu[Dpj_AdcCunChuAddr+i*2]=t;
Dpj_ZongCunChu[Dpj_AdcCunChuAddr+i*2+1]=t>>8;
}
/***************************************
ADC转换函数
说明:当前ADC端口转换完成时,循环切换下一个端口转换
目的:免费共享,互相提升。
先在ADC.c文件中写入以下内容:
#define _ADC_C_//预定义名称用于ADC.h中
#include"all.h"//头文件
#if ADC_EN//ADC_EN已在ADC.h中预定义
//========================================================================
if(ADCx->ADC_Interrupt == ENABLE)EADC = 1;//中断允许ENABLE,DISABLE
elseEADC = 0;
if(ADCx->ADC_Polity == PolityHigh)PADC = 1;//优先级设置PolityHigh,PolityLow
elsePADC = 0;
//#define SPEED10x40//ADC速度控制位
//#define SPEED00x20//ADC速度控制位
#define ADC_FLAG0x10//模数转换结束标志,软件清0
#define ADC_START0x08//自动清0
//#define CHS20x04//通道控制位
//#define CHS10x02//通道控制位
#defineADC_P170x80//IO引脚Px.7
#defineADC_P1_All0xFF//IO所有引脚
#define ADC_90T(3<<5)
#define ADC_180T(2<<5)
#define ADC_360T(1<<5)
#define ADC_540T0
#define ADC_POWER0x80//ADC电源控制位
#defineADC_P110x02//IO引脚Px.1
#defineADC_P120x04//IO引脚Px.2
#defineADC_P130x08//IO引脚Px.3
#defineADC_P140x10//IO引脚Px.4
#defineADC_P150x20//IO引脚Px.5
#defineADC_P160x40//IO引脚Px.6
输入:无
返回值:0---当前ADC通道未转换完成
1---ADC通道切换成功
2---错误,无端口ADC转换
***************************************/
u8 ADC_Convert()
{
u8 i=0,j=0,k=0;
if(P1ASF==0) return 2;
if( (ADC_CONTR&ADC_START)==0 )//判断ADC空闲
{i=ADC_CONTR&0x07;//提取当前ADC转换通道号
if((++i)>=8)i=0;//判断指向下一通道越界,从新从0通道查询
j=8+i;
for(;i<j;i++)//轮流查询8个ADC通道允许状态
{if(i<8)k=i;
elsek=i-8;
if(P1ASF&(1<<k))//判断bit.k位被设置为ADC转换端口
voidADC_Inilize(ADC_InitTypeDef *ADCx)
{
P1ASF = ADCx->ADC_Px;//配置ADC端口
ADC_CONTR = (ADC_CONTR & ~ADC_90T) | ADCx->ADC_Speed;//配置ADC转换器速度
if(ADCx->ADC_Power == ENABLE)ADC_CONTR |= ADC_POWER;//打开ADC转换器电源
{ADC_CONTR&=~0x07;//清除ADC通道端口
ADC_CONTR=ADC_CONTR|k;//配置下一个允许ADC转换的通道
ADC_CONTR|=ADC_START;//启动ADC转换
return 1;
}
}
}
return 0;
}
#endif
以下为ADC.h文件内容:
#ifndef__ADC_H
#define ADC_RES_H2L81
#define ADC_RES_H8L20
typedef struct
{
u8ADC_Px;//设置要做ADC的IO,ADC_P10 ~ ADC_P17,ADC_P1_All
u8ADC_Speed;//ADC速度ADC_90T,ADC_180T,ADC_360T,ADC_540T
若有疑问,可联系我。
}
//========================================================================
//函数: ADC中断函数
//描述:
//参数: none.
//返回: none.
//版本: V1.0, 2012-10-22
//========================================================================
void ADC_int (void) interrupt ADC_VECTOR
{
u8 i=0; u16 t=ห้องสมุดไป่ตู้;
ADC_CONTR &= ~ADC_FLAG;//清除中断标志位
i=ADC_CONTR&0x07;//取当前ADC转换的端口
if(PCON2 & bit_5)//高2低8(提取ADC转换结果)
作者:李彬,QQ:383048256
参考:STC官网函数库
优点:初始化P1任何端口后,main函数只需要循环调用ADC_Convert()函数即可循环完成所有配置的ADC端口模拟量采集。ADC转换结果放置在Dpj_ZongCunChu[]数组中,用于其他功能取用。
} ADC_InitTypeDef;
ADC_EXT voidADC_Inilize(ADC_InitTypeDef *ADCx);//ADC初始化函数
ADC_EXT u8ADC_Convert();//启动ADC转换函数
#endif
#endif
注意:使用ADC函数库时,应先初始化ADC(ADC_Inilize(ADC_InitTypeDef *ADCx)),再循环调用顺序转换(ADC_Convert())。
//#define CHS00x01//通道控制位
#define ADC_CH00
#define ADC_CH11
#define ADC_CH22
#define ADC_CH33
#define ADC_CH44
#define ADC_CH55
#define ADC_CH66
#define ADC_CH77
elseADC_CONTR &= ~ADC_POWER;//关闭ADC转换器电源
if(ADCx->ADC_AdjResult == ADC_RES_H2L8)PCON2 |= (1<<5);//10位AD结果的高2位放ADC_RES的低2位,低8位在ADC_RESL。
elsePCON2 &= ~(1<<5);//10位AD结果的高8位放ADC_RES,低2位在ADC_RESL的低2位。
{t=ADC_RES & 3;
t=(t<<8) + ADC_RESL;
}else//高8低2(提取ADC转换结果)
{t=ADC_RES;
t=(t<<2) + (ADC_RESL&3);
}
t=(u32)t*500/1024;//默认电源电压5V,检测电压乘100倍,保留2个小数点数字
//ADC各端口转换结果存储到单片机总存储空间
#define__ADC_H
#ifdef _ADC_C_
#define ADC_EXT
#else
#define ADC_EXT extern
#endif
//宏定义延时文件是否编译;0----不编译;1----编译
#define ADC_EN1
#if ADC_EN
#defineADC_P100x01//IO引脚Px.0
//函数: ADC初始化
//描述:
//参数: ADCx:结构参数,请参考adc.h里的定义.
//返回: none.
//版本: V1.0, 2012-10-22
//========================================================================
u8ADC_Power;//ADC功率允许/关闭ENABLE,DISABLE
u8ADC_AdjResult;//ADC结果调整,ADC_RES_H2L8,ADC_RES_H8L2
u8ADC_Polity;//优先级设置PolityHigh,PolityLow
u8ADC_Interrupt;//中断允许ENABLE,DISABLE
Dpj_ZongCunChu[Dpj_AdcCunChuAddr+i*2]=t;
Dpj_ZongCunChu[Dpj_AdcCunChuAddr+i*2+1]=t>>8;
}
/***************************************
ADC转换函数
说明:当前ADC端口转换完成时,循环切换下一个端口转换
目的:免费共享,互相提升。
先在ADC.c文件中写入以下内容:
#define _ADC_C_//预定义名称用于ADC.h中
#include"all.h"//头文件
#if ADC_EN//ADC_EN已在ADC.h中预定义
//========================================================================
if(ADCx->ADC_Interrupt == ENABLE)EADC = 1;//中断允许ENABLE,DISABLE
elseEADC = 0;
if(ADCx->ADC_Polity == PolityHigh)PADC = 1;//优先级设置PolityHigh,PolityLow
elsePADC = 0;
//#define SPEED10x40//ADC速度控制位
//#define SPEED00x20//ADC速度控制位
#define ADC_FLAG0x10//模数转换结束标志,软件清0
#define ADC_START0x08//自动清0
//#define CHS20x04//通道控制位
//#define CHS10x02//通道控制位
#defineADC_P170x80//IO引脚Px.7
#defineADC_P1_All0xFF//IO所有引脚
#define ADC_90T(3<<5)
#define ADC_180T(2<<5)
#define ADC_360T(1<<5)
#define ADC_540T0
#define ADC_POWER0x80//ADC电源控制位
#defineADC_P110x02//IO引脚Px.1
#defineADC_P120x04//IO引脚Px.2
#defineADC_P130x08//IO引脚Px.3
#defineADC_P140x10//IO引脚Px.4
#defineADC_P150x20//IO引脚Px.5
#defineADC_P160x40//IO引脚Px.6
输入:无
返回值:0---当前ADC通道未转换完成
1---ADC通道切换成功
2---错误,无端口ADC转换
***************************************/
u8 ADC_Convert()
{
u8 i=0,j=0,k=0;
if(P1ASF==0) return 2;
if( (ADC_CONTR&ADC_START)==0 )//判断ADC空闲
{i=ADC_CONTR&0x07;//提取当前ADC转换通道号
if((++i)>=8)i=0;//判断指向下一通道越界,从新从0通道查询
j=8+i;
for(;i<j;i++)//轮流查询8个ADC通道允许状态
{if(i<8)k=i;
elsek=i-8;
if(P1ASF&(1<<k))//判断bit.k位被设置为ADC转换端口
voidADC_Inilize(ADC_InitTypeDef *ADCx)
{
P1ASF = ADCx->ADC_Px;//配置ADC端口
ADC_CONTR = (ADC_CONTR & ~ADC_90T) | ADCx->ADC_Speed;//配置ADC转换器速度
if(ADCx->ADC_Power == ENABLE)ADC_CONTR |= ADC_POWER;//打开ADC转换器电源
{ADC_CONTR&=~0x07;//清除ADC通道端口
ADC_CONTR=ADC_CONTR|k;//配置下一个允许ADC转换的通道
ADC_CONTR|=ADC_START;//启动ADC转换
return 1;
}
}
}
return 0;
}
#endif
以下为ADC.h文件内容:
#ifndef__ADC_H
#define ADC_RES_H2L81
#define ADC_RES_H8L20
typedef struct
{
u8ADC_Px;//设置要做ADC的IO,ADC_P10 ~ ADC_P17,ADC_P1_All
u8ADC_Speed;//ADC速度ADC_90T,ADC_180T,ADC_360T,ADC_540T
若有疑问,可联系我。
}
//========================================================================
//函数: ADC中断函数
//描述:
//参数: none.
//返回: none.
//版本: V1.0, 2012-10-22
//========================================================================
void ADC_int (void) interrupt ADC_VECTOR
{
u8 i=0; u16 t=ห้องสมุดไป่ตู้;
ADC_CONTR &= ~ADC_FLAG;//清除中断标志位
i=ADC_CONTR&0x07;//取当前ADC转换的端口
if(PCON2 & bit_5)//高2低8(提取ADC转换结果)