通过红外通信控制格力YB0F2型空调

红外收发的原理

红外发射头为红外发光二极管,点亮则发出红外线。红外线根据 编码规范 再经过 载波信号调制 (使用38kHz左右的方波信号)后,形成接收头(本文使用的为一体化接收头IRM38A)可以接受的有效信号。接受到有效信号后,由对应 解码程序 识别并进行相应操作。
其中, 载波信号调制单个比特位 的发送是对应与红外接收头而言的。可以理解为当红外灯按载波信号点亮时,红外接收头才能获取到光信号。而闪烁的间隔,则决定了红外接收头的信号输出为高或低电平。
而命令的  编解码格式 ,则是对于程序员而言的,由软件实现。

格力YB0F2型空调命令格式如下:

报头脉冲:9ms

报头间距:4.5ms

载波频率:37.9KHz(38KHz)

码段1与码段2间距:20ms

“1”:脉宽,656us。间距,1640us。

“0”:脉宽,656us。间距,544us。


红外信号主要包括CMD1和CMD2两部分,其中CMD1包括35 位的命令和一位停止位,CMD2包括32位的命令和一位停止位。其中停止位为开关机位取反。具体指令含义可见https://wenku.baidu.com/view/538ee52dbe23482fb4da4cc8.html  。

表格 1 CMD1

Bit:1~3

4

5~6

7

8

模式

开关机(CMD2 32bit取反)

风速

是否扫风

是否睡眠

9~12

13~16

温度

睡眠1

17~20

21

22

23

24

睡眠2

超强

灯光

健康

干燥/辅热

25

26

27

28

29

30

31

32

换气

0

0

0

1

0

1

0

33

34

35

 

 

 

 

 

0

1

0

 

 

 

 

 

 表格 2 CMD2

Bit:1

2

3

4

5

6

7

8

上下扫风

0

0

0

左右扫风

0

0

0

9~10

11

12

13

14

15

16

显示温度

0

0

0

0

0

0

17

18

19

20

21

22

23

24

0

0

0

0

0

0

0

0

25

26

27

28

29~32

0

0

0

0

温度


源代码如下:

#include 

typedef	unsigned int u16;
typedef	unsigned char u8;

sbit	P2_2 = P2^2;

void 	Delay(u16 i);		//延时函数	
void	Timer0Init();		//高优先级的定时器,用于产生38kHz的方波信号
void	Timer0();
void	SendBit(u16 b);		//发送一位数据
void	SendCmd();				//发送命令

void main()
{
	Timer0Init(); 
	P2_2 = 0;			//将I/O口拉低
	while(1)
	{
		SendCmd();
		Delay(100000);
	}
}

/*********************************
功能:延时
参数:i = 1 延时9微妙
*********************************/
void Delay(u16 i)
{
	while(i--);
}

void	Timer0Init()
{
		TMOD|= 0x02;	//工作方式2:8位重装载定时器                    
    TL0 = 0xF3;	
		TH0 = 0xF3;
	
		PT0 = 1;			//高优先级
    TR0 = 0; 			//定时器起停位
	
    ET0 = 1; 			//中断允许
    EA = 1;				//总中断开启
}

/*********************************
功能:38kHz载波信号
*********************************/
void	Timer0() interrupt 1
{
	P2_2 =~ P2_2;
}

/*********************************
功能:发送一位数据
参数:b 待发送的比特位
*********************************/
void	SendBit(u16 b)
{
	TL0 = 0xF3;	
	TH0 = 0xF3;
	TR0 = 1;
	Delay(33);
	TR0 = 0;
	if(b)
		Delay(170);
	else
		Delay(46);
}

/*********************************
功能:发送69位命令
*********************************/
void	SendCmd()
{
	u16	Comd1[3] = {0xC050,0x040A,0x4000};
	u16 Comd2[3] = {0x0044,0x0009,0x8000};
	int i,j;
	TL0 = 0xF3;	
	TH0 = 0xF3;
	TR0 = 1;
	//报头
	Delay(470);
	TR0 = 0;
	Delay(500);
	//命令段1
	for(i=0;i<2;i++)
	{
		for(j=0;j<16;j++)
		{
			SendBit(Comd1[i] & 0x8000);
			Comd1[i] <<= 1;
		}
	}
	for(i=0;i<4;i++)
	{
		SendBit(Comd1[2] & 0x8000);
		Comd1[2] <<= 1;
	}
	//间隔20ms
	Delay(2200);
	//命令段2
	for(i=0;i<2;i++)
	{
		for(j=0;j<16;j++)
		{
			SendBit(Comd2[i] & 0x8000);
			Comd2[i] <<= 1;
		}
	}
	SendBit(Comd2[2] & 0x8000);
	TR0 = 0;
}



你可能感兴趣的:(单片机,单片机,红外通信)