红外模块 51单片机

红外线 波长0.76~1.5um
为将信号发送出去,经常会将二进制数据信号调制成脉冲信号,通过红外发射管发射。常用的有脉冲宽度调制(PWM)和脉冲位置调制(PPM)。
选择合适的红外接收设备(即知道红外遥控器的编码方式和载波频率),选取一体化红外接收头和指定阶码方案。
传输的数据格式:
数据格式包括引导码、用户码、数据码和数据反码,共32位。区分每位的0和1时利用脉冲的时间间隔来区别,即PPM。

以下为在ATM89C52上的执行代码。
出红外模块外,还调用了数码管模块。
此处用到了74HC138译码器和74HC245总线收发器。

#include "reg52.h"

typedef unsigned int uint;   		
typedef unsigned char uchar;

sbit LSA = P2^2;        //数码管选通端
sbit LSB = P2^3;		//数码管选通端
sbit LSC = P2^4;		//数码管选通端

sbit IRIN = P3^2;       //红外数据传输端

uchar IrValue[6];
uchar Time;

uchar DisplayData[8];
uchar code smgduan[17] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0X76};  //0~F、H

void delay(uint i)
{
	while (i--);
}

void DigDisplay()
{
	uchar i;
	for(i=0;i<3;i++)
	{
		switch(i)
		{
			case(0):
				LSA=0;LSB=0;LSC=0;break;
			case(1):
				LSA=1;LSB=0;LSC=0;break;
			case(2):
				LSA=0;LSB=1;LSC=0;break;
		}
		P0=DisplayData[2-i];
		delay(100);
		P0=0x00;
	}
}

void IrInit()
{
	IT0=1;		 //下降沿触发
	EX0=1;		 //打开中断0允许
	EA=1;		 //打开总中断
	IRIN=1;		 //初始化端口
}

void ReadIr() interrupt 0
{
	uchar j,k;
	uint err;
	Time = 0;
	delay(700);
	if(IRIN==0)
	{
		err=1000;	//等待10ms
		while((IRIN==0)&&(err>0))
		{
			delay(1);
			err--;
		}
		if(IRIN==1)
		{
			err=500;	 //等待5ms
			while((IRIN==1)&&(err>0))
			{
				delay(1);
				err--;
			}
			for(k=0;k<4;k++)
			{
				for(j=0;j<8;j++)
				{
					err=60;
					while((IRIN==0)&&(err>0))
					{
						delay(1);
						err--;
					}
					err = 500;
					while((IRIN==1)&&(err>0))
					{
						delay(10);	//100为1ms
						Time++;
						err--;
						if(Time>30)
						{
							return;
						}	
					}
					IrValue[k]>>=1;
					if(Time>=8)
					{
						IrValue[k]|=0x80;
					}
					Time=0;	
				}
			}
		}
		if(IrValue[2]!=~IrValue[3])
		{
			return;
		}
	}	
}

void main()
{
	IrInit();
	while(1)
	{
		DisplayData[0] = smgduan[IrValue[2]/16];
		DisplayData[1] = smgduan[IrValue[2]%16];
		DisplayData[2] = smgduan[16];
		}  
}

你可能感兴趣的:(红外模块,51单片机,嵌入式,嵌入式)