|
发表于 2013-5-1 21:54:44
|
显示全部楼层
LZ,我用你的程序修改了下,,解不了码,,帮我看下有什么问题吗程序!!用那种开发板带的小遥控能解得了吗??请教了!!
#include "STC12C5Ax.h"
#define uchar unsigned char
#define uint unsigned int
uchar IR_data[4];
uchar IR_dataBuffer[4];
uchar ReIR_Data[4];
sbit IR_IO= P3^2;
sbit download=P3^0;
bit Irprot_LastState;
bit IR_FlagSend;
/*
* UART初始化
* 波特率:2400
*/
void uart_init(void)
{
TMOD = 0x21;
SCON = 0x50;
TH1 = 0xF3;
TL1 = 0xF3;
TR1 = 1;
}
/*
* UART发送一字节
*/
void UART_Send_Byte(uchar dat)
{
SBUF = dat;
while (TI == 0);
TI = 0;
}
void main()
{
uart_init();
ET0=1;
TR0=1;
TH0=(65536-125)/256;
TL0=(65536-125)%256;
P2M0=0x04;
P2M1=0x00;
while(1)
{
// if(!download) IAP_CONTR=0x63;
// P0=0x00;
}
}
void timer1(void) interrupt 0 using 0
{
static uchar irTime,codeCnt;
static uint Counter1S;
TF1=0;
TH1=(65536-125)/256;
TL1=(65536-125)%256;
irTime++;
if(irTime==240) {irTime--; codeCnt=0x3f;} // ir解码后码值存放时间, 240*125us = 30ms
if(IR_IO) Irprot_LastState=1; // 记录IO状态
else if(Irprot_LastState) // 有下降沿
{
Irprot_LastState = 0; // 下降沿后IO状态记录为0
if(irTime<24) // 小于24*125us=3ms的间隔才进行处理
{
codeCnt++; codeCnt &= 0x1f;
IR_data[codeCnt>>3] <<= 1;
if( irTime>15 ) IR_data[codeCnt>>3]++; // 大于15*125us=1.875ms的间隔为数据1
}
irTime = 0; // 下降沿处理完成,将时间清0
if(codeCnt>31)
{
IR_dataBuffer[0]=~IR_data[0];
IR_dataBuffer[1]=IR_data[1];
IR_dataBuffer[2]=~IR_data[2];
IR_dataBuffer[3]=IR_data[3];
ReIR_Data[0]=~IR_dataBuffer[0];
ReIR_Data[1]=IR_dataBuffer[1];
ReIR_Data[2]=IR_dataBuffer[2];
ReIR_Data[3]=IR_dataBuffer[3];
if(ReIR_Data[0]==ReIR_Data[1] && ReIR_Data[3]==ReIR_Data[2]) IR_FlagSend=1;
}
}
if(IR_FlagSend)
{
if(++Counter1S==40)
{
Counter1S=0;
IR_FlagSend=0;
UART_Send_Byte(ReIR_Data[3]);
P0=ReIR_Data[3];
ReIR_Data[3]=0;
IR_data[3]=0;
}
}
}
|
|