⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir-com.c

📁 SAA3010红外摇控51单片机接收程序,对想学单片机红外的人有帮助!
💻 C
字号:
// 波特率发生器的初值(115200波特率)XTAL 11.0592M
//#define BRGR1_DATA 00   
//#define BRGR0_DATA 0x50
#include <REGX51.H>

sbit WAY_0 = P3^2;
sbit BLK= P3^3;
sbit LED= P1^3;

unsigned char bdata buffer;//发往串口的缓冲器
sbit way0=buffer^0;        
unsigned char irtype;      //RC5一帧的各段的标志

unsigned char count,buf_s[3];       //红外接收位寄存器
unsigned char end;         //红外一帧接收结束标志

void  DelayA(void)
{
	unsigned int TempCyc;
	for (TempCyc=0; TempCyc<650; TempCyc++); //3.5
}



void t0_service(void) interrupt 1 using 1         
{
     //第一次进入中断,为定时1/4位的时间445us
     //以后则定时一位时间1.778ms进入中断
way0=~WAY_0; //一体化解码后,有载频的部分变为低电平

//DelayA();
//DelayA();


//way0=~WAY_0;
TH0=(0xffff-1522)/256;
TL0=(0xffff-1522)%256;
count++;
if((irtype==0)&&(count==3)) //起始码部分2个1和翻转位
{
      buf_s[0]=buffer;
      count=0;
      irtype=1;
      buffer=0;
}
else if((irtype==1)&&(count==5)) //5位地址
{
      buf_s[1]=buffer;
      count=0;
      irtype=2;
      buffer=0;
}
else if((irtype==2)&&(count==6)) //6位命令
{
      buf_s[2]=buffer;
      P0 = ~buffer;
      count=0;
      irtype=3;
      buffer=0;

}
else if(irtype==3) //等最后半位结束,实际延时1位时间
{
TI=0;
count=0;
irtype=0;
buffer=0;
end=1;
TR0=0; //解码结束,定时器停止
return;
}
buffer=buffer<<1;
 if(way0 == 1) buffer++;
}

void powerup( void )
{
TMOD = 0X21; //定时器1为方式2
TL1 = 0xfd;   //置初值,波特率为9600
TH1 = 0xfd;
PCON = 0x00; //SMOD = 0
TR1 = 1;   //启动定时器1
IE=0x82;
SCON = 0x50;
}

void main(void)
{
//unsigned char i;
     WAY_0=1;     //输入首先写1
	 BLK=0;
	 LED=0;
powerup();
while(1)
{
     buffer=0;
     irtype=0;
     count=0;
     end=0;
TH0=(0xffff-381)/256;
TL0=(0xffff-381)%256;
     while (WAY_0);//等待低电平,一帧的开始	 way
	 TR0=1;        //开始定时,红外接收
     while(!end); //等一帧解码结束
//for(i = 0;i<3;i++)
//{
   TI=0;
   SBUF=buf_s[2]+0x30;
   while(!TI);  
//}
     }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -