日韩一区二区三区精品,欧美疯狂xxxxbbbb牲交,热99re久久免费视精品频,人妻互换 综合,欧美激情肉欲高潮视频

歷史上的今天

今天是:2025年01月29日(星期三)

2020年01月29日 | PIC單片機(jī)與AM2302溫濕度傳感器通信優(yōu)化

發(fā)布者:innovation2 來(lái)源: eefocus關(guān)鍵字:PIC單片機(jī)  AM2302  溫濕度傳感器  通信優(yōu)化 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

AM2302溫濕度傳感器采用單總線方式與MCU通信,這就要求MCU有一定的處理速度, 才能正確解析收到的AM2302發(fā)送過(guò)來(lái)的數(shù)據(jù)。


MCU處理AM2302數(shù)據(jù)的方式

AM2302一次傳送40位數(shù)據(jù)給MCU。數(shù)據(jù)位0由50微妙低電平加26微妙高電平組成。 

數(shù)據(jù)位1有50微妙低電平加70微妙高電平組成。這種編碼方式有點(diǎn)象NEC的紅外傳輸協(xié)議。


另外AM2302需要由MCU發(fā)起啟動(dòng)信號(hào)。所以針對(duì)這種單線協(xié)議,雖然可以采用電平變化中斷+計(jì)數(shù)器,或輸入捕捉來(lái)解析40位數(shù)據(jù)位。但這就需要切換端口的輸入輸出配置及控制相應(yīng)外設(shè)的介入時(shí)機(jī)。


本文介紹的方法采用簡(jiǎn)單的端口讀+延時(shí)操作來(lái)解析40位數(shù)據(jù)位。


    if (data_port == 1)

        delay_us(30);

    if (data_port == 1)

        //bit = 1

    else

        //bit = 0


起始信號(hào)通過(guò)把端口改為輸出,然后通過(guò)寫(xiě)端口+延時(shí)來(lái)實(shí)現(xiàn)。


    //改變data_port為輸出

    data_port = 0;

    delay_us(1000);

    data_port = 1;

    delay_us(20);

    //改變data_port為輸入


數(shù)據(jù)讀取函數(shù)實(shí)現(xiàn)

根據(jù)上述協(xié)議的描述,很容易抽象出如下函數(shù):


static unsigned char am2302_read_byte(void)

{

    unsigned char i = 0;

    unsigned char data = 0;


    for (i = 0; i < 8; i++)

    {

        //50us low

        while (0 == data_port)

        {

        }

        delay_us(40);

        if (0 == data_port)

        {

            continue;

        }

        else

        {

            data += (0x80U >> i);

            while (1 == data_port)

            {

            }

        }

    }

    return data;

}


通過(guò)調(diào)用am2302_read_byte() 5次,把40位數(shù)據(jù)讀取出來(lái)。


    humidity_hign = am2302_read_byte();

    humidity_low = am2302_read_byte();

    temperature_high = am2302_read_byte();

    temperature_low = am2302_read_byte();

    checksum = am2302_read_byte();


為什么上面的函數(shù)不能使用了

在某些應(yīng)用場(chǎng)景下,為了降低功耗,需要把MCU的工作頻率降到盡可能的低。 

如果在系統(tǒng)時(shí)鐘很低的情況,指令周期就成為需要考慮的關(guān)鍵因素。


這里拿PIC單片機(jī)舉例,如果系統(tǒng)時(shí)鐘為1M Hz,則它的指令周期為4微妙, 

(指令周期為系統(tǒng)時(shí)鐘的4倍)。 

這個(gè)時(shí)候如果使用上面提到的函數(shù)調(diào)用的方法,將無(wú)法得到正確的數(shù)據(jù)。 

因?yàn)榧由虾瘮?shù)調(diào)用的開(kāi)銷,當(dāng)am2302_read_byte()進(jìn)行電平判斷的時(shí)候, 

很可能已經(jīng)錯(cuò)過(guò)了起始電平,導(dǎo)致解析不正確。另外當(dāng)判斷是數(shù)據(jù)位1的時(shí)候,


    data += (0x80U >> i);

    while (1 == data_port)

    {

    }


