新聞中心

        EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 紅外解碼程序(用1602顯示碼值)

        紅外解碼程序(用1602顯示碼值)

        作者: 時間:2016-12-02 來源:網(wǎng)絡(luò) 收藏

        void int0init()//外部中斷O初始化,按P3。2
        {
        IT0=1;//設(shè)為下降沿觸發(fā)方式。IT0=0為低電平觸發(fā)。因為紅外輸入高時,接收為低,要從低開始計時
        EX0=1;//外部中斷打開
        EA=1;//總中斷打開
        }

        void irpros()//紅外提取處理程序
        {
        uchar i,k,j,irvalue;
        k=1;//第一k=0是引導(dǎo)碼,不須要。所以從K=1開始提取編碼,把K=0的引導(dǎo)碼去掉
        for(j=0;j<4;j++)//共有四個碼,所以循環(huán)四次
        {
        for(i=0;i<8;i++)//每個碼八位,循環(huán)八次
        {
        irvalue=irvalue>>1;//irvalue低位在前,高位在后,所以右移,判斷8次,右移7次
        if(irdata[k]>6)//如果兩個中斷的時間為1.125MS,說明傳的是0,1.125/0.255=4.4個irtime,
        //如果兩個中斷的時間為1.125MS,說明傳的是1,2.25/0.255=8.8個irtime,
        //我取中斷值6;如果irdata大于6,說明是1,小于6說明是0;
        {
        irvalue=irvalue|0x80;
        }
        k++;//每提一次,K自增一次,一共要33次
        }
        ircode[j]=irvalue;
        }
        irprosok=1;
        beep=0;
        delay(3);
        beep=1;
        }
        void irwork()
        {
        disp[0]=ircode[0]/16;//取高四位
        disp[1]=ircode[0]%16;//取低四位
        disp[2]=ircode[1]/16;//取高四位
        disp[3]=ircode[1]%16;//取低四位
        disp[4]=ircode[2]/16;//取高四位
        disp[5]=ircode[2]%16;//取低四位
        disp[6]=ircode[3]/16;//取高四位
        disp[7]=ircode[3]%16;//取低四位
        }
        void display()
        {
        write_com(0x80);
        write_dat(Tab[disp[0]]);
        write_dat(Tab[disp[1]]);
        write_dat(Tab[disp[2]]);
        write_dat(Tab[disp[3]]);
        write_dat(Tab[disp[4]]);
        write_dat(Tab[disp[5]]);
        write_dat(Tab[disp[6]]);
        write_dat(Tab[disp[7]]);
        }
        void main()
        {
        init_1602();
        timer0init();
        int0init();
        while(1)
        {
        if(irreceok)//判斷接收是否OK
        {
        irpros();//接收OK就要處理.把數(shù)據(jù)從irdata中提出來
        irreceok=0;//要把irreceok清0,為下一次接收做準(zhǔn)備
        }
        if(irprosok)
        {
        irwork();//如果處理OK,把數(shù)據(jù)分離,可以去顯示
        irprosok=0;//要把irprosok清0,為下一次處理做準(zhǔn)備
        }
        display();//顯示函數(shù)還沒寫,有待完善

        }

        }

        void timer0() interrupt 1//定時器0中斷函數(shù)
        {
        irtime++;/*irtime為字符型,最大為255,輸入開始時讀一次irtime
        然后清0,結(jié)束再讀一次,irtime乘以255就是一次掃描定時的時間*/
        }
        void int0() interrupt 0//外部中斷0函數(shù),這是關(guān)鍵
        {
        if(startflag)//如果startflag=1就開始接數(shù)據(jù)
        {
        if(irtime>30) //接收引導(dǎo)碼,引導(dǎo)碼有9MS,9/0.256=33.15,在這就取32即可
        //說明這時檢測到了引導(dǎo)碼
        {
        bitnum=0;//收到引導(dǎo)碼后,bitnum清O準(zhǔn)備裝數(shù)據(jù)
        }
        irdata[bitnum]=irtime;//第1個bitnum=0的數(shù)據(jù)被裝入數(shù)組。
        irtime=0;//清0就不會對下次有影響
        bitnum++; //不停地給數(shù)組加入新數(shù)據(jù)

        if(bitnum==33)//如果bitmun=33,說明一幀數(shù)據(jù)傳完
        {
        bitnum=0;//bitnum清0為接收下一幀做準(zhǔn)備
        irreceok=1;//主函數(shù)只要判斷irreceok是否為1做出后面的決定
        }

        }
        else //
        {
        startflag=1;
        irtime=0;
        }
        }


        上一頁 1 2 下一頁

        關(guān)鍵詞: 紅外解碼1602顯示碼

        評論


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

        關(guān)閉
        主站蜘蛛池模板: 武汉市| 通化县| 望江县| 嵊州市| 安陆市| 如东县| 蛟河市| 固阳县| 大竹县| 微山县| 资中县| 黔南| 安泽县| 焦作市| 恩施市| 隆回县| 醴陵市| 大英县| 炉霍县| 当阳市| 县级市| 积石山| 杂多县| 屏东县| 永靖县| 墨脱县| 伊川县| 红桥区| 龙门县| 武清区| 沅陵县| 双江| 东乡县| 且末县| 会泽县| 慈溪市| 沙坪坝区| 元氏县| 阿鲁科尔沁旗| 扎囊县| 寻甸|