找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2670|回復(fù): 12
收起左側(cè)

單片機紅外反射開關(guān)程序問題求助

  [復(fù)制鏈接]
ID:140489 發(fā)表于 2019-9-26 10:31 | 顯示全部樓層 |閱讀模式
//紅外反射開關(guān),接收頭HS0038B,發(fā)射管用pnp三極管驅(qū)動
//第一次上電,燈亮1秒后熄滅,
//手擋一次開,再擋一次關(guān),如此循環(huán)
//實驗板測試手擋一次開,再擋一次關(guān) 開關(guān)正常;
//但是有一個問題,如果手一直擋在前面,LED會不停的亮--滅        -- 亮--滅
//請大神們看下,怎樣才能做到手擋在前面不移開,保持一種狀態(tài)
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit ir=P2^4;    //紅外發(fā)射
sbit ir_in=P3^2; //紅外接收
sbit led=P1^1;        //

uint cont,cont1;
bit flag_key;         //按鍵按下標(biāo)志
bit key_lock=0;


void delay(uint z)           //ms
{
        uint x,y;
        for(x=z; x>0; x--)
                for(y=114; y>0; y--);
}


void fa_38k()          //38k 載波                         //接收頭前面有濾光片,發(fā)射管要用黑色熱縮套管套起來
{                                  //不是很準(zhǔn),沒有邏輯分析儀,搞不準(zhǔn),現(xiàn)在的反射距離在60厘米左右(發(fā)射管串100歐電阻)
        ir=0;                  
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();

        ir=1;
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();_nop_();_nop_();_nop_();
        _nop_();//_nop_();
}

void main()
{
        TMOD |= 0X01;                          //T0定時器,模式1, 16位計數(shù)
        TH0 = (65536-1000)/256;  //1ms初值 @12MHz晶振
        TL0 = (65536-1000)%256;


        ET0=1;
        TR0=1;
        led=0;
        delay(500);
        led=1;
        while(1)
        {
                if(flag==0 )
                {
                        fa_38k();  //發(fā)38K
                }
                else ir=1;           //停止發(fā)射






        if(ir_in==0)          //手擋住
        {
                flag_key=1;
                cont1++;
                key_lock=1;        
        }
        else flag_key=0; //手移開
        
        if(flag_key==1 && cont1==100)
        {         
                  ir=1;
                 cont1=0;
                 led = !led;
                 delay(1000);

        }

        
        if(ir_in==1) cont1=0;        //這句抗干擾很好,遙控器對著按,都沒反應(yīng)                        



        }
}

void timer0() interrupt 1
{
        TH0 = (65536-1000)/256;  //重裝1ms初值
        TL0 = (65536-1000)%256;
                cont++;
        if(cont==100)  
        {        
                cont=0;
                flag=!flag;         //發(fā)100ms 38K,停100ms

        }

}


回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2019-9-26 15:01 | 顯示全部樓層
設(shè)一個標(biāo)志位,手擋置1,移開復(fù)位0,LED的滅除受時間控制外還受此標(biāo)志控制。這樣手擋在前面不移開,保持亮狀態(tài)。
回復(fù)

使用道具 舉報

ID:616758 發(fā)表于 2019-9-26 16:14 | 顯示全部樓層
請問解決了么
回復(fù)

使用道具 舉報

ID:616759 發(fā)表于 2019-9-26 16:25 | 顯示全部樓層
粗略的看了下,你有一個flag的變量沒有定義,你確定程序沒有報錯嗎?
回復(fù)

使用道具 舉報

ID:616759 發(fā)表于 2019-9-26 16:36 | 顯示全部樓層
我看了下,有一部分邏輯我不知道,準(zhǔn)確的說不知道你幾個變量的用處,我提議把 if(ir_in==0)          //手擋住  改成while循環(huán),  里面加個if(ir_in==1) 判斷,continue跳出當(dāng)前循環(huán),不知道count1的用處,可能需要那個改的這個循環(huán)外面
回復(fù)

使用道具 舉報

