打印
[51单片机]

从业将近十年!手把手教你单片机程序框架(连载)

[复制链接]
278160|913
手机看帖
扫描二维码
随时随地手机跟帖
楼主
li123ds| | 2019-9-26 12:04 | 显示全部楼层 回帖奖励 |倒序浏览

//红外反射开关,接收头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^1;        //

uint cont,cont1;
bit flag_key;         //按键按下标志
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 载波                         //接收头前面有滤光片,发射管要用黑色热缩套管套起来
{                                  //不是很准,没有逻辑分析仪,搞不准,现在的反射距离在60厘米左右(发射管串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位计数
        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();  //发38K
                }
                else ir=1;           //停止发射
           
               




        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;        //这句抗干扰很好,遥控器对着按,都没反应                       



        }
}

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

        }

}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则