|
发表于 2010-10-4 10:27:16
|
显示全部楼层
看看这个吧,12M晶振,兼容性相当好,程序也很简洁。
从串口输出解码数据。
//#include "reg52.h"
#include "W78E516.h"
#include "51delay.h"
//-----------------------管脚定义-------------------------
sbit IR_IO = P3^2;
sbit K1 = P3^5;
bit flag_IR = 0; // 红外脉宽记录完成标志
unsigned char IR_data[4]; // 红外接收数据
//*********************系统初始化****************************************
void mcu_init(void)
{
TMOD = 0x20; // T1定时方式2
//--------------设定波特率------------------------
TH1 = 0xfd; // 波特率9600 (11.0592M)
TL1 = 0xfd;
//------------------------------------------------
SCON = 0x50; // 串口方式1
TR1 = 1; // 启动T1
//----------------int0----------------------------
IT0 = 1; // 下降沿触发
EX0 = 1; // 允许int0中断
//------------------------------------------------
EA = 1; // 总中断允许
}
//***************************外部中断0 红外解码*******************************
void int0(void) interrupt 0
{
unsigned char i,j;
use_delay_int();
T_go_H_retx10T(800,IR_IO); //9ms低电平引导码
H_go_T_retx10T(IR_IO,120);
T_go_L_retx10T(410,IR_IO); //4.5ms高电平引导码
L_go_T_retx10T(IR_IO,50);
for( j=0;j<4;j++ ) //4个数据码
{
for( i=0;i<8;i++ )
{
IR_data[j] <<= 1; // 装入数据
H_go_T_retx10T(IR_IO,60);
T_go_L_retx10T(40,IR_IO);
L_go_T_dealx10T(IR_IO,100) { IR_data[j]++; break; }
L_go_T_retx10T(IR_IO,20);
}
}
flag_IR = 1; // 置位红外接收成功标志
}
//****************************主函数**************************************
void main( void )
{
unsigned char i;
mcu_init();
SBUF = 0xDD;
while( TI == 0 ); TI = 0;
IR_data = 0;
while(1)
{
if( flag_IR==1 )
{
flag_IR = 0;
for(i=0;i<3;i++)
{
SBUF = IR_data;
while( TI == 0 ); TI = 0;
IR_data = 0;
}
}
}
}
//51delay.h
#define use_delay_char() unsigned char delay_char
#define use_delay_int() unsigned int delay_int
#define delay_2T(t) delay_char=t; while(--delay_char) // 延时2*i+1个机器周期
#define delay_6T(t) delay_char=t; while(delay_char--) // 延时(j+1)*6+1个机器周期
#define T_go_H_retx6T(t,PIN) delay_char=t; while(--delay_char) if(PIN==1) return
#define T_go_L_retx6T(t,PIN) delay_char=t; while(--delay_char) if(PIN==0) return
#define H_go_T_retx4T(PIN,t) delay_char=t; while(!PIN) if((--delay_char)==0) return
#define L_go_T_retx4T(PIN,t) delay_char=t; while( PIN) if((--delay_char)==0) return
#define T_go_H_retx10T(t,PIN) delay_int=t; while(--delay_int) if(PIN==1) return
#define T_go_L_retx10T(t,PIN) delay_int=t; while(--delay_int) if(PIN==0) return
#define H_go_T_retx10T(PIN,t) delay_int=t; while(!PIN) if((--delay_int)==0) return
#define L_go_T_retx10T(PIN,t) delay_int=t; while( PIN) if((--delay_int)==0) return
#define H_go_T_dealx10T(PIN,t) delay_int=t; while(!PIN) if((--delay_int)==0)
#define L_go_T_dealx10T(PIN,t) delay_int=t; while( PIN) if((--delay_int)==0)
#define T_go_H_dealx10T(t,PIN) delay_int=t; while(--delay_int) if(PIN==1)
#define T_go_L_dealx10T(t,PIN) delay_int=t; while(--delay_int) if(PIN==0) |
|