久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5791|回復: 6
打印 上一主題 下一主題
收起左側

STC8單片機紅外中斷INT0多次進入以及無法回到主程序?

[復制鏈接]
跳轉到指定樓層
樓主
ID:342505 發表于 2019-1-5 17:58 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小弟最近在做項目的驅動設計時碰到關于外部中斷的一些問題想過來請教一下大神。
1.背景描述:使用INT0檢測紅外信號,測試程序包含了I2C、UART0、定時器0這些外設;
2.處理方法:在INT0中斷處理函數中先關閉EX0避免紅外信號多段下降沿的多次觸發,然后使用定時器結合對引腳高低電平的判斷進行電平計時從而實現解碼,解碼結束后再重新開啟EX0。
3.出現的問題:1、上述的方法還是無法避免多次進入中斷的情況,而且一個紅外信號時間內進入中斷次數沒有明顯規律;
                      2、如果本次紅外信號中斷僅進一次,還是可以回到主程序繼續執行,但是一旦連續進入大于等于兩次則無法返回主程序,也就是說PC所指向的地址已經不是主程序了,但是下次紅外信號還是可以被接收并觸發中斷的,只不過也回不到主程序而已。
4.下面我貼一下我的部分代碼,煩請各位大神指教
uint8 IrValue[4];//紅外信號緩存數組
uint8 IrFlag = 0;//接收并成功解碼紅外信號標志量
uint32 LowTime, HighTime;//存儲高、低電平的時間長度

…………………………
…………………………
…………………………
/*******************************************************************************
* 函數名         : IrDeCode
* 函數功能                 : 4字節紅外碼解碼函數
* 輸入           : void
* 輸出                  : bit,解碼正確返回1,否則返回0
*******************************************************************************/
bit IrDeCode(void)
{
        uint8 i,j;
        uint8 Temp;//存儲解碼出的數據

        for(i=0;i<4;i++)//識別4組數據,即4個字節數據
        {
                for(j=0;j<8;j++)//識別字節中的每一位
                {
                         Temp <<= 1;//因為先讀出的是高位數據,故每一次右移一位,保證8次后得到完整數據
                         
                         /*檢測每一位的0.56ms低電平*/
                         Timer0Enable();                //啟動定時器0
                         while(IRIN == 0);       //等每1位0.56ms低電平過去
                         TR0 = 0;                //暫時關閉定時器0
                         LowTime = TH0*256+TL0;  //保存低電平的時間

                         /*檢測每一位的后續高電平時間*/
                         Timer0Enable();                //啟動定時器0
                         while(IRIN == 1);       //等每1位后續的高電平過去
                         TR0 = 0;                //暫時關閉定時器0
                         HighTime = TH0*256+TL0;  //保存低電平的時間

                         /*判斷位1或位0*/
                        if((LowTime<531)||(LowTime>1531))//超出低電平范圍
                                return 0;
                        if((HighTime>732)&&(HighTime<1332))
                                Temp &= 0xfe;
                        if((HighTime>2615)&&(HighTime<3415))
                                Temp |= 0x01;
                }
                IrValue[i] = Temp;
        }

        /*校驗*/
        if(IrValue[2] != ~IrValue[3])
                return 0;//若校驗錯誤,則返回0

        return 1;//若通過校驗,則返回1
}

/*******************************************************************************
* 函數名         : IrIRQ
* 函數功能                 :外部中斷處理函數
* 輸入           : void
* 輸出                  : void
*******************************************************************************/
void IrIRQ(void) interrupt 0 using 0

    /*只進行一次的下降沿判斷,剩下的全在中斷中完成解碼*/
        EX0=0;      //關閉外中斷0,不再接收二次紅外信號的中斷,只解碼當前紅外信號
        /*低電平段檢測*/
        Timer0Enable();                //啟動定時器0
        while(IRIN == 0);       //等引導段9ms低電平過去
        TR0 = 0;                //暫時關閉定時器0
        LowTime = TH0*256+TL0;  //保存低電平的時間

        /*高電平段檢測*/
        Timer0Enable();                //啟動定時器0
        while(IRIN == 1);       //等引導段4.5ms高電平過去
        TR0 = 0;                //暫時關閉定時器0
        HighTime = TH0*256+TL0;  //保存高電平的時間
       
        if((LowTime>15580)&&(LowTime<17580)&&(HighTime>7290)&&(HighTime<9290))
        {
                IrFlag = IrDeCode();
        }
        UARTSendByte(0xDD);//通過串口判斷進入幾次中斷       

   EX0 = 1;//重新開啟INT0中斷


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:277550 發表于 2019-1-5 18:53 | 只看該作者
建議不在中斷函數內調用別的函數

~~~~~~~~~~~
回復

使用道具 舉報

板凳
ID:401564 發表于 2019-1-5 22:01 | 只看該作者
不要在當前中斷程序中關閉當前中斷,進入中斷本身就已經屏蔽了其它低等級中斷了,如果是本身的中斷被自身的中斷觸發中斷了,你可以進入中斷就關閉全局中斷試一下
關閉EA試一下,退出中斷的時候再打開EA
回復

使用道具 舉報

地板
ID:342505 發表于 2019-1-6 14:07 | 只看該作者
已經使用掃描管腳的方式解決問題了,我接下來講一下出現上述問題的原因以及替代方案的解決方法。
回復

使用道具 舉報

5#
ID:463967 發表于 2019-1-24 14:38 | 只看該作者
我現在也是碰到這個問題 看的金沙灘工作室的那個原版紅外模塊程序就是這一模一樣的  樓主解決了的話望告知
回復

使用道具 舉報

6#
ID:524819 發表于 2019-5-15 14:34 | 只看該作者
我也遇到了同樣的問題
回復

使用道具 舉報

7#
ID:394817 發表于 2019-11-24 10:04 | 只看該作者
我中斷函數名改成正常的了好像就OK了
void exint0() interrupt 0
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91网在线观看 | 免费成人高清 | 亚洲国产成人一区二区 | 拍真实国产伦偷精品 | 精品日本中文字幕 | 日韩视频免费看 | 中文字幕亚洲视频 | 亚洲社区在线 | 久久成人一区 | 少妇一级淫片aaaaaaaaa | 亚洲欧美日韩系列 | 精品欧美二区 | av天空| 欧美亚洲国产一区二区三区 | 99爱在线免费观看 | 黄色一级大片在线免费看产 | 免费观看一级黄色录像 | 日韩欧美在线观看 | 黄色毛片网站在线观看 | 国产日韩一区二区三免费高清 | 国产精品一区二区视频 | 中文字幕在线视频一区二区三区 | 亚洲精品乱码久久久久久黑人 | 日韩一区二区三区视频在线播放 | 中文字幕二区 | 羞羞视频在线网站观看 | 黄色免费观看网站 | 亚洲国产午夜 | 国产成人精品一区二三区在线观看 | 久久久精品国产 | 亚洲精品乱码8久久久久久日本 | 国产精品久久久99 | 一区二区福利视频 | 香蕉一区二区 | 黄色av免费网站 | 伊人性伊人情综合网 | av福利网| 农夫在线精品视频免费观看 | 毛片在线免费 | 免费的av| 九色 在线 |