新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 51單片機紅外接收解碼程序

        51單片機紅外接收解碼程序

        作者: 時間:2012-09-05 來源:網絡 收藏

        以S52作為系統。以S52的P3.3口作為端口,該端口是外部中斷1。

        本文引用地址:http://www.104case.com/article/170912.htm

        這個接受是以XC866作為發送控制系統,接收如下:

        #includereg52.h> //頭文件
        #includeintrins.h>

        #define uchar unsigned char //宏定義
        #define uint unsigned int

        sbit HWRx=P3^3; //位聲明

        code uchar Table[]= //共陰數碼管 0-9 a-f - 表
        {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
        0x77,0x7c,0x39,0x5e,0x79,0x71,0x40};

        uchar Table_Data[8]={0,0,0,0,0,0,0,0};//用于顯示的數組
        uchar Table_Rx[67];//用于存儲判斷接收是1或0的參數

        void Delay();//延時子函數

        void Display(uchar *lp,uchar lc)//顯示
        {
          uchar i; //定義變量
        P2=0; //端口2為輸出,關閉
        P1=P10xF8; //將P1口的前3位輸出0,對應138譯門輸入腳,

        全0為第一位數碼管
        for(i=0;ilc;i++) //循環顯示,采用動態掃描
        {
            P2=Table[lp[i]]; //查表法得到要顯示數字的數碼段
             if(lp[i]>0x7f)
            P2+=0x80;
            Delay(); //延時
            P2=0; //清0端口,準備顯示下位
            if(i==7) //檢測顯示完8位否,完成直接退出,不讓P1口再加1,

        否則進位影響到第四位數據
            break;
            P1++; //點亮下一位數碼管
        }
        }


        void main() //主函數
        {
        EA=1; //首先開啟總中斷
        EX1=1; //開啟外部中斷 1
        IT1=1; //設置成下降沿觸發方式

        while(1) //一直顯示,其它由中斷處理
        {
            Display(Table_Data,8);
        }

        }

        void Delay() //延時時間大約為31us,晶振12M
        {
        uchar i=13;
        while(i)
            i--;
        }

        void Delay_ms(uint z) //延時時間約為 1ms*X 晶振為12M
        {
        uint x=0,y=0;
        for(x=z;x>0;x--)
        for(y=54;y>0;y--);
        }
        void hongwai() interrupt 2 //外部中斷 1 ,INT1(P3^3)連接線接收IC數據腳
        {
        uchar i,j,tmp;
        EX1=0; //關閉中斷

        j=33; //傳送一組數包括引導碼1位,4個八位數據,總共33位
        i=0; //從第一維數組開始

        Delay_ms(10);
        if(HWRx)
        { //然后再檢測紅線接收腳是有數據招收,有繼續,沒有則退出
        EX1=1;
        return;
        }

        while(j--)
        { //循環接收33位數據,為何我們用到66位數組,我們可以不接收高電平

        時間常數,只接低電平常數就
        //可以判斷1或0了,在這里我們都接收,還有一點要知道,

        接收波形是反向,在沒有接收時端口為高電平
          tmp=0;
            Table_Rx[i]=1; //時間量從1開始
            while(!HWRx) //檢測高低電平的變化,這里檢測的是高電平
             {
             Table_Rx[i]++; //沒變繼續加1
             Delay(); //家一個延時防止,計數值一下子就加滿了
             tmp++; //加1
             if(tmp==250)
             break;
            }
            i++;

        tmp=0;
            Table_Rx[i]=1; //時間量從1開始
        while(HWRx) //檢測高低電平的變化,這里檢測的是低電平
            {
        Table_Rx[i]++; //沒變繼續加1
        Delay(); //同上
        tmp++; //加1,用于判斷是1還是0的,低電平來了
        if(tmp==250)
             break;
            }
        i++;
        }

        P1=0xf8;
        i=200; //加入循環延時,抗干擾
        while(i) //在有接收數據的時候顯示一個H
        {
            tmp=255;
            while(tmp)
            {
             tmp--;
             P2=0x76;
            }
            i--;
          }

        tmp=0;
        for(i=3;i19;i++,i++) //處理發送的數據
        {
        tmp>>=1; //右移一位,接收低位在前
            if(Table_Rx[i]>30) //檢測低電平時間超過30就確認為1
             tmp+=0x80;
        }
        Table_Data[0]=tmp/16; //分開2位以16進制顯示,用顯示發送的數據
        Table_Data[1]=tmp%16;

        tmp=0;
        for(i=19;i35;i++,i++) //同上
        {
        tmp>>=1;
            if(Table_Rx[i]>30)
             tmp+=0x80;
          }
        Table_Data[2]=tmp/16;
        Table_Data[3]=tmp%16;

        tmp=0;
        for(i=35;i51;i++,i++)
        {
            tmp>>=1;
            if(Table_Rx[i]>30)
             tmp+=0x80;
        }
        Table_Data[4]=tmp/16;
        Table_Data[5]=tmp%16;

        tmp=0;
        for(i=51;i67;i++,i++)
        {
            tmp>>=1;
        if(Table_Rx[i]>30)
        tmp+=0x80;
        }
        Table_Data[6]=tmp/16;
        Table_Data[7]=tmp%16;
        EX1=1; //剛進中斷時關閉了分控,現在要打開
        }

        51單片機相關文章:51單片機教程


        單片機相關文章:單片機教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理


        晶振相關文章:晶振原理


        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 彭阳县| 颍上县| 新宾| 皮山县| 南涧| 揭阳市| 哈密市| 泰和县| 余庆县| 东乌珠穆沁旗| 兰州市| 香港 | 水富县| 广元市| 玉树县| 山丹县| 定西市| 临夏市| 迭部县| 肇庆市| 马山县| 遂昌县| 黔西| 同心县| 德格县| 兴宁市| 靖宇县| 定兴县| 独山县| 华安县| 澄城县| 聊城市| 阿克苏市| 清远市| 论坛| 竹溪县| 广宁县| 松潘县| 乌什县| 西宁市| 白沙|