久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3874|回復(fù): 8
收起左側(cè)

STC15系列單片機(jī)ADC函數(shù)庫(kù)的20200208優(yōu)化版

  [復(fù)制鏈接]
ID:691723 發(fā)表于 2020-2-10 15:49 | 顯示全部樓層 |閱讀模式
參考:STC官網(wǎng)函數(shù)庫(kù)
優(yōu)點(diǎn):初始化P1任何端口后,main函數(shù)只需要循環(huán)調(diào)用ADC_Convert()函數(shù)即可循環(huán)完成所有配置的ADC端口模擬量采集。ADC轉(zhuǎn)換結(jié)果放置在Dpj_ZongCunChu[]數(shù)組中,用于其他功能取用。
目的:免費(fèi)共享,互相提升。
先在ADC.c文件中寫(xiě)入以下內(nèi)容:
#define _ADC_C_                //預(yù)定義名稱用于ADC.h中

#include        "all.h"                //頭文件
#if ADC_EN                        //ADC_EN已在ADC.h中預(yù)定義

//========================================================================
// 函數(shù): ADC初始化
// 描述:
// 參數(shù): ADCx: 結(jié)構(gòu)參數(shù),請(qǐng)參考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轉(zhuǎn)換器速度
        if(ADCx->ADC_Power == ENABLE)        ADC_CONTR |= ADC_POWER;                //打開(kāi)ADC轉(zhuǎn)換器電源
        else                                                        ADC_CONTR &= ~ADC_POWER;        //關(guān)閉ADC轉(zhuǎn)換器電源
        if(ADCx->ADC_AdjResult == ADC_RES_H2L8)        PCON2 |=  (1<<5);        //10位AD結(jié)果的高2位放ADC_RES的低2位,低8位在ADC_RESL。
        else                                                                        PCON2 &= ~(1<<5);        //10位AD結(jié)果的高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;                                //優(yōu)先級(jí)設(shè)置        PolityHigh,PolityLow
        else                                                                PADC = 0;
}


//========================================================================
// 函數(shù): ADC中斷函數(shù)
// 描述:
// 參數(shù): none.
// 返回: none.
// 版本: V1.0, 2012-10-22
//========================================================================
void ADC_int (void) interrupt ADC_VECTOR
{
        u8 i=0; u16 t=0;
        ADC_CONTR &= ~ADC_FLAG;                //清除中斷標(biāo)志位
        i=ADC_CONTR&0x07;                        //取當(dāng)前ADC轉(zhuǎn)換的端口
        if(PCON2 & bit_5)                        //高2低8(提取ADC轉(zhuǎn)換結(jié)果)
        {        t=ADC_RES & 3;
                t=(t<<8) + ADC_RESL;
        }else                                                //高8低2(提取ADC轉(zhuǎn)換結(jié)果)
        {        t=ADC_RES;
                t=(t<<2) + (ADC_RESL&3);
        }
        t=(u32)t*500/1024;        //默認(rèn)電源電壓5V,檢測(cè)電壓乘100倍,保留2個(gè)小數(shù)點(diǎn)數(shù)字
        //ADC各端口轉(zhuǎn)換結(jié)果存儲(chǔ)到單片機(jī)總存儲(chǔ)空間
        Dpj_ZongCunChu[Dpj_AdcCunChuAddr+i*2]=t;
        Dpj_ZongCunChu[Dpj_AdcCunChuAddr+i*2+1]=t>>8;
}
/***************************************
ADC轉(zhuǎn)換函數(shù)
說(shuō)明:當(dāng)前ADC端口轉(zhuǎn)換完成時(shí),循環(huán)切換下一個(gè)端口轉(zhuǎn)換        
輸入:        無(wú)
返回值:0---當(dāng)前ADC通道未轉(zhuǎn)換完成
                1---ADC通道切換成功
                2---錯(cuò)誤,無(wú)端口ADC轉(zhuǎn)換
***************************************/
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;        //提取當(dāng)前ADC轉(zhuǎn)換通道號(hào)
                if((++i)>=8)i=0;        //判斷指向下一通道越界,從新從0通道查詢
                j=8+i;
                for(;i<j;i++)                //輪流查詢8個(gè)ADC通道允許狀態(tài)
                {        if(i<8)        k=i;
                        else        k=i-8;
                        if(P1ASF&(1<<k))//判斷bit.k位被設(shè)置為ADC轉(zhuǎn)換端口
                        {        ADC_CONTR&=~0x07;                //清除ADC通道端口
                                ADC_CONTR=ADC_CONTR|k;        //配置下一個(gè)允許ADC轉(zhuǎn)換的通道
                                ADC_CONTR|=ADC_START;        //啟動(dòng)ADC轉(zhuǎn)換
                                return 1;
                        }
                }
        }
        return 0;
}
#endif

以下為ADC.h文件內(nèi)容:

#ifndef        __ADC_H
#define        __ADC_H

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

