|
C51 做自学习红外空调遥控器 解码发射问题。
[复制链接]
老师叫我这几天做自学习红外遥控器,目前以美的空调遥控器为例。查阅过资料说空调遥控器码和普通电视遥控器
码不同。我用示波器看了下 我的这款美的空调遥控器的码 是 先4MS高电平和4MS低电平引导码,然后是用户码和数据码 然后再是5MS间隔码 接下
来再重复引导码 用户码和数据码。
我解码 能解码,发射也能发 在示波器上看基本波形也是模仿出来了,可是对着空调的时候按键按下 没反应。有做过的或懂的高手解答下。谢啦!
附程序:
/*******************************************************************/
/*******************************************************************/
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit studylamp = P2^4; //学习状态指示灯
sbit sendlamp = P2^5; //发射状态指示灯
sbit remotein = P3^4; //遥控信号输入口
sbit remoteout = P3^5; //遥控输出口
sbit studykey = P2^0; //学习键
sbit sendkey = P2^1; //发射键
uint i,j,m = 400,n,k,s;
uchar idata remotedata[206]; //存脉冲宽度数据
uint head1,head2; //存起始位
uint remdata;
uint KEY1NUM;
/**********1MS Delay**********/
void delay1ms(uint t)
{
for(i = 0; i < t; i++)
for(j = 0;j < 120; j++);
}
/**********INIT FUNCTION**********/
void Init_clear()
{
P0 = 0x00;
studylamp = 0; //关学习灯
sendlamp = 0; //关发射灯
remoteout = 1; //关遥控输出
remotein = 1; //
for(i = 0;i < 206;i++) //清内存
{remotedata = 0x00;}
IE = 0x00;
IP = 0x01;
TMOD = 0x20; //8位自动重装模式
PCON = 0x00;
TH1 = 0x0f3; //38KHZ初值
TL1 = 0x0f3;
//IT0 = 1;
EX0 = 1; //INT0中断允许
EA = 1; //开总中断
P0 = 0x00;
studylamp = 1; //关学习灯
sendlamp = 1; //关发射灯
}
/**********KEY FUNCTION**********/
void keywork()
{
if(sendkey == 0)
{
while(sendkey == 0); //等待键释放
ET1 = 1;
TR1 = 1; //发起始位
for(i = head1;i > 0;i--)
{;}
remoteout = 1;
ET1 = 0;
TR1 = 0;
for(i = head2;i > 0;i--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
n = 0;
while(1)
{
if(remotedata[n] == 0x00)
{
delay1ms(10);break; //数据为0结束
}
ET1 = 1;TR1 = 1; //奇地址发调制脉冲
for(i = remotedata[n];i > 0;i--)
{;}
remoteout = 1;ET1 = 0;TR1 = 0;n++;
for(i = remotedata[n];i > 0;i--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
P0 = 0x00;sendlamp = ~sendlamp; n++; //偶地址不发脉冲
}
}
}
/**********Study Function**********/
//
void study()
{
ET1 = 0;TR1 = 0;EA = 0;//EX0 = 0;
head1 = 0;head2 = 0;
P0 = 0x00;
studylamp = 0;
sendlamp = 1;
while(studykey == 0); //等待键释放
while(remotein == 1); //等待遥控码输入
head1 = 0;head2 = 0; //读入起始位
while(remotein == 0)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
head1++;
}
while(remotein == 1)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
head2++;
}
n = 0;
remdata = 0x0000;
while(1)
{
while(remotein == 0)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
remdata++;
}
remotedata[n] = remdata; //存高电平脉宽数据
n++;
remdata = 0x0000; //脉宽计数器清零
while(remotein == 1)
{
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();
remdata++; //低电平计数
if(remdata > m) //High TTL>5MS Exit
{
remotedata[n] = 0x00;EA = 1;goto end;//EX0 = 1;
}
}
remotedata[n] = remdata;
n++;
remdata = 0x0000; //存低电平脉宽数据
}
end:P0 = 0x00;sendlamp = 1;studylamp = 1;
}
void Key_Scan()
{
if(studykey == 0)
{
KEY1NUM++;
if(KEY1NUM >= 30)
{
KEY1NUM = 0;
study();
}
}
}
void main()
{
Init_clear();
while(1)
{
keywork();
Key_Scan();
}
}
/**********38KHZ**********/
//定时中断T1
void time_intt1(void)interrupt 3
{
remoteout = ~remoteout;
}
|
|