|
红外解码的仿真和完整代码下载详见:http://www.51hei.com/bbs/dpj-52500-1.html
- 格力空调遥控器(YB0F2)解码
- CUP:STC89C52RC 晶振:11.0569MHz
- 直接由串口输出 波特率:57600
- ************************************ 说 明 **********************************************
- 解码方式:
- 以一个9ms的低电平和4.5ms的高电平为引导码,后跟35位二进制代码 接着0.565ms低电平和20MS高电平跟32位二进制代码
- 前4个字节每个字节为8位,中间1个字节只有3位,接着为20MS高电平,跟后4个字节每个字节为8位
- 以低电平为0.565ms、高电平为0.56ms、 周期为1.125ms的组合表示"0";
- 以低电平为0.565ms、高电平为1.685ms、周期为2.25ms的组合表示"1"。;
- 注意:经过红外接收头解调后单片机接收到的高低电平是和遥控器发射时是相反的一个过程
- * 兼容 1T-12T单片机中断方式红外接收数据,并通过串口发送
- 程序编辑: lbq691477940 22/07/2011
- /*******************************************************************************************/0 S# V) ~# ^" a+ k2 V
- /*******************************************************************************************/
- #include <reg52.h>
- typedef unsigned char uint8;
- sbit Ir_Pin = P3^2;
- uint8 Ir_Buf[9]; //用于保存解码结果
- /*******************************************************************************************
- * 外部中断0初始化
- /*******************************************************************************************/' z% ?5 r+ `" u9 c
- void int1_init(void)
- {
- IT0 = 1; //下降沿有效
- EX0 = 1;
- EA = 1;
- }
- /*******************************************************************************************
- * UART初始化1 l2 N5 e* e; }
- * 波特率:9600 波特率:57600
- /*******************************************************************************************/4 S2 o! d c, k" o1 T
- void uart_init(void)
- {
- TMOD = 0x21;
- /* SCON = 0x50;
- TH1 = 0xFD; //9600bps @ 11.0592MHz
- TL1 = 0xFD;
- TR1 = 1;
- SCON = 0x50;
- PCON |= 0x80;
- TH1 = 0xff; //57600bps @ 11.0592MHz;
- TL1 = 0xff;
- TR1 = 1;
- }
- /****************************** 延时21ms子程序 ************************************
- void delay21ms(void)
- {
- uint8 a,b;
- for(b=150;b>0;b--)
- for(a=63;a>0;a--);
- }
- /*******************************************************************************************/' ]! m' Y$ d" t0 s
- /*******************************************************************************************
- * UART发送一字节
- /*******************************************************************************************/1 l' a& ^# P: Z
- void UART_Send_Byte(uint8 dat)
- {
- SBUF = dat;
- while (TI == 0);
- TI = 0;
- }
- /*******************************************************************************************
- * 获取低电平时间/
- /*******************************************************************************************/
- unsigned int Ir_Get_Low()
- {
- TL0 = 0;
- TH0 = 0;
- TR0 = 1;
- while (!Ir_Pin && (TH0 & 0x80)==0);//一直计到Ir_Pin不等0与计到大于1.085*32768=35553.28us
- TR0 = 0;
- return (TH0 * 256 + TL0); //返回T1 高八位和低八位计数值
- }
- /*******************************************************************************************
- * 获取高电平时间
- /*******************************************************************************************/
- unsigned int Ir_Get_High()
- {
- TL0 = 0;
- TH0 = 0;
- TR0 = 1;
- while (Ir_Pin && (TH0 & 0x80)==0);//一直计到Ir_Pin不等1与计到大于1.085*32768=35553.28us
- TR0 = 0;
- return (TH0 * 256 + TL0); //返回T1 高八位和低八位计数值' k: M5 q6 C7 h, X* t, b
- }
- /********************************** 主函数 ****************************************
- main()
- {
- uart_init();
- int1_init();
- while (1);
- }
- /**************************** 外部中断0解码函数 ****************************************/
- void int1_isr() interrupt
- {
- unsigned int temp;9 }
- char i,j;
- temp = Ir_Get_Low();
- if ((temp < 7833) || (temp > 8755)) //引导脉冲低电平8500~9500us: g2 X: z( {; _/ h0 T
- return; //不在这范围则说明出错 //1.085*7833=8498us ~ 1.085*8755=9499us
- temp = Ir_Get_High();
- if ((temp < 3686) || (temp > 4608)) //引导脉冲高电平4000~5000us
- return; //不在这范围则说明出错 //1.085*3686=3999us ~ 1.085*4608=4999us
- /*******************************************************************************************/
- for (i = 0; i < 4; i++) //4个字节
- {
- for (j = 0; j < 8; j++) //每个字节8位
- {
- temp = Ir_Get_Low();
- if ((temp < 184) || (temp > 737)) //200~800us
- return; //不在这范围则说明出错 //1.085*200=217us ~ 1.085*800=868us
- temp = Ir_Get_High();
- if ((temp < 184) || (temp > 1843)) //200~2000us3 r! _ a# t$ Z6 ?- W: u9 h
- return; //不在这范围则说明出错 //1.085*200=217us ~ 1.085*2000=2170us
- Ir_Buf[i] >>= 1; //先将它自动补0: _5 Y, \# b0 f. t
- if (temp > 1032) //1120us //1.085*1032=1119us
- Ir_Buf[i] |= 0x80; //如果大于1119us才将它设为1
- }
- }
- /************************** 第5个字节只有三位故只读其低三位即可 ************************/& X+ k8 {8 `: `
- for (i = 4; i <= 4; i++) //1个字节/ J% I0 |5 L) ]( \) k h* ]1 {( c
- { Ir_Buf[i] = 0;
- for (j = 0; j < 3; j++) //每个字节8位# ~- y2 e [4 Q' i: j9 ^# {" Y6 g O% {
- {
- temp = Ir_Get_Low();
- if ((temp < 184) || (temp > 737)) //200~800us
- return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*800 = 868us
- temp = Ir_Get_High();
- if ((temp < 184) || (temp > 1843)) //200~2000us
- return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*2000 = 2170us
- Ir_Buf[i] <<= 1; //先将它自动补0( F/ ^$ Q8 F6 [; ]' v$ [* g
- if (temp > 1032) //1120us //1.085*1032 = 1119us
- Ir_Buf[i] |= 0x01; //如果大于1119us才将它设为1
- }
- }
- /*******************************************************************************************/
- //delay21ms(); //实测波形只20ms但如果只延时20ms读出会出错故延时21ms" ?8 _% g# m" h' `# u' W& @! d1 O% m
- temp = Ir_Get_Low();
- if ((temp < 184) || (temp > 737)) //200~800us, h+ Q* e X' K; R w
- return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*800 = 868us" K" [( _, t2 e7 n
- temp = Ir_Get_High();7 N9 u* B$ N5 Z# a
- if ((temp < 17498) || (temp > 19354)) //19~21ms
- return; //不在这范围则说明出错 //1.085*17498 = 18985us ~ 1.085*19354 = 20999us4 y( g4 Z" j0 p2 t
- /*******************************************************************************************/
- for (i = 5; i < 9; i++) //4个字节3 t( G& X3 {( P Y- @
- {! Y6 h2 C: O0 ?! o+ g
- for (j = 0; j < 8; j++) //每个字节8位8 K/ D! g6 ~+ w) i/ o' c
- {
- temp = Ir_Get_Low();1 \3 O o! c4 h% I* ]
- if ((temp < 184) || (temp > 737)) //200~800us: d$ y* I8 Z( k
- return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*800 = 868us# E) P4 H! H9 l! S2 z1 i
- temp = Ir_Get_High();, L2 f7 G. u: H1 E
- if ((temp < 184) || (temp > 1843)) //200~2000us
- return; //不在这范围则说明出错 //1.085*200 = 217us ~ 1.085*2000 = 2170us! ?( I/ B" p+ }9 S" j
- Ir_Buf[i] >>= 1; //先将它自动补0
- if (temp > 1032) //1120us //1.085*1032 = 1119us
- Ir_Buf[i] |= 0x80; //如果大于1119us才将它设为1
- }
- }
- /*******************************************************************************************/
- for(i = 0;i < 9;i++) //通过串口将代码发出9 w- f# k) U* |% y3 o, d' k
- { 6 E$ Q7 L. J2 ~; E" T
- UART_Send_Byte(Ir_Buf[i]); //将9个字节的遥控键值通过串口输出$ Z# D U3 Q6 O4 q% e+ B9 H% } U
- }7 C2 ^( Z& Z* L
- }5 ^; G* g) _( P% S: S, s5 M
- /*******************************************************************************************/
复制代码
|
|