谁给个红外程序参考下

2019-03-24 19:56发布

有个学妹  这周要交毕业设计 现在他的毕业设计已经被我分解成 简单的几句话 就是 1838红外接收  发光二极管红外发射 按一个按键  红外接收后 一个灯亮 不过我对红外不了解,最近又比较忙 谁给个类似的程序我改改,没时间深入了 谢谢啦 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
kakasha
1楼-- · 2019-03-24 22:28
/*    晶振:11.0569MHz              */
#include <REG52.h>
#define uchar unsigned char
uchar data    IRcode[4];   //定义一个4字节的数组用来存储代码
uchar     CodeTemp;   //编码字节缓存变量
uchar     i,j,k;    //延时用的循环变量
sbit     IRsignal=P3^2;   //HS0038接收头OUT端直接连P3.2(INT0)
sbit jdq=P3^7;
/**************************延时0.9ms子程序**********************/
void Delay0_9ms(void)
{uchar j,k;
     for(j=18;j>0;j--)
       for(k=20;k>0;k--) ;
}
/***************************延时1ms子程序**********************/
void Delay1ms(void)
{uchar i,j;
   for(i=2;i>0;i--)
      for(j=230;j>0;j--) ;
}
/***************************延时4.5ms子程序**********************/
void Delay4_5ms(void)
{uchar i,j;
     for(i=10;i>0;i--)
      for(j=225;j>0;j--) ;
}
/**************************** 延时子程序 ************************/
void Delay(void)
{uchar i,j,k;
for(i=200;i>0;i--)  
   for(j=200;j>0;j--)
      for(k=3;k>0;k--) ;
}
/************************中断0解码服务子程序**********************/
void int0(void) interrupt 0 using 2      
{
EA=0;
for(k=0;k<10;k++)
   {Delay0_9ms();
    if (IRsignal==1)         //如果0.9ms后IRsignal=1,说明不是引导码
   {k=10;break;}
    else if(k==9)           //如果持续了10×0.9ms=9ms的低电平,说明是引导码
      {while(IRsignal==0);
         Delay4_5ms();        //跳过持续4.5ms的高电平

      for(i=0;i<4;i++)       //分别读取4个字节
         {for(j=1;j<=8;j++)      //每个字节8个bit的判断
                { while(IRsignal==0);       //等待上升沿
                  Delay0_9ms();      //从上升沿那一时刻开始延时0.9ms,再判断IRsignal
                  if(IRsignal==1)     //如果IRsignal是"1",则向右移入一位"1"
                    {Delay1ms();
                   CodeTemp=CodeTemp|0x80;
                   if(j<8) CodeTemp=CodeTemp>>1;
                  }
                  else
      if(j<8)CodeTemp=CodeTemp>>1;//如果IRsignal是"0",则向右移一位,自动补"0"
                 }
              IRcode=CodeTemp;
              CodeTemp=0;
         }

             SBUF=IRcode[2];
                P0=~IRcode[2];
  while(!TI);       //等待一个字节发送完毕
     TI=0;
   Delay();
       }
   }
EA=1;
}
/***********************串口初始化程序*********************/
void initUart(void)
{  
TMOD|=0x20;
SCON=0x50;
PCON|=0x00;
TH1=0xfd;     //9600bps @ 11.0592MHz
TL1=0xfd;
TR1=1;
}
/**************************主程序*************************/
void main()
{ initUart();
IT0=1;    //INT0为负边沿触发, (1:负边沿触发,0:低电平触发)
EX0=1;    //外部中断INT0开, (1:开,      0:关    )
EA=1;    //开所有中断
CodeTemp=0;    //初始化红外编码字节缓存变量
Delay();
while(1);
}
梦之旅
2楼-- · 2019-03-25 03:01
恩,这个程序我也用过,只要调对延时,是可以用的,我把它移植到过avr和其他芯片都可以用
kakasha
3楼-- · 2019-03-25 04:51
红外解码这玩意儿主要是延时,延时只要做好了,比较简单,要精确延时的话可以用计数器,不过好像没必要,我用这个延时解码也很正常
常见泽1
4楼-- · 2019-03-25 08:49
灰常感谢啊
常见泽1
5楼-- · 2019-03-25 09:09
请问下 不同的红外接收头区别大么 我的是1838吧 好像
chunyang
6楼-- · 2019-03-25 13:16
 精彩回答 2  元偷偷看……

一周热门 更多>