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系列单片机RS-485通讯例程(带CRC校验)
单片机源程序如下:#include <uart.h>sbit bitCtrl_485Eable = P1^3;//sbit bitCtrl_485_2Eable = P7^3;//xdata unsigned char mod_comd[9]={0x01,0x04,0x75,0x31,0x02,0x00,0x00,0x08,0x09};unsigned char freq = 0;/****************************************************************************************/// unsigned char MyDeviceAddr _a
发表于 2020-08-08
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
STC15系列单片机-环境监控设备
 * 完成时间:2015.4.5 17:00 * 作者:宁静致远 */ #include <stc15f2k60s2.h>#include <stdio.h>#include "stdint.h"#include "DS1302.h"#include "DS18B20.h"#include "UART.h"#include "digitalTube.h"#include "timer.h"//#include "main.h" 
发表于 2019-05-09
STC15系列单片机 超声波测距实验
的实际距离。 */ #include <stc15f2k60s2.h>#include <intrins.h>#include "stdint.h"#include "timer.h"#include "digitalTube.h" #define somenop(); {      _nop_();_nop_();_nop_();_nop_();_nop_();     _nop_();_nop_();_nop_();_nop_();_nop_(); } sbit
发表于 2019-05-09
AT90S8515单片机SPI驱动74LS595源程序
AT90S8515使用SPI驱动74LS595。我这里使用了SS口线PB.4,作为74LS595的锁存信号,关键是把PB.4设置为输出。74LS595驱动发光管显示加1计数,我用SPI最高速度,所以显示16位计数高八位,低八位太快,看不清楚。单片机源程序如下://ICC-AVR application builder : 2020/3/30 22:23:31// Target : 8515// Crystal: 8.0000Mhz#include <io8515v.h>#include <macros.h>#define SS_ON PORTB |= BIT(4);     
发表于 2020-09-16
AT90S8515<font color='red'>单片机</font>SPI驱动74LS595源程序
小广播
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD。com。cn, Inc。 All rights reserved
充值送彩金购彩软件 足彩送彩金 白菜送彩金论坛 送彩金的娱乐棋牌游戏 哪些娱乐网站送彩金 送彩金的网站有那些 送彩金500的网站大白菜 彩票大赢家 免费送彩金可提款 博彩送彩金38元