下面是个程序,想根据遥控的键值来判断该做什么,但是P1灯显示正常了,判断键值却一直判断不出来。
#include <REGX51.H>
#define c(x) (x*110592/120000)
sbit Ir_Pin=P2^2;
sbit beep=P2^3;
sbit led1=P1^6;
sbit led2=P1^7;
unsigned int ISIR;
unsigned int NUM;
unsigned char Ir_Buf[4]; //用于保存解码结果
//延时
void delay_50ms(unsigned int t)
{
unsigned int j;
for(;t>0;t--)
for(j=6245;j>0;j--)
{;}
}
//
遥控解码低电平检测
unsigned int Ir_Get_Low()
{
TL1=0;
TH1=0;
TR1=1;
while(!Ir_Pin && (TH1&0x80)==0);
TR1=0;
return TH1*256+TL1;
}
//
遥控解码高电平检测
unsigned int Ir_Get_High()
{
TL1=0;
TH1=0;
TR1=1;
while(Ir_Pin && (TH1&0x80)==0);
TR1=0;
return TH1*256+TL1;
}
void Ge
tiR();
main()
{
TMOD=0x11;
while(1)
{
GetIR();
// P1=ISIR; //这里,P1显示正常,跟键值对应,比如输入的键值是0xab,P1显示的是ba,即从P1^7到P1^0是1011 1010。
if(ISIR==0xab) //这里,死活判断不出键值,以下括号内的就无法执行。
{
P1=0xff;
led1=0;
led2=1;
}
P1=0xa8; //得按了遥控以后,才能执行到这句。
}
}
void GetIR()
{
unsigned int temp;
char i,j;
do{
restart:
while(Ir_Pin);
temp=Ir_Get_Low();
if(temp<c(8500) || temp>c(9500)) continue;//引导脉冲低电平9000
temp=Ir_Get_High();
if(temp<c(4000) || temp>c(5000)) continue;//引导脉冲高电平4500
for(i=0;i<4;i++) //4个字节
for(j=0;j<8;j++) //每个字节8位
{
temp=Ir_Get_Low();
//if(temp<c(200) || temp>c(800)) goto restart;
temp=Ir_Get_High();
if(temp<c(200) || temp>c(2000)) goto restart;
Ir_Buf
>>=1;
if(temp>c(1120)) Ir_Buf|=0x80;
}
ISIR=Ir_Buf[2];
beep=0;
delay_50ms(1);
beep=1;
break;
}
while(1);
}
/*从别的程序解出的键值
1 2 3
红 54ab 649b 748b
绿 44bb 04fb 34c6
蓝 708f 51ae 906f
0 619e 916e d02f
1 c03f 817e e51a
4 807f c13e a55a
7 24db 25da a45b
*/
弄明白了,原来是键值弄错了,弄反了,比如第一个键的值应该是0xba45。
一周热门 更多>