#include <reg52.h>#define uchar unsigned char#define uint unsigned int
sbit HW = P3^2; //红外解码引脚sbit led = P1^1; //来操作的灯
uint HW_TIME_H = 0,HW_TIME_L = 0;uchar HW_OK = 0,HW_DAT[4];
void main(){ uchar k; EA = 1; IT0 = 1; EX0 = 1; TMOD = 0x21; TH1 = 0xfd; TL1 = 0xfd; TH0 = 0x00; TL0 = 0x00; SM0 = 0; SM1 = 1; TR1 = 1; while(1) { if(HW_OK) //遥控控制灯 { for(k = 0;k < 4;k++) { SBUF=HW_DAT[k]; while(!TI); TI=0; } HW_OK = 0; EX0 = 1; } }}/******************************************************************* 11.0592Mhz晶振 9.5MS = 8755,,,,8.5MS = 7833 5MS = 4608,,,,,,4MS = 3686 0.5MS = 460,,,,,,,0.7MS = 645 1.5MS = 1383,,,,,,1.75MS = 1612*******************************************************************/void HW_INT() interrupt 0{ uchar HW_TMP = 0,i,j; EX0 = 0; //只解当前发过来的码 TH0 = 0; TL0 = 0; TR0 = 1; while(HW == 0); TR0 = 0; HW_TIME_L = TH0 * 256 + TL0; //计算引导码低电平的时间,应该是9MS TH0 = 0; TL0 = 0; TR0 = 1; while(HW == 1); TR0 = 0; HW_TIME_H = TH0 * 256 + TL0; //计算引导码高电平的时间,应该是4.5MS
if(HW_TIME_L < 8755 && HW_TIME_L > 7833 && HW_TIME_H > 3686 && HW_TIME_H < 4608) { for(i = 0;i < 4;i++) { for(j = 0;j < 8;j++) { while(HW == 0); //只检测高电平的时间即可,滤掉低电平 TH0 = 0; TL0 = 0; TR0 = 1; while(HW == 1); TR0 = 0; HW_TIME_H = TH0 * 256 + TL0; HW_TMP = HW_TMP >> 1; if(HW_TIME_H > 645 && HW_TIME_H < 1612) { HW_TMP |= 0x80; } } HW_DAT[i] = HW_TMP; } if(HW_DAT[2] != ~HW_DAT[3]) { EX0 = 1; return; } else { HW_OK = 1; EX0 = 1; } } else { EX0 = 1; return; }}
sbit HW = P3^2; //红外解码引脚sbit led = P1^1; //来操作的灯
uint HW_TIME_H = 0,HW_TIME_L = 0;uchar HW_OK = 0,HW_DAT[4];
void main(){ uchar k; EA = 1; IT0 = 1; EX0 = 1; TMOD = 0x21; TH1 = 0xfd; TL1 = 0xfd; TH0 = 0x00; TL0 = 0x00; SM0 = 0; SM1 = 1; TR1 = 1; while(1) { if(HW_OK) //遥控控制灯 { for(k = 0;k < 4;k++) { SBUF=HW_DAT[k]; while(!TI); TI=0; } HW_OK = 0; EX0 = 1; } }}/******************************************************************* 11.0592Mhz晶振 9.5MS = 8755,,,,8.5MS = 7833 5MS = 4608,,,,,,4MS = 3686 0.5MS = 460,,,,,,,0.7MS = 645 1.5MS = 1383,,,,,,1.75MS = 1612*******************************************************************/void HW_INT() interrupt 0{ uchar HW_TMP = 0,i,j; EX0 = 0; //只解当前发过来的码 TH0 = 0; TL0 = 0; TR0 = 1; while(HW == 0); TR0 = 0; HW_TIME_L = TH0 * 256 + TL0; //计算引导码低电平的时间,应该是9MS TH0 = 0; TL0 = 0; TR0 = 1; while(HW == 1); TR0 = 0; HW_TIME_H = TH0 * 256 + TL0; //计算引导码高电平的时间,应该是4.5MS
if(HW_TIME_L < 8755 && HW_TIME_L > 7833 && HW_TIME_H > 3686 && HW_TIME_H < 4608) { for(i = 0;i < 4;i++) { for(j = 0;j < 8;j++) { while(HW == 0); //只检测高电平的时间即可,滤掉低电平 TH0 = 0; TL0 = 0; TR0 = 1; while(HW == 1); TR0 = 0; HW_TIME_H = TH0 * 256 + TL0; HW_TMP = HW_TMP >> 1; if(HW_TIME_H > 645 && HW_TIME_H < 1612) { HW_TMP |= 0x80; } } HW_DAT[i] = HW_TMP; } if(HW_DAT[2] != ~HW_DAT[3]) { EX0 = 1; return; } else { HW_OK = 1; EX0 = 1; } } else { EX0 = 1; return; }}