STC15系列单片机ADC函数库的20200208优化版

2020-02-11来源: 51hei关键字:STC15系列  单片机  ADC函数库

参考:STC官网函数库
优点:初始化P1任何端口后,main函数只需要循环调用ADC_Convert()函数即可循环完成所有配置的ADC端口模拟量采集。ADC转换结果放置在Dpj_ZongCunChu[]数组中,用于其他功能取用。


目的:免费共享,互相提升。
先在ADC.c文件中写入以下内容:
#define _ADC_C_                //预定义名称用于ADC.h中

#include        "all.h"                //头文件
#if ADC_EN                        //ADC_EN已在ADC.h中预定义

//========================================================================
// 函数: ADC初始化
// 描述: 
// 参数: ADCx: 结构参数,请参考adc.h里的定义.
// 返回: none.
// 版本: V1.0, 2012-10-22
//========================================================================
void        ADC_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转换器电源
        else                                                        ADC_CONTR &= ~ADC_POWER;        //关闭ADC转换器电源
        if(ADCx->ADC_AdjResult == ADC_RES_H2L8)        PCON2 |=  (1<<5);        //10位AD结果的高2位放ADC_RES的低2位,低8位在ADC_RESL。
        else                                                                        PCON2 &= ~(1<<5);        //10位AD结果的高8位放ADC_RES,低2位在ADC_RESL的低2位。
        if(ADCx->ADC_Interrupt == ENABLE)        EADC = 1;                                //中断允许                ENABLE,DISABLE
        else                                                                EADC = 0;
        if(ADCx->ADC_Polity == PolityHigh)        PADC = 1;                                //优先级设置        PolityHigh,PolityLow
        else                                                                PADC = 0;
}


