//模拟格力空调遥控器
//逻辑0 低550us+高550us(或600+600)
//逻辑1 低550us+高1660us(或600+1600)
//9000+4500引导码,
//第一数组数据 0011 1110 , 0111 0000, 0000 0000,0000 1010,
//010 ,低600us+20ms连接码
//第二数组数据 1000 1000, 0000 0010, 0000 0000, 0000 1001
//空闲 低490us+高40ms
//9000+4500引导码,
//第三数组数据 0011 1010, 0111 0000 , 0000 0000, 0000 1110
//010, 低490us+高20ms连接码
//第四数组数据 0000 0000 , 0000 0000, 0000 1011, 0000 100
#include <reg52.h>
sbit sendon =P3^0; //按键
sbit send=P2^1; //发射口
void delay_10us(int us) //10us延时函数//
{
while(us--);
}
void delay0() //逻辑0高低电平脉宽
{
send=0;
delay_10us(64);
send=1;
delay_10us(55);
}
void delay1() //逻辑1高低电平脉宽
{
send=0;
delay_10us(64);
send=1;
delay_10us(168);
}
char arr_time1[]={0x3e,0x70,0x00,0x0a}; //第一组发送的数据
char arr_time2[]={0x88,0x02,0x00,0x09}; //第二组发送的数据
char arr_time3[]={0x3a,0x70,0x00,0x0e}; //第三组发送的数据
char arr_time4[]={0x00,0x00,0x0b,0x08}; //第四组发送的数据
int main()
{
while(1)
{
send=1; //初始高电平
if (sendon==0) //判断按键按下
{
int a,b;
char s1,s2,s3,s4 ;
delay_10us(2000); //判断按键按下
if (sendon==0) //判断按键按下
{
send=0; //9ms低电平引导码
delay_10us(900);
send=1;
delay_10us(450); //4.5ms高电平引导码
for(a=0;a<4;a++) //循环第一个数组的四个数据
{
s1=arr_time1[a]; //将第一个数组赋值到S1
for (b=0;b<8;b++) //将每个数据的8位循环
{
if (s1&0x80) //数据&0x80后进行判断
{
delay1();
}
else
{
delay0();
}
s1 <<= 1; //左移一位再循环判断
}
}
delay0(); //010+高20000us连接码
delay1(); //010+高20000us连接码
delay0(); //010+高20000us连接码
send=0; //010+高20000us连接码
delay_10us(60); //010+高20000us连接码
send=1; //010+高20000us连接码
delay_10us(2000); //010+高20000us连接码
a=0;
b=0;
//s1
for(a=0;a<4;a++) //第二个数组发送
{
s2=arr_time2[a];
for (b=0;b<8;b++)
{
if (s2&0x80)
{
delay1();
}
else
{
delay0();
}
s2 <<= 1;
}
}
send=0; //40ms空闲
delay_10us(49); //40ms空闲
send=1; //40ms空闲
delay_10us(4000); //40ms空闲
//s2
a=0;
b=0;
send=0; //空闲之后再次引导码
delay_10us(900); //9ms低电平引导码
send=1;
delay_10us(450); //4.5ms高电平引导码
for(a=0;a<4;a++) //第三数组发送
{
s3=arr_time3[a];
for (b=0;b<8;b++)
{
if (s3&0x80)
{
delay1();
}
else
{
delay0();
}
s3 <<= 1;
}
}
delay0(); //010+高20000us连接码
delay1(); //
delay0(); //
send=0;
delay_10us(49);
send=1;
delay_10us(2000);
a=0;
b=0;
//s3
for(a=0;a<3;a++) //第四数组发送,第四数组在for循环中只有三个数据
{
s4=arr_time4[a];
for (b=0;b<8;b++)
{
if (s4&0x80)
{
delay1();
}
else
{
delay0();
}
s4 <<= 1;
}
}
delay0(); //第四个数据发送 数据为000100
delay0();
delay0();
delay0();
delay1();
delay0();
delay0();
//s4
while(!sendon); //按键松开
}
}
}
}
用示波器检测输出口有信号,但是用红外线接收头接收不到。
|