實(shí)驗(yàn)十二-紅外遙控接受編程實(shí)驗(yàn)

以下為關(guān)鍵代碼解釋

int
main(void)
{

    SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ |SYSCTL_OSC_MAIN | SYSCTL_USE_PLL |SYSCTL_CFG_VCO_480), 50000000);
    GPIOIntInitial();
    GPIOInitial();
    IntMasterEnable();
    while(1)
    {
        if((GPIOPinRead(GPIO_PORTN_BASE,GPIO_PIN_4)&0x10)==0x00)//PN4 IR_RECEIVER
        {
            SysCtlDelay(2*50000000/3000);
            if((GPIOPinRead(GPIO_PORTN_BASE,GPIO_PIN_4)&0x10)==0x00)
                IntEnable(INT_GPION);
        }
    }
}

初始化系統(tǒng)時(shí)鐘,初始化相應(yīng)的GPIO口和中斷兔朦。
如果有低電平(PN4為0偷线,PN4即IR_RECEIVER),按鍵消抖沽甥,延時(shí)再判斷声邦。使能中斷GPION,即進(jìn)入GPION()中斷服務(wù)程序摆舟。

中斷服務(wù)程序

        if((GPIOPinRead(GPIO_PORTN_BASE,GPIO_PIN_4)&0x10)==0x00)
        {
            LowTime = 1;
            while((GPIOPinRead(GPIO_PORTN_BASE,GPIO_PIN_4)&0x10)==0x00)
            {

            }
        }
        else
            LowTime = 0;

        SysCtlDelay(3*50000000/3000);
        if((GPIOPinRead(GPIO_PORTN_BASE,GPIO_PIN_4)&0x10)==0x10)
        {
            HighTime = 1;
            while((GPIOPinRead(GPIO_PORTN_BASE,GPIO_PIN_4)&0x10)==0x10)
            {

                if(count>0x200000)
                {
                    count=0;
                    //return 0;
                }
            }
        }
        else
            HighTime = 0;

先判斷PN4為低電平亥曹,LowTime置1;再判斷PN4為高電平恨诱,HighTime置1媳瞪。這需要了解到紅外傳感器的原理,書中寫到:

開始時(shí)會(huì)發(fā)射一個(gè)同步碼頭照宝,對(duì)于接收端就是一個(gè)9ms的低電平蛇受,和一個(gè)4.5ms的高電平,這個(gè)同步碼頭告訴程序從這以后開始接受數(shù)據(jù)厕鹃。

        if((HighTime==1)&&(LowTime==1))
                {
                    if(getdata()==1)
                    {

                        IrOutput();
                    }
                    else
                    {

                            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 , 0x02);//PF1,LED0
                            SysCtlDelay(500*(50000000/3000));//2
                           // for(i=0;i<1000;i++){;}

                           GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 , 0x00);
                            SysCtlDelay(500*(50000000/3000));//2

                    }
                }
        else
        {
            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 , 0x02);
            SysCtlDelay(500*(50000000/3000));
            GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_1 , 0x00);
            SysCtlDelay(500*(50000000/3000));
        }

如果HighTime和LowTime都為1兢仰,也就是接收到同步碼頭
那么開始解碼即執(zhí)行g(shù)etdata()函數(shù),
如果熊响,解碼正確返回1,才執(zhí)行IrOutput()輸出相應(yīng)的操作
否則诗赌,解碼不正確汗茄,顯示錯(cuò)誤信息,通過GPIOPinWrite()函數(shù)铭若,置PF1=1然后置0洪碳,也就是對(duì)應(yīng)的LED0燈亮一會(huì)
如果HighTime和LowTime不都為1,未接受到同步碼頭叼屠,也顯示錯(cuò)誤信息瞳腌,LED0亮一會(huì)

紅外解碼bool getdata()

        for(i=0;i<4;i++)
        {
            for(j=0;j<8;j++)
            {
                temp = temp>>1;
                while((GPIOPinRead(GPIO_PORTN_BASE,GPIO_PIN_4)&0x10)==0x00)
                {
                }

                SysCtlDelay(7*50000000/30000);

                if((GPIOPinRead(GPIO_PORTN_BASE,GPIO_PIN_4)&0x10)==0x10)
                {
                    temp = temp|0x80;
                    while((GPIOPinRead(GPIO_PORTN_BASE,GPIO_PIN_4)&0x10)==0x10)
                    {
                        count++;
                        if(count>0x200000)
                        {
                            count=0;
                            return 0;
                        }
                    }
                }
                else
                {
                    temp = temp&0x7f;
                }

            }
            IrData[i] = temp;
        }

外層for循環(huán)4次,給IrData賦值镜雨。需要了解紅外傳感器原理嫂侍,書中寫著:

發(fā)射器按鍵按下后,將發(fā)射一組108ms的編碼脈沖荚坞。遙控編碼脈沖由前導(dǎo)碼(同步碼頭)挑宠,16位地址碼(8位地址碼,8位地址碼的反碼)颓影,16位操作碼(8位操作碼各淀,8位操作碼的反碼)組成。

也就是IrData數(shù)組中四個(gè)數(shù)據(jù)是诡挂,地址碼碎浇,地址碼反碼临谱,操作碼,操作碼反碼奴璃;而前導(dǎo)碼已經(jīng)前面識(shí)別過了悉默,使LowTimeHighTime為1。

