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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4521|回復: 5
收起左側

單片機手掃紅外反射開關問題求助

[復制鏈接]
ID:140489 發表于 2018-6-14 21:02 | 顯示全部樓層 |閱讀模式
//紅外反射開關,接收頭HS0038B,發射管用pnp三極管驅動
//第一次上電,燈亮1秒后熄滅,
//手擋一次開,再擋一次關,如此循環
//實驗板測試手擋一次開,再擋一次關 開關正常;
//但是有一個問題,如果手一直擋在前面,LED會不停的亮--滅        -- 亮--滅
//請大神們看下,這樣才能做到手擋在前面不移開,保持一種狀態
//控制部分寫在大循環里和寫在中斷里面一樣鎖不住
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint  unsigned int

sbit ir=P2^4;         //紅外發射
sbit ir_in=P3^2; //紅外接收
sbit led=P1^7;         //低電平LED亮
bit flag,flag2=1;
uint cont,cont1,s;
uchar clock;
//bit f1,f2;
void delay(uint z)           //ms
{
        uint x,y;
        for(x=z; x>0; x--)
                for(y=114; y>0; y--);
}


void fa_38k()          //38k 載波                         //接收頭前面有濾光片
{                                 
        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_();_nop_();_nop_();
}

void main()
{
        uint i=0;
        ir_in=1;
        TMOD |= 0X01;                          //T0定時器,模式1, 16位計數
        TH0 = (65536-10000)/256;  //10ms初值 @12MHz晶振
        TL0 = (65536-10000)%256;
        EA=1;
        ET0=1;
        TR0=1;
        led=0;
        delay(1000);
        led=1;
        while(1)
        {  
                        if(flag)
                        {
                                fa_38k();  //發38K
                        }
                        else ir=1;           //停止發射

                                
//                                if(ir_in==1)         //沒有反射信號
//                                {
//                                        s=0;                 //延時變量清零
//                                        clock=0;          //自鎖標志清零
//                                //        f2=0;
//                                        flag2=1;          //恢復發射
//                                }
//                                else if(clock==0) //有反射信號
//                                {        
//                                
//                                        s++;                  //消抖
//                                        if(s>2000)          //這里值取大些,增強抗干擾
//                                        {        
//                                                
//                                                s=0;
//                                                flag2=0;  //停止發射
//
//                                                clock=1;
//                                                led=!led;                  //
//                                        //        while(!ir_in);
//                                                
//                                        //        f2=1;
//                                                delay(1000);          //延時1秒,等手移開后
//                                                
//                                        }
//                                }
                                
               
        }
}

void timer0() interrupt 1
{
        TH0 = (65536-10000)/256;  //重裝10ms初值
        TL0 = (65536-10000)%256;

        if(flag2==1)
        {
                cont++;
                if(cont==10)  
                {        
                        cont=0;
                        flag=!flag;         //發100ms 38K,停100ms
                }
        }
        
        flag2=0;  //停止發射
        if(ir_in==1)         //沒有反射信號
        {
                s=0;                 //延時變量清零
                clock=0;          //自鎖標志清零

                flag2=1;          //恢復發射
        }
        else if(clock==0 && ir_in==0) //有反射信號
        {        
        
                s++;                  //消抖  這里值取大些,增強抗干擾
                if(s>8 && ir_in==0)          //
                {        
                        
                        s=0;
                        flag2=0;  //停止發射

                        clock=1;
                        led=!led;
                        while(!ir_in);        //加不加這句,手擋在前面不移開,LED都會不停 亮--滅
                        
                        flag2=0;  //停止發射
                        
                }
        }
}
回復

使用道具 舉報

ID:352148 發表于 2018-6-14 21:51 | 顯示全部樓層
這樣的問題感覺都是延遲函數的鍋。。。
回復

使用道具 舉報

ID:386216 發表于 2020-6-3 09:06 | 顯示全部樓層
樓主問題解決了嗎,我也在學,能否發程序我學習下
回復

使用道具 舉報

ID:386216 發表于 2020-6-3 09:45 | 顯示全部樓層
感覺你定時器函數里面程序太多了,可能影響到38K載波那周期。現在調試好了嗎
回復

使用道具 舉報

ID:292518 發表于 2021-9-8 10:39 | 顯示全部樓層
樓主的程序修改好了嗎?
回復

使用道具 舉報

ID:844772 發表于 2021-9-8 11:32 | 顯示全部樓層
while(!ir_in); 前關中斷就行了。不過中斷函數怎么這么用啊?
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产精品91久久久久久 | 国产精品成人一区二区三区夜夜夜 | 欧产日产国产精品国产 | 亚洲精品第一 | 欧美在线一区二区三区 | 天天操天天天干 | 中文天堂在线观看 | 国产精品久久久久久久久久久免费看 | 亚洲欧美一区二区三区1000 | 日韩三级一区 | 黄网免费看| 午夜精品久久久久久久久久久久 | 精品国产色 | 国久久| 国产精品美女www爽爽爽 | 亚洲福利在线视频 | 天天综合干| 成人亚洲视频 | 亚洲免费视频播放 | 久久av一区 | 午夜在线 | 免费精品视频一区 | 免费观看成人性生生活片 | 午夜影院在线观看免费 | 在线日韩视频 | 夜夜骑av| 成人二区| 亚洲一区毛片 | 国产三级在线观看播放 | 国产精品第2页 | 亚洲国产视频一区二区 | 久久久久久a | 成人18亚洲xxoo | 精品久久ai电影 | 成人在线播放网站 | 亚洲高清免费视频 | 亚洲天堂一区二区 | 国产日韩久久 | 免费国产视频 | 国产不卡视频在线 | 黄免费观看 |