<wbr id="9qp22"><legend id="9qp22"><rt id="9qp22"></rt></legend></wbr>
<th id="9qp22"><noframes id="9qp22"><form id="9qp22"></form></noframes></th>

      <dd id="9qp22"><big id="9qp22"><video id="9qp22"></video></big></dd>
      <th id="9qp22"></th>
        <rp id="9qp22"><acronym id="9qp22"></acronym></rp>
        <dd id="9qp22"><pre id="9qp22"></pre></dd>

        1. <dd id="9qp22"><pre id="9qp22"></pre></dd>
          1. 打印

            [家電應用] 求教sh79f084 紅外遙控程序,軟件延時問題。

            [復制鏈接]
            595|5
            跳轉到指定樓層
            樓主
            求教sh79f084 紅外遙控程序,軟件延時問題。sh79f084我用內部16.6M的RC震蕩器做系統晶振,NEC的遙控器,軟件延時好像有問題,求教一下。

            sbit IRIN = P3^0;                           //紅外接收器位聲明        //p3.0--紅外串口接收


            unsigned char DisplayData[8];               //用來存放要顯示的8位數的值
            unsigned char IrValue[6];                   //用來存放讀取到的紅外值
            unsigned char Time;


            void IrInit();
            void DelayMs(unsigned int);
            void Delay1ms()        ;

            void Delay1ms()                //@16.6MHz
            {
                    unsigned char i, j;

                    i = 17;
                    j = 34;
                    do
                    {
                            while (--j);
                    } while (--i);
            }

            void DelayMs(unsigned int x)                 //
            {
                unsigned char i;
                while(x--)
                {
                    //for (i = 0; i<13; i++);
                            Delay1ms();
                }
            }


            void IrInit()
            {
                IT0=1;                                   //下降沿觸發
                EX0=1;                                   //打開中斷0允許
                IE0=0;                                    
                    EA=1;                                    //打開總中斷
                IRIN=1;                                  //初始化端口
            }


            void ReadIr() interrupt 0
            {
                unsigned char j,k;
                unsigned int err;
                Time=0;                  
                DelayMs(70);
                if(IRIN==0)                              //確認是否真的接收到正確的信號
                {   
                    err=1000;                            //1000*10us=10ms,超過說明接收到錯誤的信號
                    while((IRIN==0)&&(err>0))            //等待前面9ms的低電平過去        
                    {           
                        DelayMs(1);
                        err--;
                    }
                    if(IRIN==1)                          //如果正確等到9ms低電平
                    {
                        err=500;
                        while((IRIN==1)&&(err>0))        //等待4.5ms的起始高電平過去
                        {
                            DelayMs(1);
                            err--;
                        }
                        for(k=0;k<4;k++)                 //共有4組數據
                        {               
                            for(j=0;j<8;j++)             //接收一組數據
                            {
                                err=60;     
                                while((IRIN==0)&&(err>0))//等待信號前面的560us低電平過去
                                {
                                    DelayMs(1);
                                    err--;
                                }
                                err=500;
                                while((IRIN==1)&&(err>0))//計算高電平的時間長度。
                                {
                                    DelayMs(1);          //0.14ms
                                    Time++;
                                    err--;
                                    if(Time>30)
                                    {
                                        EX0=1;
                                        return;
                                    }
                                }
                                IrValue[k]>>=1;          //k表示第幾組數據
                                if(Time>=8)              //如果高電平出現大于565us,那么是1
                                {
                                    IrValue[k]|=0x80;
                                }
                                Time=0;                  //用完時間要重新賦值                           
                            }
                        }
                    }
                    if(IrValue[2]!=~IrValue[3])          //反碼取反后與原碼相同則說明信號接受正確
                    {
                        return;
                    }
                }           
            }


            使用特權

            評論回復
            沙發
             樓主 | 2019-9-22 20:36 | 只看該作者

            使用特權

            評論回復
            板凳
            | 2019-9-24 15:38 | 只看該作者
            有什么問題?

            使用特權

            評論回復
            地板
             樓主 | 2019-9-24 18:33 | 只看該作者

            軟件延時不準。這個怎么解決?

            使用特權

            評論回復
            5
            | 2019-9-28 21:27 | 只看該作者
            看不懂,中斷函數里有這么多延時函數,肯定是軟件架構錯誤。
            正確的方法是定時器中斷,對輸入的脈沖先濾波,然后判斷高低電平的時間,解碼起始標志和后續的數據。

            使用特權

            評論回復
            6
            | 2019-10-7 16:41 | 只看該作者
            laorenshen123 發表于 2019-9-24 18:33
            軟件延時不準。這個怎么解決?

            軟件延時只能根據你的晶振進行大約的計算,不能非常準確,想要精確延時就要用定時器。
            遙控解碼時,對于讀取某個電平,延時可以略大于該電平的時間,但不能過多,不然會影響到下一個電平的讀取

            使用特權

            評論回復
            掃描二維碼,隨時隨地手機跟帖
            您需要登錄后才可以回帖 登錄 | 注冊

            本版積分規則

            我要發帖 投訴建議 創建版塊 申請版主

            快速回復

            您需要登錄后才可以回帖
            登錄 | 注冊
            高級模式

            論壇熱帖

            在線客服 快速回復 返回頂部 返回列表
            成人短片线上看