红外线遥控c语言程序,红外线遥控解码接收程序-C语言.doc

本文介绍了一种应用于51/52单片机的红外解码程序,特别针对STC12C5410/STC12C2052型号。该程序使用查询法进行红外遥控键值的处理,并详细提供了延时子程序及红外解码的核心代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

>里的评论有很好的诠释.

以上程序段可以应用在51/52单片机里.下面的程序可以应用在STC12C5410/STC12C2052型号的单片机里面.

//在STC12C5410上运用红外线解码程序.主要的问题在于延迟上。

#include #define uchar unsigned char

#define uint unsigned int

#define IR_RE P3_2

bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效

uchar date[4]={0,0,0,0}; //date数组为存放地址原码,反码,数据原码,反码

/*--------------------------延时1ms程子程序-----------------------*/

delay1000()

{

uchar i,j;

i=200;

do{j=13;

do{j--;}

while(j);

i--;

}while(i);

}

//****************************************

/*---------------------------延时882us子程序-----------------------*/

delay882()

{

uchar i,j;

i=84;

do{j=30;

do{j--;}

while(j);

i--;

}while(i);

}

/*--------------------------延时2400us程子程序-----------------------*/

delay2400()

{

uchar i,j;

i=200;

do{j=34;

do{j--;}

while(j);

i--;

}while(i);

}

//**************************************************************

//**************************************************************

/*----------------------------------------------------------*/

/*-----------------------红外解码程序(核心)-----------------*/

/*----------------------------------------------------------*/

void IR_decode()

{

uchar i,j;

while(IR_RE==0);

delay2400();

if(IR_RE==1) //延时2.4ms后如果是高电平则是新码

{

delay1000();

delay1000();

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

while(IR_RE==0); //等待地址码第1位高电平到来

delay882(); //延时882us判断此时引脚电平

///CY=IR_RE;

if(IR_RE==0)

{

date[i]>>=1;

date[i]=date[i]|0x00;

}

else if(IR_RE==1)

{

delay1000();

date[i]>>=1;

date[i]=date[i]|0x80;

}

} //1位数据接收结束

} //32位二进制码接收结束

}

}

//*****************************************************************

//********************************************************************

/*------------------------外部中断0程序-------------------------*/

/*------------------主要用于处理红外遥控键值--------------------*/

void int0() interrupt 0

{

uchar i;

k=0;

EX0=0; //检测到有效信号关中断,防止干扰

for(i=0;i<4;i++)

{

delay1000();

if(IR_RE==1){k=1;} //刚开始为9ms的引导码.

}

if(k==0)

{

// EX0=0; //检测到有效信号关中断,防止干扰

IR_decode(); //如果接收到的是有效信号,则调用解码程序

P1=date[3];

delay2400();

delay2400();

delay2400();

}

EX0=1; //开外部中断,允许新的遥控按键

}

//*********************************************************************

//****************

//主函数。

void main()

{

SP=0x60;

EX0=1;

EA=1;

while(1);

}

通过查询法的遥控解码子程序:

//*************************************

#include #define uchar unsigned char

#define uint unsigned int

#define IR_RE P3_2

bit k=0; //红外解码判断标志位,为0则为有效信号,为1则为无效

uchar date[4]={0,0,0,0}; //date数组为存放地址原码,反码,数据原码,反码

/*--------------------------延时1ms程子程序-----------------------*/

delay1000()

{

uchar i,j;

i=5;

do{j=95;

do{j--;}

while(j);

i--;

}while(i);

}

/*---------------------------延时882us子程序-----------------------*/

delay882()

{

uchar i,j;

i=6;

do{j=71;

do{j--;}

while(j);

i--;

}while(i);

}

/*--------------------------延时2400us程子程序-----------------------*/

delay2400()

{

uchar i,j;

i=5;

do{j=237;

do{j--;}

while(j);

i--;

}while(i);

}

//**************************************************************

//**************************************************************

/*----------------------------------------------------------*/

/*-----------------------红外解码程序(核心)-----------------*/

/*----------------------------------------------------------*/

void IR_decode()

{

uchar i,j;

while(IR_RE==0);

delay2400();

if(IR_RE==1) //延时2.4ms后如果是高电平则是新码

{

delay1000();

delay1000();

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

while(IR_RE==0); //等待地址码第1位高电平到来

delay882(); //延时882us判断此时引脚电平

///CY=IR_RE;

if(IR_RE==0)

{

date[i]>>=1;

date[i]=date[i]|0x00;

}

else if(IR_RE==1)

{

delay1000();

date[i]>>=1;

date[i]=date[i]|0x80;

}

} //1位数据接收结束

} //32位二进制码接收结束

}

}

//*****************************************************************

//********************************************************************

/*------------------主要用于处理红外遥控键值--------------------*/

void jiema()

{

uchar i;

k=0;

for(i=0;i<8;i++)

{

delay1000();

if(IR_RE==1) //刚开始为9ms的引导码.

{

k=1;

break;

}

}

if(k==0)

{

IR_decode(); //如果接收到的是有效信号,则调用解码程序

P0=date[3];

delay2400();

delay2400();

delay2400();

}

}

//*********************************************************************

//********************************

void main()

{

SP=0x60; //堆栈指针

while(1)

{

while(IR_RE==0)

jiema();

}

}

//********************************************

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值