理論上上面的操作要在40~50微妙的時(shí)間內(nèi)完成,大概是10~12個(gè)匯編指令。 

但目前上面的操作會(huì)轉(zhuǎn)換成很多匯編指令,耗費(fèi)過(guò)多的時(shí)間,導(dǎo)致后續(xù)數(shù)據(jù)位解析不正確。


解決方案

簡(jiǎn)單的方案,繼續(xù)使用上面的函數(shù),但需要在調(diào)用之前提高系統(tǒng)時(shí)鐘,縮短指令周期即可。 

但對(duì)功耗上有些許影響,但基本影響不會(huì)太大。這里比較要命的是你提高了系統(tǒng)之中,依賴 系統(tǒng)時(shí)鐘的外設(shè)都要重新設(shè)置,例如定時(shí)器。當(dāng)完成溫濕度的讀取,又要全部切換回來(lái)。


考驗(yàn)功力的方案,有沒(méi)有可能優(yōu)化上面的數(shù)據(jù)讀取函數(shù),減少生成的匯編指令,使它能夠 

在1 MHz的系統(tǒng)時(shí)鐘下,完成數(shù)據(jù)讀???

如何改進(jìn)利用空間換時(shí)間的思路,取消函數(shù)調(diào)用,把里面的邏輯展開(kāi)。這里可以利用宏函數(shù)實(shí)現(xiàn)。


#define am2302_read_byte(data) 

                am2302_read_bit(data)

                am2302_read_bit(data)

                am2302_read_bit(data)

                am2302_read_bit(data)

                am2302_read_bit(data)

                am2302_read_bit(data)

                am2302_read_bit(data)

                am2302_read_bit(data)


優(yōu)化數(shù)據(jù)位1的實(shí)現(xiàn)邏輯,把移位操作轉(zhuǎn)換成定值的賦值操作。

#define am2302_read_byte(data) 

                am2302_read_bit(data, 0x80)

                am2302_read_bit(data, 0x40)

                am2302_read_bit(data, 0x20)

                am2302_read_bit(data, 0x10)

                am2302_read_bit(data, 0x08)

                am2302_read_bit(data, 0x04)

                am2302_read_bit(data, 0x02)

                am2302_read_bit(data, 0x01)


#define am2302_read_bit(data, bitmask)   

                    while (0 == am2302_data_PORT)

                    {

                    }

                    __delay_us(26);

                    if (1 == am2302_data_PORT)

                    {

                        NOP();

                        NOP();

                        if (1 == am2302_data_PORT)

                        {

                            data += bitmask;

                            while (1 == am2302_data_PORT)

                            {

                            }

                        }

                    }


但在實(shí)際的調(diào)試過(guò)程中,發(fā)現(xiàn)有時(shí)候還是無(wú)法完整的解析數(shù)據(jù)。特別是當(dāng)數(shù)據(jù)位1特別多的 時(shí)候,往往不能夠正確解析。這時(shí)候就需要仔細(xì)的分析數(shù)據(jù)位1的生成匯編代碼。

    movlb   0   ; select bank0

    btfss   12,0    ;volatile //對(duì)I/O進(jìn)行判斷,相當(dāng)于if (1 == am2302_data_PORT)

    goto    l435    //I/O不是1,跳轉(zhuǎn)到下一個(gè)數(shù)據(jù)位判斷邏輯

    movlw   128     //I/O是1,對(duì)數(shù)據(jù)進(jìn)行加1操作,這里使用了兩條指令

    addwf   _g_th,f

l435:   


使用|=替換+=,把兩條指令的加1操作變成一條指令。

    if (1 == am2302_data_PORT)

    {

        data |= bitmask;

        while (1 == am2302_data_PORT)

        {

        }

    }


它生成的匯編代碼變成:


    movlb   0   ; select bank0

    btfss   12,0    ;volatile

    goto    l435

    bsf _g_th,7

l435:


結(jié)束

使用上述方案,可以使PIC單片機(jī)在1 MHz的系統(tǒng)時(shí)鐘下,與AM2302進(jìn)行單線通信。

關(guān)鍵字:PIC單片機(jī)  AM2302  溫濕度傳感器  通信優(yōu)化 引用地址:PIC單片機(jī)與AM2302溫濕度傳感器通信優(yōu)化

