搜索
bottom↓
回复: 15

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

[复制链接]

出0入0汤圆

发表于 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[150];   //用来保存脉冲宽度

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[134]) ;

//Uart_Transmit1(IR[135]) ;        

}

  

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

           /*红外发送*/ 

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

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;

                }

                 }



    

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2008-12-24 21:25:49 | 显示全部楼层
用捕捉解码 再用定时器把编码发射出去

出0入0汤圆

发表于 2008-12-26 21:20:24 | 显示全部楼层
强,mark

出0入0汤圆

发表于 2008-12-19 08:29:33 | 显示全部楼层
学习型红外遥控器,还是很难适应市面上混乱不堪地遥控产品。。。

出0入0汤圆

发表于 2008-12-22 22:03:16 | 显示全部楼层
什么问题哦?介绍一下如何解决的嘛

出0入0汤圆

 楼主| 发表于 2008-12-22 21:33:28 | 显示全部楼层
问题解决了 封贴 ,我的学习型空调控制器终于可以控制空调开关机了 哈哈 

出0入0汤圆

 楼主| 发表于 2008-12-16 11:48:26 | 显示全部楼层
站长,帮帮忙啊。呵呵没有人做过学习型红外遥控器吗?

出0入0汤圆

 楼主| 发表于 2008-12-12 17:35:31 | 显示全部楼层
谁可以帖个程序参考参考啊谢谢了啊

出0入0汤圆

发表于 2008-12-12 15:25:58 | 显示全部楼层
用示波器看看,一点一点调整

出0入0汤圆

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

出0入0汤圆

发表于 2008-12-12 18:41:04 | 显示全部楼层
要看遥控的编码方式 有的不是脉宽调制

看看这个

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

出0入0汤圆

发表于 2009-5-6 10:42:22 | 显示全部楼层
请问楼主可以把修改好的程序贴上来参考下么?谢谢

出0入0汤圆

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

出0入0汤圆

发表于 2009-6-2 00:24:44 | 显示全部楼层
能不能把你的程序发给看一下,万分感谢了哦
我的邮箱是 394075527@qq.com

出0入0汤圆

发表于 2011-5-19 20:29:19 | 显示全部楼层
楼主,求程序。电路。。396935455@qq.com 先谢谢啦。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 12:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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