学习型遥控器(看看我这个程序怎样改)【恢复】
我接收发送的原理是:用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;
}
}
用捕捉解码 再用定时器把编码发射出去 强,mark 学习型红外遥控器,还是很难适应市面上混乱不堪地遥控产品。。。 什么问题哦?介绍一下如何解决的嘛 问题解决了 封贴 ,我的学习型空调控制器终于可以控制空调开关机了 哈哈 站长,帮帮忙啊。呵呵没有人做过学习型红外遥控器吗? 谁可以帖个程序参考参考啊谢谢了啊 用示波器看看,一点一点调整 是脉冲宽度调制,我的遥控器是格力的Y502E 解码已经成功,因为我将接收到的红外信号解码送到PC串口显示出来与我在示波器上观察到的数据是一样的,但是我现在想将红外信号调制在38KHZ上原封不动的发射出去,该怎样实现呢?那位好心的大侠贴个程序参考参考啊 要看遥控的编码方式 有的不是脉宽调制
看看这个
http://blog.sina.com.cn/s/blog_51f1a4130100b08n.html 请问楼主可以把修改好的程序贴上来参考下么?谢谢 公司的项目资料 不便于上传 望理解。不过我可以说下我的思路, 接收用AVR的捕捉中断,定义一个较大的数组,每中断一次就改变中断的触发方式,同时保存TCNT的值,这样就是记录了不同的高低电平的改变时间。
解码:将保存好的数据(那个大数组)的每相邻两个值相减:An-An-1 就得到高低电平的长度。 发射的时候调制在38KHZ上(可以用定时器产生) 能不能把你的程序发给看一下,万分感谢了哦
我的邮箱是 394075527@qq.com 楼主,求程序。电路。。396935455@qq.com 先谢谢啦。。
页:
[1]