中文字幕 另类精品,亚洲欧美一区二区蜜桃,日本在线精品视频免费,孩交精品乱子片免费

<sup id="3hn2b"></sup>

    1. <sub id="3hn2b"><ol id="3hn2b"></ol></sub><legend id="3hn2b"></legend>

      1. <xmp id="3hn2b"></xmp>

      2. 新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于8952單片機(jī)的紅外解碼(TC9012F編碼)

        基于8952單片機(jī)的紅外解碼(TC9012F編碼)

        作者: 時(shí)間:2016-11-28 來源:網(wǎng)絡(luò) 收藏

        irpro_ok=0;//處理完成標(biāo)志清零

        }


        void ircordpro(void)//紅外碼值處理函數(shù)
        {
        unsigned char i, j, k;
        unsigned char cord,value;

        k=1;//從1開始,是引導(dǎo)碼以后的一幀所有數(shù)據(jù)
        for(i=0;i<4;i++)//處理4個(gè)字節(jié)
        {
        for(j=0;j<8;j++) //處理1個(gè)字節(jié)8位
        {
        cord=irdata[k];
        if(cord>7)//電平寬度大于某個(gè)值,可以判斷為1(2.25ms) 時(shí)間范圍要大點(diǎn),否則重復(fù)按鍵出現(xiàn)混亂
        {
        value|=0x80;//若為1則賦值
        }
        //其余情況可以判斷為0(是不是證明了,irdata接收的是引導(dǎo)碼之后的一幀所有電平?)
        else
        {
        value=value;//若判斷為0則不變(移位后自然為0)
        }
        if(j<7)
        {
        value>>=1;//為什么|0X01 與<<1配合,不行。因?yàn)樽詈笸瓿芍狄笞钕葘懭氲淖畹臀唬眠@個(gè)想法會(huì)反過來。
        }
        k++;
        }
        ircord[i]=value;
        value=0;
        } irpro_ok=1;//處理完畢標(biāo)志位置1

        }

        /////////////////////////////////////////////////////////////////

        void main(void)
        {
        EX0init(); // 初始化中斷

        TIM0init();//初始化定時(shí)器0
        while(1)//主循環(huán)
        {
        if(irok)
        {
        ircordpro();//碼值處理
        irok=0;
        }

        if(irpro_ok)//step press key
        {
        ir_work();//碼值識別散轉(zhuǎn)
        }
        }
        }
        程序基礎(chǔ)來自已有程序,在看完下面的說明后,就可以移植了,畢竟同一個(gè)解碼標(biāo)準(zhǔn),都是大同小異,甚至就算不同解碼標(biāo)準(zhǔn)也僅僅是判斷編碼的時(shí)間要求上長短不同。但為什么這是經(jīng)過我自己消化的呢,這里有個(gè)非常有趣的問題。

        在我單獨(dú)實(shí)驗(yàn)紅外模塊的時(shí)候(也就是上面的源程序),能夠正常運(yùn)行。但是移植入開啟了T2中斷的大程序里之后,紅外部分一點(diǎn)反應(yīng)也沒有。在接下來的調(diào)試過程中,因?yàn)椴粫?huì)使用DEBUG進(jìn)入外部中斷,在不斷地比對程序中浪費(fèi)了許多時(shí)間。當(dāng)我使用LED調(diào)試法時(shí)(把P1=0x55;插入任意想要檢驗(yàn)的程序行,亮了就證明程序走到了這里),亮與不亮在這里分界了(紅色標(biāo)記):

        void ex0_isr (void) interrupt 0 using 0//外部中斷0服務(wù)函數(shù)
        {
        unsigned char i;
        bit startflag;

        if(startflag)
        {
        TR0=0;
        if(irtime<38&&irtime>=34)

        i=0;
        TR0=1;
        irdata[i]=irtime;

        irtime=0;
        i++;
        if(i==33)
        {
        irok=1;
        i=0;
        }

        }

        恰好最近有重溫static定義變量的特點(diǎn),不然可能死得不明不白。因?yàn)楸е鴨为?dú)運(yùn)行正常,移植整合之后也正常的想法,源程序的static unsigned char i;被我改為了uchar i;(我在自己程序里已做#define uchar unsigned char)。

        答案清楚了:因?yàn)槲也辉试S任何配角程序打擾T2時(shí)鐘工作,所以設(shè)置了最高優(yōu)先級(PT2=1;),這樣每次外部中斷0里面局部變量i的累加會(huì)被打斷,如果不能保值,就每次都被撤銷和重新構(gòu)建,或許永遠(yuǎn)達(dá)不到(i==33)要求。static按我的理解,最大的作用就是能夠保持上一次的值,至于其他作用印象就不大深刻了。

        哈哈,有意思,記住 中斷里的局部變量定義 unsigned char i;要改為static unsigned char i;


        上一頁 1 2 下一頁

        評論


        技術(shù)專區(qū)

        關(guān)閉