用C语言编写的红外发射与接收程序

用C语言编写的红外发射与接收程序,第1张

给你一段430单片机遥控器解码的程序吧,也就是接收部分

毕竟世界太现实只能这么帮你

#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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7782684.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-09
下一篇 2023-04-09

发表评论

登录后才能评论

评论列表(0条)

保存