❶ 红外发射 单片机 红外接收
单片机一般都是 5V的,红外先导通电压一般在1.2V左右,你可以串一个220-560欧的电阻一灌流的方式连接在单片机任意一脚(如 P1.0)
接收头3只脚,一叫电源正,一脚电源负,一脚是信号脚直接接到单片机的 任意一脚(如 P3.2),这两个东西功率都很低的,接收头待机电流1毫安不到,接收的时候就10毫安左右。发射在电阻为220欧的时候电流也在20毫安不到,没有问题的。
但我需要提示你的是,同一单片机即发送又接受肯定不行的,因为程序做不了,不比串口哦!所以我建议你用两个来做(一个发,一个收),我用电视机遥控器来发送,单片机来接收,译码,用来控制别的东西,效果不错!!
❷ 单片机如何实现红外遥控
以下文件是51单片机实现遥控解码,通过数码管显示键码的程序,P0口驱动数码管段选,p2.6和p2.7为数码管位选,接收头连到P3.2口。此程序以通过验证,可以直接编译使用,另外还有一个继电器和蜂鸣器的控制,不用可以屏蔽掉。
;********************************************************************************
;* 描述: *
;* 遥控键值读取器 *
;* 数码管显示, P0口为数码管的数据口 *
;* *
;********************************************************************************
;遥控键值解码-数码管显示 *
;********************************************************************************/
#include <reg51.h>
#include <intrins.h>
void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();
sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;
unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
TCON = 0x1; //触发方式为脉冲负边沿触发
delay(1);
IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}
} //end main
void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i<4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //确认IR信号出现
while (!IRIN) //等 IR 变为高电平
{delay(1);}
for (j=0;j<4;j++)
{
for (k=0;k<8;k++)
{
while (IRIN) //等 IR 变为低电平
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N>=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] >> 1;
if (N>=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] & 0x0F;
IRCOM[6]=IRCOM[2] & 0xF0;
IRCOM[6]=IRCOM[6] >> 4;
beep();
EA = 1;
}
void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}
void beep()
{
unsigned char i;
for (i=0;i<100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}
void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i<120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
❸ VS1838B红外接收头单片机编码原理是什么具体点的!
首先红外发射接收可以用串口。。
但是我先讲个比较简单的吧,刚开始你红外发射假设你发的是01010101(八位),以450us的低电平和900us的高电平代表“0”;以450us的低电平和1200us的高电平代表“1”;如果发01010101
波形这个你应该可以想象吧?
然后接收的话你用一个以38khz为载波的红外一体化接收头(如:1838);
载波是需要加在发射端的,这个先不讲;
先说接收吧,既然发送的一个0,那怎么去检测一个0呢?
就用一个外部中断加上一个定时器可以吧?(51一般都这么用。如果有捕捉中断的话如avr那就跟方便了,但原理一样),外部中断以下降沿触发;当这个下降沿来的时候开始用定时器计时,一直计时到下一个下降沿,前面说的,(以450us的低电平和900us的高电平代表“0”;以450us的低电平和1200us的高电平代表“1”)如果我检测到两个下降沿之间的时间是1350us那是不是就代表是0,如果是1650us就是1,剩下的就同理了~~~不管你发几位,都是一位发过来我就记录一位,都记录好就开始处理你先接收到0然后是1(01010101) 那我等到这个值后,是不是就代表一种编码? 你也可以是00000000,或者11111111,你发射接收明白了就可以控制了。。。
❹ VS1838B红外接收头单片机编码原理是什么具体点的!
接收红外遥控信号,并进行翻转放大
比如遥控发送
4.5ms高4.5低作为头码,0.56高+0.565低为0;0.56高+1.69低为1
则VS1838B接收输出为
4.5ms低+4.5高作为头码,0.56低+0.565高为0;0.56低+1.69高为1
判断时间长短区分01就OK了