//========================================================================
// 函数: ADC中断函数
// 描述: 
// 参数: none.
// 返回: none.
// 版本: V1.0, 2012-10-22
//========================================================================
void ADC_int (void) interrupt ADC_VECTOR
{
        u8 i=0; u16 t=0;
        ADC_CONTR &= ~ADC_FLAG;                //清除中断标志位
        i=ADC_CONTR&0x07;                        //取当前ADC转换的端口
        if(PCON2 & bit_5)                        //高2低8(提取ADC转换结果)
        {        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各端口转换结果存储到单片机总存储空间
        Dpj_ZongCunChu[Dpj_AdcCunChuAddr+i*2]=t;
        Dpj_ZongCunChu[Dpj_AdcCunChuAddr+i*2+1]=t>>8;
}
/***************************************
ADC转换函数
说明:当前ADC端口转换完成时,循环切换下一个端口转换        
输入:        无
返回值: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                {        if(i<8)        k=i;
                        else        k=i-8;
                        if(P1ASF&(1<                        {        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_H

#ifdef _ADC_C_
#define ADC_EXT
#else
#define ADC_EXT extern
#endif

//宏定义延时文件是否编译;0----不编译;1----编译
#define ADC_EN        1
#if ADC_EN

#define        ADC_P10                0x01        //IO引脚 Px.0
#define        ADC_P11                0x02        //IO引脚 Px.1
#define        ADC_P12                0x04        //IO引脚 Px.2
#define        ADC_P13                0x08        //IO引脚 Px.3
#define        ADC_P14                0x10        //IO引脚 Px.4
#define        ADC_P15                0x20        //IO引脚 Px.5
#define        ADC_P16                0x40        //IO引脚 Px.6
#define        ADC_P17                0x80        //IO引脚 Px.7
#define        ADC_P1_All        0xFF        //IO所有引脚

#define ADC_90T                (3<<5)
#define ADC_180T        (2<<5)
#define ADC_360T        (1<<5)
#define ADC_540T        0

#define ADC_POWER        0x80        //ADC电源控制位
//#define SPEED1        0x40        //ADC速度控制位
//#define SPEED0        0x20        //ADC速度控制位
#define ADC_FLAG        0x10        //模数转换结束标志,软件清0
#define ADC_START        0x08        //自动清0
//#define CHS2                0x04        //通道控制位
//#define CHS1                0x02        //通道控制位
//#define CHS0                0x01        //通道控制位

#define ADC_CH0                0
#define ADC_CH1                1
#define ADC_CH2                2
#define ADC_CH3                3
#define ADC_CH4                4
#define ADC_CH5                5
#define ADC_CH6                6
#define ADC_CH7                7

#define ADC_RES_H2L8        1
#define ADC_RES_H8L2        0

typedef struct
{
        u8        ADC_Px;                        //设置要做ADC的IO,        ADC_P10 ~ ADC_P17,ADC_P1_All
        u8        ADC_Speed;                //ADC速度                        ADC_90T,ADC_180T,ADC_360T,ADC_540T
        u8        ADC_Power;                //ADC功率允许/关闭        ENABLE,DISABLE
        u8        ADC_AdjResult;        //ADC结果调整,        ADC_RES_H2L8,ADC_RES_H8L2
        u8        ADC_Polity;                //优先级设置        PolityHigh,PolityLow
        u8        ADC_Interrupt;        //中断允许                ENABLE,DISABLE
} ADC_InitTypeDef;

ADC_EXT void        ADC_Inilize(ADC_InitTypeDef *ADCx);        //ADC初始化函数
ADC_EXT u8                ADC_Convert();                                                //启动ADC转换函数

#endif

#endif

[1] [2]
关键字:STC15系列  单片机  ADC函数库 编辑:什么鱼 引用地址:http://news.2689mr.com/mcu/ic487846.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:单片机酒精浓度测试仪设计
下一篇:单片机烟雾报警器程序+PCB+原理图

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

STC15系列电压测试+LCD12864显示
最近使用15做电压测试,顺便使用下12864显示,程序如下:    #include <STC15F2K60S2.H>    #include <intrins.h>    #include <stdio.h>        #define uchar unsigned char    #define uint  unsigned int    #define ulint unsigned long int 
发表于 2020-01-29
stc15系列STC内部EEPROM的读写
STC单片机利用IAP技术实现了EEPROM功能,相比外置存储芯片而言,在操作上比较方便。 涉及STC单片机EEPROM操作的特殊功能寄存器有6个,地址分别是E2H、E3H、E4H、E5H、E6H和E7H。在STC单片机使用手册中,作者分别将它们定义为:一、IAP_DATA  (E2H)二、IAP_ADDRH  (E3H)三、IAP_ADDRL  (E4H)四、IAP_CMD  (E5H)五、IAP_TRIG  (E6H)六、IAP_CONTR  (E7H)本人认为,手册中给每个地址单元定义的英文
发表于 2020-01-18
(51基础篇) - 021 STC89C51系列单片机 内部EEPROM 驱动
;   0x02           //if SYSCLK<10MHz 28 #define Clock_0M_5M     0x03           //if SYSCLK<5MHz 29  30 //EEPROM的起始地址 31 #define EEPROM_BASE_ADDRESS    0x0000 32 //STC89C51系列 33 #define
发表于 2020-01-07
(51基础篇) - 021 STC89C51系列单片机 内部EEPROM 驱动
STC15F2系列单片机UART1使用定时器1做波特率发生器
;        AUXR |= AUXR_T2x12        AUXR |= AUXR_S1ST2;//使用定时器2 作为串口1的波特率发生器        ES = 1;    EA = 1;        uart1_SendString("rn stc15f2k08s uart1 test rn");        while
发表于 2019-10-30
STC12系列单片机的位变量
。在单片机C语言中,bit是新增的一个关键词,它是用来定义一个“位变量”bdata是把变量定义到数据RAM的可位寻址区,即51系列的20H~2FH单元中,最后bitflag应该是bit flag(和关键字bit中间有个空格)表示定义一个位变量flag,这个flag变量只能是0或者1。
发表于 2019-05-20
基于52单片机控制编码器显示程序
#include "reg52.h"    #define uchar unsigned char#define uint unsigned int#define LCD1602_DATAPINS P0sbit LCD1602_E=P2^7;sbit LCD1602_RW=P2^5;sbit LCD1602_RS=P2^6;sbit DIR=P1^0;sbit STEP=P1^1;sbit K1=P3^1;sbit K2=P3^0;typedef unsigned int u16;   //对数据类型进行声明定义typedef unsigned char
发表于 2020-02-08
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

更多每日新闻
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD。com。cn, Inc。 All rights reserved
澳客彩票 哪些彩票网站送彩金 网上百家乐免费送彩金 博彩送彩金18元 送彩金200的网站大白菜 皇家赌场送彩金 棋牌送彩金且可提现的网站 那个棋牌平台送彩金最多 天音彩票网 送彩金100可提款mg游戏