ID:160500 發(fā)表于 2019-9-26 18:16 | 顯示全部樓層
這個程序有BUG,38k發(fā)射應(yīng)該用一個中斷或定時器自動生成。主程序只控制發(fā)射還是不發(fā)射
回復(fù)

使用道具 舉報

ID:277550 發(fā)表于 2019-9-27 00:59 | 顯示全部樓層

        if(ir_in==0)          //手擋住
        {
                flag_key=1;
                cont1++;
                key_lock=1;        
        }
        else flag_key=0; //手移開
        
        if(flag_key==1 && cont1==100)
        {         
                  ir=1;
                 cont1=0;
                 led = !led;
                 delay(1000);

        }



計數(shù)器都是100就切換led狀態(tài)
回復(fù)

使用道具 舉報

ID:462827 發(fā)表于 2019-9-27 07:57 | 顯示全部樓層
置標(biāo)志位唄
回復(fù)

使用道具 舉報

ID:140489 發(fā)表于 2019-9-27 08:09 | 顯示全部樓層
bai_yun_123 發(fā)表于 2019-9-26 16:25
粗略的看了下,你有一個flag的變量沒有定義,你確定程序沒有報錯嗎?

我發(fā)帖的時候誤刪了,工程里面有定義的
回復(fù)

使用道具 舉報

ID:140489 發(fā)表于 2019-9-27 09:49 | 顯示全部樓層
程序已經(jīng)改好了,抗干擾能力強,用遙控器對著不停的按,都不會有誤動作;隔著5mm厚的玻璃也能感應(yīng)
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit ir=P2^4;    //紅外發(fā)射
sbit ir_in=P3^2; //紅外接收
sbit led=P1^1;

#define const_key_time1 20  //感應(yīng)去抖動延時的時間
uint uiKeyTimeCnt1=0; //感應(yīng)去抖動延時計數(shù)器
uchar ucKeyLock1=0;   //感應(yīng)觸發(fā)后自鎖的變量標(biāo)志


bit fw; //

void delay(uint z)           //
{
        uint x,y;
        for(x=z; x>0; x--)
//            for(y=50; y>0; y--); //1.38 ms
                        for(y=10; y>0; y--);  //340us
}

         
void main()
{
        
        TMOD |= 0x02;        //設(shè)置定時器模式 8位自動重裝
        TL0 = 0xF4;                //設(shè)置定時初值                  13us        @11.0592KHz
        TH0 = 0xF4;                //設(shè)置定時重載值               
        EA=1;
    ET0=1;
    TR0=1;
    led=0;
    delay(3000);
    led=1;
    while(1)
    {
     
                delay(2);        //間隔700us發(fā)一次340us 38k 載波
                fw=1;
                delay(1);
                fw=0;  
                        
                if(ir_in==1)        //沒有感應(yīng) 要及時清零一些標(biāo)志
                {
               
                        ucKeyLock1=0;   //感應(yīng)自鎖標(biāo)志清零
                        uiKeyTimeCnt1=0;//感應(yīng)去抖動延時計數(shù)器清零
               
                }
                else if(ucKeyLock1==0)//有感應(yīng),且是第一次感應(yīng)
                {       
                        ++uiKeyTimeCnt1;  //延時計數(shù)器
                        if(uiKeyTimeCnt1>const_key_time1)
                        {
                                uiKeyTimeCnt1=0;
                                ucKeyLock1=1; //自鎖置位,避免一直觸發(fā)
                                led = !led;
                        }               
                }
        }
}

void timer0() interrupt 1
{
        if(fw)
        ir=!ir;                   //發(fā)38k 載波
}
回復(fù)

使用道具 舉報

ID:60656 發(fā)表于 2019-12-8 16:52 | 顯示全部樓層
樓主用的什么接收管?只腳帶調(diào)制的 還是紅外光敏晶體管?
回復(fù)

使用道具 舉報

ID:416239 發(fā)表于 2019-12-10 13:23 | 顯示全部樓層
先初始化一下
回復(fù)

使用道具 舉報

ID:292518 發(fā)表于 2021-9-8 14:23 | 顯示全部樓層
樓主,能分享一下電路圖不?程序測試過了嗎?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表