|
发表于 2013-6-17 23:27:27
|
显示全部楼层
本帖最后由 HeP028 于 2013-6-17 23:32 编辑
经过改造成功: STC90C58RD+11.0592- #define IRSENDPORT P0
- #define TIMER9000US (65536-8294) //9mS
- #define TIMER4500US (65536-4147) //4.5mS
- #define TIMER1650US (65536-1520) //1.65mS
- #define TIMER0560US (65536-516) //0.56mS
- #define TIMER40000US (65536-36863) //40mS
- #define TIMER56000US (65536-51609) //56mS
- void IrUserTimerConfiguration(void)
- {
- TMOD |= 0x01;
- IRSENDPORT = 0XFF;
- }
- void IRWriteOneBit(BIT send_Mode,unsigned int TimerInitValue,unsigned char ChangNumer)
- {
- unsigned char NumBer = 1 << ChangNumer;
- unsigned char onlyOneChangorAllChang = 20;
-
- if (ChangNumer < 8 && ChangNumer >= 0) onlyOneChangorAllChang = 0; //单独通道发送
- else if (255 == ChangNumer) onlyOneChangorAllChang = 1; //所有通道都发送
- TH0 = TimerInitValue >> 8;
- TL0 = TimerInitValue;
- TF0 = 0;
- TR0 = 1;
- if (send_Mode == 0) while(!TF0);
- else while(1)
- {
- if (0 == onlyOneChangorAllChang) IRSENDPORT |= NumBer; //置位相应的通道
- else if (1 == onlyOneChangorAllChang) IRSENDPORT = 0xff;
-
- if (TF0) break; if (TF0) break;
-
- if (0 == onlyOneChangorAllChang) IRSENDPORT &= ~NumBer; //CLR相应通道
- else if (1 == onlyOneChangorAllChang) IRSENDPORT = 0x00;
-
- if (TF0) break; if (TF0) break; if (TF0) break;
- if (TF0) break; if (TF0) break; if (TF0) break;
- if (TF0) break; if (TF0) break; if (TF0) break; if (TF0) break;
- }
- TR0 = 0;
- if (0 == onlyOneChangorAllChang) IRSENDPORT |= NumBer;
- else if (1 == onlyOneChangorAllChang) IRSENDPORT = 0xff;
- }
- void IRWriteOneChar(unsigned char ircode,unsigned char ChangNumber)
- {
- unsigned char I = 0x00;
- for (I = 0;I < 8;I++)
- {
- IRWriteOneBit(1,TIMER0560US,ChangNumber);
- if (ircode & 0x01)
- {
- IRWriteOneBit(0,TIMER1650US,ChangNumber);
- }
- else
- {
- IRWriteOneBit(0,TIMER0560US,ChangNumber);
- }
- ircode >>= 1;
- }
- }
- void IrPortWriteIrcode(unsigned char *Ircode,unsigned char ChangNumber)
- {
- IRWriteOneBit(1,TIMER9000US,ChangNumber);
- IRWriteOneBit(0,TIMER4500US,ChangNumber);
- IRWriteOneChar(*Ircode ,ChangNumber);
- IRWriteOneChar(*(Ircode+1),ChangNumber);
- IRWriteOneChar(*(Ircode+2),ChangNumber);
- IRWriteOneChar(*(Ircode+3),ChangNumber);
- IRWriteOneBit(1,TIMER0560US,ChangNumber);
- IRWriteOneBit(0,TIMER40000US,ChangNumber);
- }
复制代码 解码用的也是论坛的很好用,误码率还算比较低的哈,解100次可能错一次:- SBIT IRrecPort = PORTD^3;
- void IRUsereceiveTimerConfiuration(void)
- {
- T2MOD = 0X00;
- T2CON = 0X00;
- RCAP2L= (unsigned int)(0XFFFF-(250/((12/FOSC)+0.00005))+1);
- RCAP2H= (unsigned int)(0XFFFF-(250/((12/FOSC)+0.00005))+1)>>8;
- TL2 = RCAP2L;
- TH2 = RCAP2H;
- TR2 = 1;
- ET2 = 1;
- EA = 1;
- }
- BIT IRprotLaststatus = 0; // 端口状态位
- unsigned char codeCount = 0; // 数据码位计数
- unsigned char irTime; // 码时间,用于以125us时间计时
- unsigned char InfarereceiveArray[4]; // 接收数据缓存
- void IRreceive_Hander(void) interrupt 5
- {
- TR0 = 0;
- if (TF2)
- {
- TF2 = 0;
- irTime++;
- if (irTime == 120) //存活时间240*125=30MS
- {
- irTime--;
- codeCount = 0x3f;
- }
- if (IRrecPort) IRprotLaststatus = 1;
- else if (IRprotLaststatus)
- {
- IRprotLaststatus = 0;
- if (irTime < 12)
- {
- codeCount++;
- codeCount &= 0x1f; //限制其codeCount不大于某某数
- InfarereceiveArray[codeCount >> 3] <<= 1;
- if (irTime > 7)
- {
- InfarereceiveArray[codeCount >> 3]++;
- }
- }
- irTime = 0;
- }
- }
- TR0 = 1;
- }
复制代码 不过哪位大神看下,如果自发自收1个单片机好像完成不了哇! |
|