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

来源:互联网 发布:学seo和sem难吗 编辑:程序博客网 时间:2024/04/30 04:45

红外收发的原理

红外发射头为红外发光二极管,点亮则发出红外线。红外线根据 编码规范 再经过载波信号调制 (使用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 <reg52.h>typedefunsigned int u16;typedefunsigned char u8;sbitP2_2 = P2^2;void Delay(u16 i);//延时函数voidTimer0Init();//高优先级的定时器,用于产生38kHz的方波信号voidTimer0();voidSendBit(u16 b);//发送一位数据voidSendCmd();//发送命令void main(){Timer0Init(); P2_2 = 0;//将I/O口拉低while(1){SendCmd();Delay(100000);}}/*********************************功能:延时参数:i = 1 延时9微妙*********************************/void Delay(u16 i){while(i--);}voidTimer0Init(){TMOD|= 0x02;//工作方式2:8位重装载定时器                        TL0 = 0xF3;TH0 = 0xF3;PT0 = 1;//高优先级    TR0 = 0; //定时器起停位    ET0 = 1; //中断允许    EA = 1;//总中断开启}/*********************************功能:38kHz载波信号*********************************/voidTimer0() interrupt 1{P2_2 =~ P2_2;}/*********************************功能:发送一位数据参数:b 待发送的比特位*********************************/voidSendBit(u16 b){TL0 = 0xF3;TH0 = 0xF3;TR0 = 1;Delay(33);TR0 = 0;if(b)Delay(170);elseDelay(46);}/*********************************功能:发送69位命令*********************************/voidSendCmd(){u16Comd1[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);//命令段1for(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;}//间隔20msDelay(2200);//命令段2for(i=0;i<2;i++){for(j=0;j<16;j++){SendBit(Comd2[i] & 0x8000);Comd2[i] <<= 1;}}SendBit(Comd2[2] & 0x8000);TR0 = 0;}


原创粉丝点击