毕竟世界太现实只能这么帮你
#ifndef _IR_
#define _IR_
char t0,t1,t2
uchar IR
void DelayIR()
{
uint i=130
while(i--)
}
void init_port2(void)
{
P2DIR&=~BIT0
P2SEL&=~BIT0
P2IES|=BIT0
P2IE|=BIT0
}
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR(void)
{
char CounterIR
P2IES&=~BIT0
if(P2IFG&BIT0)
{
P2IFG&=~BIT0
}
CounterIR=0
while(!(P2IN&BIT0))
{
DelayIR()
CounterIR++
}
if(CounterIR>85)
{
if(CounterIR<95)
{
t1++
for(char k=0k<17k++)
{
CounterIR=0
while((P2IN&BIT0)&&(CounterIR<50))
{
DelayIR()
CounterIR++
}
CounterIR=0
while((!(P2IN&BIT0))&&(CounterIR<10))
{
DelayIR()
CounterIR++
}
}
for(char j=0j<8j++)
{
CounterIR=0
while((P2IN&BIT0)&&(CounterIR<25))
{
DelayIR()
CounterIR++
}
IR<<=1
if(CounterIR>11)
IR|=BIT0
CounterIR=0
while((!(P2IN&BIT0))&&(CounterIR<10))
{
DelayIR()
CounterIR++
}
}
if((IR!=0xff)&&(IR!=0x00))
{
if(!(flag&dataflag))
{
if(IR==0x22)
{
flag|=runflag
}
else
{
Tar[0]=Tar[1]
Tar[1]=Tar[2]
Tar[2]=Tar[3]
Tar[3]=Tar[4]
switch (IR)
{
//case 0x22 : flag|=runflagbreak
case 0x68 : Tar[4]=0flag|=dataflagbreak
case 0x30 : Tar[4]=1flag|=dataflagbreak
case 0x18 : Tar[4]=2flag|=dataflagt2++break
case 0x7a : Tar[4]=3flag|=dataflagbreak
case 0x10 : Tar[4]=4flag|=dataflagbreak
case 0x38 : Tar[4]=5flag|=dataflagbreak
case 0x5a : Tar[4]=6flag|=dataflagbreak
case 0x42 : Tar[4]=7flag|=dataflagbreak
case 0x4a : Tar[4]=8flag|=dataflagbreak
case 0x52 : Tar[4]=9flag|=dataflagbreak
default : break
}
}
}
}
IR=0
}
}
for(int m=0m<250m++)
DelayIR()
P2IES|=BIT0
}
#endif
请采纳。
//采用24MHz晶振unsigned
char
inf_dat,inf_old,inf_num,inf_time,inf_run,inf_run_time
void
int_t1(void)
interrupt
3
{
TH1=-0x5
time++
s001++
if
((++inf_run_time)>150)
{inf_run=0inf_run_time=0}
if
(inf_num==0)
inf_time=0
else
if
(inf_num<11)
inf_time++
}
/*
红外线超时
*/
void
int_t0(void)
interrupt
1{
inf_old=0
inf_num=0
inf_time=0
}
/*
红外线低电平时间
*/
void
int_e0(void)
interrupt
0
{
unsigned
char
i
TR0=0
if
(TH0<11)
{
//判断是否间隔波形
if
(inf_num>3)
{
//前面三个波形是相同的,忽略不计
if
(TH0<4)
i=0
else
i=1
//根据低电平的长短处理
inf_old|=iinf_old<<=1
//利用inf_old的8个位来纪录波形
}
else
inf_old=0
//前面三个波形
}
else
inf_num=0
//如果是把计数器清零
TH0=TL0=0
TR0=1
inf_run_time=0
if
((++inf_num)>11)
{
//接收到的计数器大于11(一个红外线信息的个数)
if
((inf_time>24)
&&
(inf_time<28))
{
//接收到11个波形后判别总时间
if
((++inf_run)>250)
inf_run=250
//总时间符合,连续按下标志加一
if
((inf_run==1)
||
(inf_run>10))
inf_dat=inf_old
//按下键第一次有效,之后没效,连续10个后有效,表示连按键
}
inf_old=0
inf_num=0
}
}
void
main(void)
{
TMOD=0x19EA=1ET1=1TR1=1ET0=1
EX0=1IT0=1TH1=-5
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)