微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于红外线遥控器信号的接受

关于红外线遥控器信号的接受

时间:10-02 整理:3721RD 点击:
大家好,小弟写了一个关于接受红外线遥控的程序。因本人不知道该遥控器的代码,故添加了串口程序进行查看。但发现我无论按什么键,代码都是F。不知道小弟哪里写错了。请各位大神指点一下,谢谢!
#include<reg52.h>
#include<intrins.h>
#define har unsigned char
#define chen unsigned int
sbit hw=P3^2;
har num1,flg;
har a,z,i,k,temp;
har table[4]={0};
chen num;
void delay(har d)
{
        har x,y;
        for(x=20;x>0;x--)
                for(y=d;y>0;y--);       
}  
void chuan(har num)
{
        ES=0;
        SBUF=num;
        while(!TI);
        TI=0;
        ES=1;
}
void main()
{
        TMOD=0x22;//定时器0与1的工作方式
        TH0=0xd7;//赋值
        TL0=0xd7;
        TH1=0xe6;
        TL1=0xe6;
        P2=0xff;
        EA=1; //开总中断
        ET0=0;//开定时器0中断
        ET1=0; //关闭定时器1中断,无用
        TR1=1;
        SM0=0; //设定串口工作方式为1
        SM1=1;
        EX0=1; //开外部中断
        ES=1;//开串口中断
        REN=1; //开串口接收
        IT0=1;
        hw=1;
        while(1)
        {
        P2=0xff;
        EX0=1;
        }
}
void ex0() interrupt 0
{
        EX0=0;
        delay(2);
        num=0;
        P2=0;
        if(hw==0)
        {
                        P2=~P2;
                         TR0=1;//定时器0开始工作
                        while((hw==0)&&(num<160))//在剩下的8ms内,检测是否是持续的低电平
                        {
                                if(TF0==1)
                                {
                                num++;
                                TF0=0;
                                }
                        }
                        if(num>=159)
                        {
                                TR0=0;
                                chuan(num);
                                 num=0;
                        }       
                        else
                        {
                                 TR0=0;
                                num=0;
                                return;
                        }       
        }
                else
                        return;         
                delay(2);
        if(hw==1)  //在剩下的4ms内,检测是否是持续的高电平
                {
                        P2=~P2;
                        TR0=1;
                        while((hw==1)&&num<90)
                        {
                                if(TF0==1)
                                {
                                num++;
                                TF0=0;
                                }
                        }
                        if(num>=80)
                        {
                                TR0=0;
                                chuan(num);
                                 num=0;
                        }       
                        else
                        {
                                 TR0=0;
                                num=0;
                                return;
                        }       
                }
                else
                        return;       
                num=0;          
                   for(k=0;k<4;k++)          //检测红外信号
                  {
                                  TR0=1;
                                for(i=0;i<8;i++)
                                {
                                        P2=~P2;
                                        while((hw==0)&&num<14)//持续检测700us的低电平       
                                        {
                                                if(TF0==1)
                                                        {
                                                        num++;
                                                        TF0=0;
                                                        }
                                        }
                                        while((hw==1)&&num<27)//从700us-1350us的高电平,
                                        {
                                                if(TF0==1)
                                                {
                                                num++;
                                                TF0=0;
                                                }
                                        }
                                        if(hw==1) //当1.35ms后还是高电平时,该位为1
                                        {
                                                a=1;
                                                while((hw==1)&&num<50)//等待“1”剩余的时间       
                                                {
                                                        if(TF0==1)
                                                        {
                                                        num++;
                                                        TF0=0;
                                                        }
                                                }
                                                num=0;
                                        }
                                        else
                                        {
                                                a=0;
                                                num=0;
                                        }
                                        temp=temp|a;
                                        temp=_cror_(temp,1);
                                }
                                table[k]=temp;
                  }
                TR0=0;
                num=0;         
                        for(k=0;k<4;k++)   //把检测到的红外信号发送给PC
                        {
                        SBUF=table[k];
                        while(!TI);
                        TI=0;
                        P2=~P2;
                        }  
        EX0=1;       
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top