//模擬格力空調遙控器
//邏輯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); //按鍵松開
}
}
}
}
用示波器檢測輸出口有信號,但是用紅外線接收頭接收不到。
|