上一篇:使用PIC單片機(jī)連接旋轉(zhuǎn)編碼器的方法
下一篇:單片機(jī)按鍵掃描程序和顯示程序及延時(shí)程序解析

推薦閱讀

電子網(wǎng)消息(文/羅明)在千元機(jī)上玩王者榮耀與NBA2K17等大型游戲,是什么樣的感受了?卡頓、掉禎各種坑,究其原因在于手機(jī)處理器性能偏弱,A53的小核心應(yīng)對(duì)它們有壓力。但是如果用上A73大核心呢?!此前聯(lián)發(fā)科決定今年要重點(diǎn)發(fā)展中低端,因此對(duì)外公布了兩款處理器,一款是P40,另一款是P70,它們都用上了A73大核心。由于定位中低端的關(guān)系,所以今年紅米、魅藍(lán)...
據(jù)“外交部發(fā)言人辦公室”公眾號(hào)消息,近期,沃達(dá)豐宣布其在歐洲的核心網(wǎng)絡(luò)已暫停使用華為設(shè)備。對(duì)此,外交部發(fā)言人耿爽28日表示,中方希望有關(guān)國(guó)家能為中國(guó)企業(yè)在當(dāng)?shù)氐恼=?jīng)營(yíng),包括與當(dāng)?shù)毓镜恼:献魈峁┕?、公正、可預(yù)期的環(huán)境。在1月28日外交部例行記者會(huì)上,有記者問(wèn):英國(guó)電信企業(yè)沃達(dá)豐上周五宣布,因各方在華為問(wèn)題上眾說(shuō)紛紜,其在歐洲的...
繼電保護(hù)測(cè)試儀是在參照電力部頒發(fā)的《微機(jī)型繼電保護(hù)試驗(yàn)裝置技術(shù)條件(討論稿)》的基礎(chǔ)上,廣泛聽(tīng)取用戶意見(jiàn),總結(jié)目前國(guó)內(nèi)同類產(chǎn)品優(yōu)缺點(diǎn),充分使用現(xiàn)代先進(jìn)的微電子技術(shù)和器件實(shí)現(xiàn)的一種新型小型化微機(jī)繼電保護(hù)測(cè)試儀。它采用單機(jī)獨(dú)立運(yùn)行,亦可聯(lián)接筆記本電腦運(yùn)行的先進(jìn)結(jié)構(gòu)。主機(jī)內(nèi)置新一代高速數(shù)字信號(hào)處理器微機(jī)、真16位DAC模塊、新型模塊式高保...
1. 做個(gè)最小系統(tǒng)板:如果你從沒(méi)有做過(guò)ARM的開(kāi)發(fā),建議你一開(kāi)始不要貪大求全,把所有的應(yīng)用都做好,因?yàn)锳RM的啟動(dòng)方式和dsp或單片機(jī)有所不同,往往會(huì)遇到各種問(wèn)題,所以建議先布一個(gè)僅有Flash,SRAM或SDRAM、CPU、JTAG、和復(fù)位信號(hào)的小系統(tǒng)板,留出擴(kuò)展接口。使最小系統(tǒng)能夠正常運(yùn)行,你的任務(wù)就完成了一半,好在ARM的外圍接口基本都是標(biāo)準(zhǔn)接口,如果你已...

史海拾趣

問(wèn)答坊 | AI 解惑

arm學(xué)習(xí)報(bào)告一二三 非常經(jīng)典!!

網(wǎng)上廣為流傳的ARM學(xué)習(xí)資料, 作者功務(wù)深厚, 精神可佳, 是學(xué)習(xí)ARM開(kāi)發(fā)的上好資料, 其中包括"ARM學(xué)習(xí)報(bào)告003——Bios源碼分析.pdf","BootLoader源代碼級(jí)分析第一部分-GNU之映象機(jī)理.pdf","ARM映象文件及執(zhí)行機(jī)理.rar"三部分組成. ...…

查看全部問(wèn)答∨

請(qǐng)教BiCMOS反相器的理解問(wèn)題