內(nèi)層for循環(huán)8次溺健,
如果PN4==1高電平麦牺,那么temp = temp|0x80把第一位置1其他位不變
否則PN4==0低電平,那么temp = temp&0x7f把第一位置0其他為不變
通過這種按位與按位或的操作賦值給temp鞭缭,然后temp = temp>>1每次在開始temp右移一位剖膳,總共八次對(duì)temp八位賦值。

        IrAddressData = IrData[0]+IrData[1];//address and anti-address
        IrValueData = IrData[2]+IrData[3];//cao zuo ma
        if((IrAddressData==0xff)&&(IrValueData==0xff))//if is signal ,do it
            return 1;
        else
            return 0;

最后是對(duì)接收到數(shù)據(jù)的校驗(yàn)岭辣,IrData[0]+IrData[1]及 IrData[2]+IrData[3]相加吱晒,也就是對(duì)應(yīng)原碼反碼相加,結(jié)果應(yīng)該是0xff沦童,如果不是自然return 0報(bào)錯(cuò)仑濒。

IrOutput()解碼正確執(zhí)行相應(yīng)的操作

void IrOutput()
{
        switch(IrData[2])
        {

            case 12 : GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1|GPIO_PIN_0 , 0x02);
                     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0 , 0x01);
                     GPIOPinWrite(GPIO_PORTM_BASE, GPIO_PIN_5 , 0x20);
                     SysCtlDelay(500*(50000000/3000));
                     GPIOPinWrite(GPIO_PORTM_BASE, GPIO_PIN_5 , 0x00);
                     break;
            case 24 : GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1|GPIO_PIN_0 , 0x01);
                     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0 , 0x00);break;

            case 94 : GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1|GPIO_PIN_0 , 0x03);
                     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0 , 0x00);break;

            case 8 : GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1|GPIO_PIN_0 , 0x00);
                     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0 , 0x10);break;

            case 28 : GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1|GPIO_PIN_0 , 0x02);
                     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0 , 0x10);break;

            case 90 : GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1|GPIO_PIN_0 , 0x01);
                     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0 , 0x10);break;

            case 66 : GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1|GPIO_PIN_0 , 0x03);
                     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0 , 0x10);break;

            case 82 : GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1|GPIO_PIN_0 , 0x00);
                     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0 , 0x01);break;

            case 74 : GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1|GPIO_PIN_0 , 0x02);
                     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0 , 0x01);break;

            default: GPIOPinWrite(GPIO_PORTN_BASE, GPIO_PIN_1|GPIO_PIN_0 , 0x03);
                     GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_4|GPIO_PIN_0 , 0x11);
        }
}

其中,代碼中注釋著:
//紅外解碼輸出偷遗,數(shù)字0-9對(duì)應(yīng)的關(guān)系如下墩瞳,地址碼為0x00
/*address 0x00

  • 0->22
  • 1->12
  • 2->24
  • 3->94
  • 4->8
  • 5->28
  • 6->90
  • 7->66
  • 8->82
  • 9->74

再結(jié)合單片機(jī)的調(diào)試結(jié)果,我反向推導(dǎo)出各個(gè)Pin控制的外設(shè)PN0(D2),PN1(D1),PF0(D4+LCD),PF4(D3)
舉個(gè)例子氏豌,case 12 對(duì)應(yīng)數(shù)字1喉酌,也就是遙控器按1,然后對(duì)應(yīng)操作
PN1=1泵喘,PN0=0泪电,PF4=0,PF0=1纪铺;即D1和D3燈會(huì)亮(是兩個(gè)綠燈相速,不是之前流水燈實(shí)驗(yàn)用到的LED)等等。case12下面另外是我自己加的代碼鲜锚,就是PM5=1一會(huì)突诬,讓蜂鳴器叫一聲。也就是case 后面的代碼可以自己設(shè)計(jì)芜繁,但是別忘了相應(yīng)的GPIO等初始化攒霹。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市浆洗,隨后出現(xiàn)的幾起案子催束,更是在濱河造成了極大的恐慌,老刑警劉巖伏社,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件抠刺,死亡現(xiàn)場(chǎng)離奇詭異塔淤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)速妖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門高蜂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人罕容,你說我怎么就攤上這事备恤。” “怎么了锦秒?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵露泊,是天一觀的道長。 經(jīng)常有香客問我旅择,道長惭笑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任生真,我火速辦了婚禮沉噩,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘柱蟀。我一直安慰自己川蒙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布长已。 她就那樣靜靜地躺著畜眨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪痰哨。 梳的紋絲不亂的頭發(fā)上胶果,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天匾嘱,我揣著相機(jī)與錄音斤斧,去河邊找鬼。 笑死霎烙,一個(gè)胖子當(dāng)著我的面吹牛撬讽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悬垃,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼游昼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了尝蠕?” 一聲冷哼從身側(cè)響起烘豌,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎看彼,沒想到半個(gè)月后廊佩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體囚聚,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年标锄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了顽铸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡料皇,死狀恐怖谓松,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情践剂,我是刑警寧澤鬼譬,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站舷手,受9級(jí)特大地震影響拧簸,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜男窟,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一盆赤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歉眷,春花似錦牺六、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扇住,卻和暖如春春缕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背艘蹋。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國打工锄贼, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人女阀。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓宅荤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親浸策。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冯键,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容