历史上的今天
返回首页

历史上的今天

今天是:2025年02月11日(星期二)

正在发生

2020年02月11日 | STC15系列单片机ADC函数库的20200208优化版

2020-02-11 来源:51hei

参考: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

推荐阅读

史海拾趣

FCI / Amphenol公司的发展小趣事

Amphenol公司成立于1932年,最初由Arthur J. Schmitt和Gordon K. Klapmeier共同创办,专注于电磁线缆的制造。然而,随着技术的进步和市场需求的变化,Amphenol公司逐渐将重心转向电缆连接器的制造。凭借高品质的产品和服务,Amphenol公司的电缆连接器在市场上获得了广泛的认可,并逐渐发展成为全球最大的电缆连接器制造商之一。

Fair Rite公司的发展小趣事

为了确保产品质量和满足客户需求,Fair Rite引入了严格的质量管理体系,并通过了ISO/TS 16949认证。此外,公司还积极拓展国际市场,在美国、中国等地建立了生产基地和销售网络。通过全球布局和本土化策略,Fair Rite为全球客户提供高品质、高性能的电子元器件。

中科银河芯(GXCAS)公司的发展小趣事
输入信号的电压范围决定了三极管何时截止、何时饱和导通。
Autotrol公司的发展小趣事

随着公司规模的不断扩大和市场份额的逐步提升,Autotrol公司开始实施全球化战略,积极拓展海外市场。公司在全球范围内建立了销售网络和分支机构,与当地合作伙伴共同开拓市场。同时,Autotrol还加大了对国际市场的研发投入,针对不同地区的市场需求推出定制化的产品和服务。通过全球化战略的实施,Autotrol公司的品牌影响力不断提升,市场地位也日益稳固。

请注意,以上故事仅为基于一般行业知识和公司概况编写的示例,并不代表Autotrol公司的实际历史。如需了解Autotrol公司在电子行业中的具体发展故事,建议查阅公司官方网站、行业报告或相关新闻报道等权威资料。

Festo公司的发展小趣事

1993年,Festo公司正式进入中国市场,成立了费斯托(中国)有限公司。进入中国后,Festo迅速抓住了中国改革开放的机遇,通过直销的销售理念和优质的服务赢得了客户的信任和支持。经过多年的努力,Festo在中国市场取得了长足的发展,成为了德国总部以外最大的子公司。同时,Festo还不断加大在中国的投资力度,建立了多个研发中心和生产基地,为中国客户提供更加优质的产品和服务。

Fillfactory Nv公司的发展小趣事

FIDELIX公司成立于1990年,是一家专注于存储芯片研发与销售的韩国企业。在公司成立初期,FIDELIX凭借对技术的深入研究和对市场的敏锐洞察,成功推出了多款性能优越的NAND FLASH(闪存)和SDR/DDR(单/双数率同步动态存储器)等存储芯片产品。这些产品不仅在韩国市场上获得了良好的口碑,同时也开始逐步进入国际市场。

随着技术的不断进步和市场的不断扩大,FIDELIX逐渐在韩国存储芯片领域崭露头角。公司不断投入研发资金,加强技术创新,努力提升产品的性能和品质。同时,FIDELIX也积极拓展销售渠道,与多家国内外知名厂商建立了合作关系,为公司的持续发展奠定了坚实的基础。

问答坊 | AI 解惑

硬派越野车四驱系统详解(二)

基于分时四驱的这个问题,工程师开发出不用进行两驱四驱切换的四驱系统,这就是全时四驱。它解决的根本就是在前后转动轴之间加装了中央差速器。开放式差速器最主要的作用就是能够消除车轮之间的转速差,这个在汽车诞生后不久就有了的部件,在全时四 ...…

查看全部问答>

用AT89C51做的公交车自动报站系统软件部分

公交车自动报站系统是我的论文,主要是以硬件为主,但软件编程也要写一些,由于我们学校当年单片机是选修,我没学过,而且论文课题又是学校定的,所以我现在在编程这儿卡住了,急死了,我的论文基本已经搞好了,现在就剩软件编程了,希望各位高手们可以帮我编 ...…

查看全部问答>

几篇好文献

几篇很不错的文献撒…

查看全部问答>

系统移植时如何把nand flash 芯片加入到NAND FLASH驱动?

如题,目标板 s3c2410, 64M nand flash,  在建立NAND FLASH分区、建立nand flash芯片支持后,如何把这个芯片加入到内核的nand flash 驱动中?…

查看全部问答>

pda上gps数据获取程序

那位高手有pda上gps数据获取程序(从串口读取)?  …

查看全部问答>

windows ce下如何添加对USB蓝牙设备的支持

我有个USB的蓝牙设备,要在wince下使用。在Platform Builder里选择了: Bluetooth HID Device Support -Bluetooth HID - keyboard -Bluetooth HID - Mouse Bluetooth Profiles Support -Bluetooth DUN Gateway -Bluetooth HS/HF and Audio Ga ...…

查看全部问答>

基于TI C2000系列的变频洗衣机解决方案

在注重节能环保的今天,变频概念对一般大众已经不陌生。各种变频家电包括空调、冰箱、洗衣机等等已经大量上市,今天要向大家介绍一个来自WPG友尚的变频洗衣机解决方案。何为变频?传统的交流电机使用简单,应用广泛,但是有一个缺点是只能实现恒定 ...…

查看全部问答>

求TMS570LS0432单片机的最小系统原理图

我想自己设计一个以TMS570LS0432为核心的控制器,不知哪位大神有它的最小系统原理图,包括供电模块和程序下载模块。主要是程序下载模块,如果不用LaunchPad上的仿真器该怎么来设计?需要其他什么芯片?望各位指点,非常感谢! …

查看全部问答>