//宏定義延時(shí)文件是否編譯;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        //模數(shù)轉(zhuǎn)換結(jié)束標(biāo)志,軟件清0
#define ADC_START        0x08        //自動(dòng)清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;                        //設(shè)置要做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功率允許/關(guān)閉        ENABLE,DISABLE
        u8        ADC_AdjResult;        //ADC結(jié)果調(diào)整,        ADC_RES_H2L8,ADC_RES_H8L2
        u8        ADC_Polity;                //優(yōu)先級(jí)設(shè)置        PolityHigh,PolityLow
        u8        ADC_Interrupt;        //中斷允許                ENABLE,DISABLE
} ADC_InitTypeDef;

ADC_EXT void        ADC_Inilize(ADC_InitTypeDef *ADCx);        //ADC初始化函數(shù)
ADC_EXT u8                ADC_Convert();                                                //啟動(dòng)ADC轉(zhuǎn)換函數(shù)

#endif

#endif
注意:使用ADC函數(shù)庫(kù)時(shí),應(yīng)先初始化ADC(ADC_Inilize(ADC_InitTypeDef *ADCx)),再循環(huán)調(diào)用順序轉(zhuǎn)換(ADC_Convert())。
若有疑問(wèn),可聯(lián)系我。

評(píng)分

參與人數(shù) 2黑幣 +58 收起 理由
楊雪飛 + 8 共享資料的黑幣獎(jiǎng)勵(lì)!
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:691723 發(fā)表于 2020-2-10 21:01 | 顯示全部樓層
我的程序是以中斷方式查詢ADC轉(zhuǎn)換結(jié)果,極大簡(jiǎn)化程序復(fù)雜度,提高運(yùn)行效率,同時(shí)并不影響其它程序功能模塊的運(yùn)行。
回復(fù)

使用道具 舉報(bào)

ID:691723 發(fā)表于 2020-2-10 21:03 | 顯示全部樓層
注意,使用本程序時(shí),在ADC初始化前必須打開(kāi)總中斷。
回復(fù)

使用道具 舉報(bào)

ID:98880 發(fā)表于 2020-2-11 11:25 | 顯示全部樓層
謝謝了,我回去測(cè)試一下。
回復(fù)

使用道具 舉報(bào)

ID:64765 發(fā)表于 2020-3-29 19:46 | 顯示全部樓層
很好,學(xué)習(xí)了,謝謝分享。
回復(fù)

使用道具 舉報(bào)

ID:214276 發(fā)表于 2020-3-30 02:09 | 顯示全部樓層
如果能配上12864顯示屏或數(shù)碼管做個(gè)數(shù)字電壓表那就更好讓人理解和應(yīng)用了。
回復(fù)

使用道具 舉報(bào)

ID:27254 發(fā)表于 2020-3-30 08:22 | 顯示全部樓層
謝謝發(fā)帖,使用自帶AD往往數(shù)值不穩(wěn)定,最好加上濾波就更完善了。
回復(fù)

使用道具 舉報(bào)

ID:65956 發(fā)表于 2020-3-30 08:32 | 顯示全部樓層
現(xiàn)在看到這個(gè)貼,才發(fā)現(xiàn)原來(lái)也有人跟我寫(xiě)的基本一樣,我也是作8路ADC采集,可根據(jù)需要指定哪一路進(jìn)行采集,同調(diào)用1個(gè)函數(shù)去進(jìn)行,節(jié)省程序空間
回復(fù)

使用道具 舉報(bào)

ID:215579 發(fā)表于 2020-3-31 09:21 | 顯示全部樓層
想法非常好,哈哈
STC應(yīng)該編寫(xiě)多一點(diǎn)函數(shù)庫(kù) 反正現(xiàn)在單片機(jī)的FLASH也夠用
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲精品一区二区三区在线 | 人人九九精 | 91视频免费黄 | 日韩二区三区 | 黄色成人在线观看 | 亚洲毛片一区二区 | 国产精品永久久久久久久www | 国产中文 | 国产精品久久久久久久久久 | 欧美日韩一卡 | 99re视频在线观看 | av天天看 | 九九久久精品 | 啪啪毛片| 鲁大师一区影视 | 人人干天天干 | 中文字幕在线一区 | 精品在线一区二区 | 亚洲网站在线观看 | 亚洲精品久久久久久久久久久久久 | 精品视频在线免费观看 | 国产视频一区二区 | 91在线一区 | 日韩 国产 在线 | 国产一级视频在线 | 欧美一级片在线 | 毛片软件| 欧美一区在线视频 | 91精品国产综合久久婷婷香蕉 | 91久久久久久久久 | 黄色在线免费播放 | 亚洲综合色站 | 亚洲一区免费视频 | 三级视频在线观看电影 | 久久6视频 | 国产精品久久久久av | 精品精品 | 国产午夜精品理论片a大结局 | 婷婷久久五月 | 日韩三级在线 | 国产第1页 |