新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 紅外解碼程序(用1602顯示碼值)

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

        作者: 時間:2016-12-02 來源:網絡 收藏

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

        void irpros()//紅外提取處理程序
        {
        uchar i,k,j,irvalue;
        k=1;//第一k=0是引導碼,不須要。所以從K=1開始提取編碼,把K=0的引導碼去掉
        for(j=0;j<4;j++)//共有四個碼,所以循環四次
        {
        for(i=0;i<8;i++)//每個碼八位,循環八次
        {
        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就要處理.把數據從irdata中提出來
        irreceok=0;//要把irreceok清0,為下一次接收做準備
        }
        if(irprosok)
        {
        irwork();//如果處理OK,把數據分離,可以去顯示
        irprosok=0;//要把irprosok清0,為下一次處理做準備
        }
        display();//顯示函數還沒寫,有待完善

        }

        }

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

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

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


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 泰宁县| 津南区| 米易县| 科技| 敦化市| 宝清县| 丹凤县| 靖西县| 循化| 龙井市| 晴隆县| 城固县| 丰镇市| 栾川县| 南阳市| 鹰潭市| 衡南县| 灌阳县| 上饶市| 平阳县| 香河县| 伊宁县| 文昌市| 邵武市| 盘锦市| 天等县| 启东市| 玛曲县| 凭祥市| 巴林左旗| 天水市| 大丰市| 萨迦县| 兴化市| 县级市| 麻栗坡县| 张家港市| 咸丰县| 太白县| 班戈县| 商洛市|