找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3626|回复: 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 单片机教程网

快速回复 返回顶部 返回列表