sunyouyuan 发表于 2008-12-12 15:17:29

学习型遥控器(看看我这个程序怎样改)【恢复】

我接收发送的原理是:用T0记录高低电平的宽度,保存至一个数组当中,然后原封不动把它调制在用T1做定时产生的38kHZ信号上,问题是为什么 发送出去的红外编码不正确 望大虾指点:多谢程序如下:

#include<stc89c58.h>

#define unchar unsigned char

#define unint unsigned int

sbit  LED=P4^1;

sbit  Ir_in=P1^6;         //红外接收口

sbit  Ir_out=P1^7;       // 红外发送头

bit flag=0;             //红外接收完毕标志位

bit flag1=0;            //允许红外发送标志

unchar IR;   //用来保存脉冲宽度

void IrDA_decode();

void IrDA_send();

/*************************************/ 

         /*延时函数*/

/*************************************/         

void delay(unsigned int T)

{

  unsigned char i;

  while(T--) {

  for(i=0;i<120;i++);

  }

}

/*************************************/ 

         /*倒序函数*/

/*************************************/ 

unsigned char rearrange(unsigned char a)

{

unsigned char i,b;

b=a&0x01;

for(i=1; i<8; i++)

{

b=b<<1;

a=a>>1;

b=b+(a&0x01);

}

return(b);

}

/*************************************/

   /*串口初始化*/

/*************************************/

void serial_init()

{

 TMOD=0x21;

 EA=1;

 ET1=1;

 //TL1=0xfd;TH1=0xfd;

 //SCON=0xd8;PCON=0x00;

 //TR1=1;                                     //串口初始化,波特率9600

 TH1=0xf4;TL1=0xf4;          //定时产生38kHZ载波信号

}

/*************************************/

    /*数据发送,查询方式*/

/*************************************/

void Uart_Transmit1(unsigned char i) { 

    SBUF=i;

        while(TI==0);

        TI=0;                            /*清标志*/



} 

/*************************************/

   /*数据接收,查询方式*/

/*************************************/

unsigned char Uart_Receive( void ) {

      unsigned char j;

      while (RI==0);                /* 等待接收数据*/

              RI=0;

              j=SBUF;

         return j;

        

        }

 /*************************************/

   /*定时器1中断函数*/

/*************************************/

 void timer1() interrupt 3 using 2

 {

Ir_out=~Ir_out;

 }

/*************************************/

           /*主函数*/ 

/*************************************/                        

main()

{

 serial_init();           //初始化串口和定时器,T0方式1计数,T1产生9600的波特率

 while(1) {IrDA_decode();}

  }

/*************************************/

           /*解码函数*/ 

/*************************************/

void IrDA_decode()

{ unchar i=0;

while (Ir_in==1) ;

loop:

TH0=0x00;TL0=0x00;TR0=1;   //启动定时器0开始计时低电平宽度

while(Ir_in==0);

TR0=0;                     //关闭定时器

IR=TH0;

i++;

IR=TL0;       

i++;                                                //记录低电平宽度

TH0=0;TL0=0;TR0=1;                        //启动定时器0开始计时高电平宽度

while(Ir_in==1)        ;

if(TF0==1) {TR0=0; flag=1;goto send; }      //计时溢出表明数据接受完毕 ,关闭计时器置位标志

TR0=0;                     //关闭定时器

IR=TH0;

i++;

IR=TL0;       

i++;                                                //记录高电平宽度

goto loop;                            //循环捕捉高低电平

send:

while(1){

IrDA_send();

}               //红外发送

                   

//Uart_Transmit1(IR) ;

//Uart_Transmit1(IR) ;        

}

  

/*************************************/

           /*红外发送*/ 

/*************************************/  

void IrDA_send()

{

unsigned char i=0;

LED=~LED;

 delay(500);        

LED=~LED;

 delay(500);

  while(i<144){

 TH0=~IR;

i++;

 TL0=~IR;

i++;

TR1=1;TR0=1;

while(TF0==0);           //发送“1”

TR1=0;TR0=0;

 TH0=~IR;

i++;

 TL0=~IR;

i++;

TR0=1;

while(TF0==0);          //发送“0”

TR0=0;

                }

                 }



    

sunyouyuan 发表于 2008-12-24 21:25:49

用捕捉解码 再用定时器把编码发射出去

xiao123 发表于 2008-12-26 21:20:24

强,mark

wkman 发表于 2008-12-19 08:29:33

学习型红外遥控器,还是很难适应市面上混乱不堪地遥控产品。。。

valkyrs 发表于 2008-12-22 22:03:16

什么问题哦?介绍一下如何解决的嘛

sunyouyuan 发表于 2008-12-22 21:33:28

问题解决了 封贴 ,我的学习型空调控制器终于可以控制空调开关机了 哈哈 

sunyouyuan 发表于 2008-12-16 11:48:26

站长,帮帮忙啊。呵呵没有人做过学习型红外遥控器吗?

sunyouyuan 发表于 2008-12-12 17:35:31

谁可以帖个程序参考参考啊谢谢了啊

Iressa 发表于 2008-12-12 15:25:58

用示波器看看,一点一点调整

sunyouyuan 发表于 2008-12-15 10:31:38

是脉冲宽度调制,我的遥控器是格力的Y502E 解码已经成功,因为我将接收到的红外信号解码送到PC串口显示出来与我在示波器上观察到的数据是一样的,但是我现在想将红外信号调制在38KHZ上原封不动的发射出去,该怎样实现呢?那位好心的大侠贴个程序参考参考啊 

halloween 发表于 2008-12-12 18:41:04

要看遥控的编码方式 有的不是脉宽调制

看看这个

http://blog.sina.com.cn/s/blog_51f1a4130100b08n.html

stamlin542 发表于 2009-5-6 10:42:22

请问楼主可以把修改好的程序贴上来参考下么?谢谢

sunyouyuan 发表于 2009-5-6 11:00:31

公司的项目资料 不便于上传 望理解。不过我可以说下我的思路, 接收用AVR的捕捉中断,定义一个较大的数组,每中断一次就改变中断的触发方式,同时保存TCNT的值,这样就是记录了不同的高低电平的改变时间。
解码:将保存好的数据(那个大数组)的每相邻两个值相减:An-An-1 就得到高低电平的长度。 发射的时候调制在38KHZ上(可以用定时器产生)

zyh20054655 发表于 2009-6-2 00:24:44

能不能把你的程序发给看一下,万分感谢了哦
我的邮箱是 394075527@qq.com

limzhw 发表于 2011-5-19 20:29:19

楼主,求程序。电路。。396935455@qq.com 先谢谢啦。。
页: [1]
查看完整版本: 学习型遥控器(看看我这个程序怎样改)【恢复】