請(qǐng)教BiCMOS反相器的理解問(wèn)題,以前貌似有人問(wèn)過(guò),但還是沒(méi)弄明白 如下圖,當(dāng)輸入Vi為H,前級(jí)反相器的輸出(即T1管的基極)為L(zhǎng),此時(shí)T1管就截止了,相當(dāng)于斷開(kāi) 同時(shí)N3管的柵極也為L(zhǎng),N3也是截止的,N2的柵極是原始輸入信號(hào)為H,N2可以導(dǎo)通,但是T2 ...…

查看全部問(wèn)答∨

電子元件模特秀第三場(chǎng)

愛(ài)因迪生:咦,又上來(lái)一位和色環(huán)電阻長(zhǎng)得很像的元件。是誰(shuí)呢?不過(guò)她長(zhǎng)得很碩壯。為了再次出錯(cuò),我還是先驗(yàn)證一下是不是電阻再說(shuō)。 愛(ài)因迪生拿了個(gè)萬(wàn)用表在手上,來(lái)到舞臺(tái)上。 愛(ài)因迪生:千萬(wàn)別告訴我你是什么元件。我要自己猜猜。來(lái)來(lái)來(lái),讓我量 ...…

查看全部問(wèn)答∨

三菱 西門子 歐姆龍 3種PLC的使用心得征集

為了使大家對(duì)使用中或者使用過(guò)的PLC能有個(gè)總結(jié),特征集討論三菱、西門子、歐姆龍最常用的3種PLC的使用心得。我本人用過(guò)最多的是三菱的FX、FX1N、FX2N系列PLC,感覺(jué)編寫(xiě)程序容易,初學(xué)上手快,組網(wǎng)簡(jiǎn)單,故障率低。希望大家也說(shuō)說(shuō)自己的工程和維修心 ...…

查看全部問(wèn)答∨

autocorrelation(自相關(guān))function 應(yīng)該怎么用呢?

各位前輩,我是才剛剛開(kāi)始接觸DSP(digital sound processing)的學(xué)生,現(xiàn)在要用autocorrelation funtion 找出一個(gè)periodic signal 的周期,但是實(shí)在是不知道autocorrelation function 應(yīng)該怎么用~~~比方說(shuō)我得到一個(gè)sinusoidal signal(有噪音) ...…

查看全部問(wèn)答∨

不會(huì)做啊!

一條C程序?qū)崿F(xiàn)以下3種功能: 1、按一下LED全亮,再按一下半亮,按第三下LED滅; 2、按住3秒,LED閃爍(500ms關(guān),100ms開(kāi)),再按LED滅; 3、快速按3下,不斷循環(huán):LED顯示方波為:開(kāi)80ms,關(guān)500ms,(開(kāi)50ms,關(guān)100ms,做5次),關(guān)500ms。   ...…

查看全部問(wèn)答∨

ti mcu樣品好難買--MSP430G2333尋樣記

       經(jīng)過(guò)了前期的反復(fù)討論,決定使用MSP430G2333這個(gè)MCU去做一個(gè)新的產(chǎn)品,主要是應(yīng)用到觸摸,10位AD,另外因需要的IO口也比較多的原因,決定用32個(gè)腳的QFN,于是一大早,就興沖沖的跑到華強(qiáng)/賽格去找樣。在來(lái)之 ...…

查看全部問(wèn)答∨

關(guān)于ISE的timing summary

Timing Summary: --------------- Speed Grade: -2    Minimum period: 7.205ns (Maximum Frequency: 138.793MHz)    Minimum input arrival time before clock: 6.429ns    Maximum output required time afte ...…

查看全部問(wèn)答∨

關(guān)于MDK460!!!大師指點(diǎn)下啊。。。

今天將MDK423升級(jí)到了MDK460,發(fā)現(xiàn)原來(lái)在MDK423下編譯成功的工程,用MDK460打開(kāi)編譯,會(huì)報(bào)N多錯(cuò)誤,怎么解決啊???例如: ..\\lib\\stm32f10x_systick.c(50): error:  #20: identifier \"SysTick\" is undefined; ..\\lib\\stm32f10 ...…

查看全部問(wèn)答∨
小廣播
設(shè)計(jì)資源 培訓(xùn) 開(kāi)發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開(kāi)發(fā)圈

 
機(jī)器人開(kāi)發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved