导航:首页 > 操作系统 > 单片机红外接收电路图

单片机红外接收电路图

发布时间:2022-08-24 21:32:44

㈠ 51单片机遥控器(红外),用什么来接收呢

最好还是买一个红接收头,接收灵敏度高,接收距离远,自己不用加任何电路。加上5V电源就能用了,输出的就是数字信号了,非常适合单片机编程。如HS0038B。

㈡ 红外感应器接入单片机的电路图

http://www.cndzz.com/info/3547-1.htm

微电脑洗手冲水两用控制器

㈢ 这是我设计基于AT单片机的红外对射报警探测器电路图感觉还有点问题求高手指点

看了你的电路,觉得确实有问题。
第一,89C51芯片的驱动能力有限,不能用来直接驱动发光二极管,长期工作有问题,建议换成驱动能力较强的单片机芯片,如STC89C52之类,单口灌电流可到20mA,若坚持使用AT89C51,则发光二极管应通过三极管驱动。
第二,为了避免自然光的干扰,一般会让发光二极管发出一定频率的光,这样光接收电路也要做一定的调整。要采用软件判别采集到的频率。所以建议光接收电路接到int0或者int1或者T0、T1端口上,当然也可以采用红外专用接收管。

㈣ 请教几个关于红外发射接收模块的问题,电路图如下

你好:

——★1、LM 393电压比较器线路,原理是:当+(同向输入端)电位比-(反向输入端)电位时,LM 393 输出高电平;而-端电位比+端电位高时,LM 393 输出低电平


——★2、光耦之间没有物体时,光耦内部的三极管导通、但存在一定的电压降LM 393 +端也就有一定的电位。电位器的作用就是调整 LM 393 反向输入端的基准电压的,可以调整灵敏度。


——★3、LM 393 同向端10 K 电阻,实际上是光耦内三极管的集电极电阻,光耦导通时同名端电位降低、光耦截止时同名端电位升高 ...... 与反向端相比较,就可以输出相应的高、低电平了。

㈤ 请问红外接收头SJ0038在单片机中的连接电路图它对发射管型号有要求吗

这是你要的图,out为输出端

㈥ 谁能帮我分析一下这个学习型红外设备的电路原理(有电路图)

把原理图传上来。

㈦ 红外遥控器原理 遥控器原理图

遥控器是一种用来远控机械的装置。现代的遥控器,主要是由集成电路电板和用来产生不同讯息的按钮所组成。下面一起来看看红外遥控器原理以及遥控器原理图吧。


红外遥控器原理


红外线遥控系统一般由发射器和接收器两部分组成。发射器由指令键、指令信号产生电路、调制电路、驱动电路及红外线发射器组成。当指令键被按下时,指令信号产生电路便产生所需要的控制信号,控制指令信号经调制电路调制后,最终由驱动电路驱动红外线发射器,发出红外线遥控指令信号。


接收器由红外线接收器件、前置放大电路、解调电路、指令信号检出电路、记忆及驱动电路、执行电路组成。当红外接收器件收到发射器的红外指令信号时,它将红外光信号变成电信号并送到前置放大电路进行放大,再经过解调器后,由信号检出电路将指令信号检出,最后由记忆电路和驱动电路驱动执行电路,实现各种操作。


控制信号一般以某些不同的特征来区分,常用的区分指令信号的特征是频率和码组特征,即用不同的频率或者编码的电信号代表不同的指令信号来实现遥控。所以红外遥控系统通常按照产生和区分控制指令信号的方式和特征分类,常分为频分制红外线遥控和码分制红外线遥控。



1红外遥控系统发射部分


红外遥控发射器由键盘矩阵、遥控专用集成电路、驱动电路和红外发光二极管三部分组成,结构如图1所示。

当有键按下时,系统延时一段时间防止干扰,然后启动振荡器,键编码器取得键码后从ROM中取得相应的指令代码(由0和1组成的代码),遥控器一般采用电池供电,为了节省电量和提高抗干扰能力,指令代码都是经32~56kHz范围内的载波调制后输出到放大电路,驱动红外发射管发射出940nm的红外光。当发送结束时振荡器也关闭,系统处于低功耗休眠状态。载波的频率、调制频率在不同的场合会有不同,不过家用电器多采用的是38kHz的,也就是用455kHz的振荡器经过12分频得到的。


遥控发射器的信号是由一串0和1的二进制代码组成的,不同的芯片对0和1的编码有所不同,现有的红外遥控包括两种方式:脉冲宽度调制(PWW)和脉冲位置调制(PPM或曼彻斯特编码)。两种形式编码的代表分别是NEC和PHILIPS的RC-5。


2红外遥控系统接收部分


接收部分是由放大器、限幅器、带通滤波器、解调器、积分器、比较器等组成的,比如采用较早的红外接收二极管加专用的红外处理电路的方法,如CXA20106,此种方法电路复杂,现在一般不采用。但是在实际应用中,以上所有的电路都集成在一个电路中,也就是我们常说的一体化红外接收头。一体化红外接收头按载波频率的不同,型号也不一样。由于与CPU的接口的问题,大部分接收电路都是反码输出,也就是说当没有红外信号时输出为1,有信号输出时为0,它只有三个引脚,分别是+5V电源、地、信号输出。



系统的设计


1单片机编码发射部分


①键盘部分

红外遥控器的发射器电路比较简单,由一个4×4矩形键盘、一个PNP驱动三极管、一个红外线发光二极管和两个限流电阻组成。要遥控哪台接收器由键盘输入,即由键盘输入要红外遥控的地址,地址经过编码、调制后通过红外发光二极管发射出去。

矩阵键盘部分由16个轻触按键按照4行4列排列,将行线所接的单片机的I/O口作为输出端,而列线所接的作为输入。当没有键被按下时,所有输出端都是高电平,代表没有键按下。有键按下时,则输入线就会被拉抵,这样,通过读入输入线的状态就可以知道是否有键被按下。

键盘的列线接到P1口的低4位,行线接到P1口的高4位,列线P1.0~P1.3设置为输入线,行线P1.4~P1.7设置为输出线。

检测当前是否有键被按下。检测的方法是使P1.4~P1.7输出为0,读取P1.0~P1.3的状态,若P1.0~P1.3为全1,则无键闭合,否则有键闭合。

去除键抖动。当检测到有键按下后,延时一段时间再做下一步检测判断。

若有键按下,应该识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4~P1.7按下面4种组合依次输出1110,1101,1011,0111,在每组行输出时读取P1.0~P1.3,若全为1,则表示0这行没有键输入,否则有键闭合。由此得到闭合键的行值和列值,然后采用计算的方法或者查表的方法将闭合键的行值和列值转换成所定义的值。

为了保证每闭合一次CPU仅作一次处理,必须去除键释放时的抖动。产生的键值放在发送数据库区,30H存放的是产生的键值,即要遥控的8位地址共1字节,31H放的是和30H中的相同的8位地址,地址码重发了一次,主要是加强遥控器的可靠性,如果两次地址码不相同,则说明本帧数据有错,应该丢弃。32H放的是00H(为了编程简单),33H放的是0FFH,一共32位数据。要发送数据时,只要到那里读取数据即可,然后调用发射子程序发送。



②载波部分


根据前面介绍的红外遥控的基本原理,红外遥控器编码调制的方法其实很简单,只要生成一定时间长的电平就可以。再通过一个38kHz载波调制便可以发射编码。载波的产生方法有多种,可以由CMOS门电路RC振荡器构成,或者由555时基电路构成等。

在此次设计中采用的是CPU延时,即用定时器中断完成,用单片机的T0定时产生38kHz载波。设定定时器为方式2,即自动恢复初值的8位计数器。TL0作为8位计数器,TH0作为计数初值寄存器,当TL0计数溢出时,一方面置1溢出标志位TF0,向CPU请求中断,同时将TH0内容送入TL0,使TL0从初值开始重新加1计数。因此,T0工作于方式2,定时精度比较高。根据计算,设定38KHz的定时初值,采用12kHz晶振的定时初值为0F3H,用11.0592kHz晶振时的初值为0F4H,设定好定时器中断,在中断程序中只写入取反P2.0(CPLP2.0),当要发送数据1时,前面560μs高电平发送时,先打开定时器中断,再启动定时器,允许定时器工作,延时560μs再关定时器,后面1690μs的低电平因为不发送信号,所以可以直接置P2.0高电平后,延时1690μs即可;数据0前面的560μs高电平和数据1的一样,后面560μs的低电平因为不发送信号,所以可以直接置P2.0高电平后,延时560μs即可。




2红外接收解码电路


红外遥控接收采用一体化红外接收头,它将红外接收二极管、放大器、解调、整形等电路安装在一起,只有三个引脚。红外接收头的信号输出端接单片机的INT0端,单片机中断INT0在红外脉冲下降沿时产生中断。电路如图3.3所示,图中增加一只PNP三极管对输出信号放大,R和C组成去耦电路抑制电源干扰。


3遥控信号的解码算法


平时,遥控器无键按下时,红外发射二极管不发出信号,遥控接收头输出信号1,有键按下时,0和1的编码的高电平经遥控接收头反相后会输出信号0,由于与单片机的中断脚相连,将会引起单片机中断(单片机预先设定为下降沿产生中断)。


遥控码发射时由9ms的高电平和4.5ms的低电平表示引导码,用560μs的高电平和560μs的低电平表示数据“0”,用560μs的高电平和1690μs的低电平表示数据“1”,引导码后面是4字节的数据。接收码是发射码的反向,所以判断数据中的高电平的长度是读出数据的要点,在这里用882μs(560~1690μs之间)作为标尺,如果882μs之后还是高电平则表示是数据1,将1写入寄存器即可(数据为1时还需要再延时一段时间使电平变低,用来检测下一个低电平的开始)。882μs后电平为低电平则表示是数据0,则将0写入寄存器中,之后再等待下一个低电平的到来。


继续接收下面的数据,当接收到32位数据时,说明一帧数据接收完毕,然后判断本次接收是否有效,如果两次地址码相同并且等于本系统的地址码,数据码和数据反码之和等于0FFH,则接收的本帧数据有效,点亮一只发光二极管,否则丢弃本次接收到的数据。


接收完毕后,初始化本次接收到的数据,准备下次遥控接收。


以上就是小编为大家介绍的遥控器原理,希望能够帮助到您。更多关于遥控器原理的相关资讯,请继续关注土巴兔学装修。

㈧ 急求:单片机红外遥控器接受和发射电路图和程序设计,程序最好C语言编的

//ICC-AVR application builder : 5/12/2010 PM 5:48:11
// Target : M8
// Crystal: 8.0000Mhz

#include <iom8v.h>
#include <eeprom.h>
#include <ctype.h>
#include <stdio.h>
#include <macros.h>
#include <string.h>
#include <stdlib.h>
#include <eeprom.h>

#define uchar unsigned char
#define uint unsigned int
#define xtal 8

#define select_a_low (PORTD &=~(1<<7))
#define select_b_hi (PORTD |=(1<<4))
#define select_b_low (PORTD &=~(1<<4))
#define in_result (PINC )
#define raster (PINB & 0x08)
#define ir (PIND & 0x04)
#define pluse_hi (PORTB |=(1<<1))
#define pluse_low (PORTB &=~(1<<1))
#define press (PINB & 0x01)

extern int _textmode;

uchar key_code=0;
uchar new_code=0;
uint buf_key_code=0;
uchar key_bit_count=0;
uint count=0;
uint buf_count=0;
uchar common_code_count=0;
uchar ir_status=0;
uint total[50];
uchar temp=0;
uchar mm=0;
uchar tp1=0;
unsigned long full=0;
uint all=0;
uchar n=0;

void process(uchar ak);

void port_init(void)
{
PORTB = 0xFF;
DDRB = 0xFE;
PORTC = 0x7F; //m103 output only
DDRC = 0x7F;
PORTD = 0xFF;
DDRD = 0x00;
}

void delay_10us(uchar y)
{
uchar x;
for(x=y;x>0;x--)
;
}

//Watchdog initialize
// prescale: 2048K
void watchdog_init(void)
{
WDR (); //this prevents a timeout on enabling
WDTCR |= (1<<WDCE) | (1<<WDE);/* 30-Oct-2006 Umesh*/
WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}

//TIMER0 initialize - prescale:8
// desired value: 50uSec
// actual value: 50.000uSec (0.0%)
void timer0_init(void)
{
TCCR0 = 0x00; //stop
TCNT0 = 0xCE; //set count
TCCR0 = 0x02; //start timer
}

#pragma interrupt_handler timer0_ovf_isr:iv_TIM0_OVF
void timer0_ovf_isr(void)
{
//uint a;

count++;
/*
a=count%2;
if(a==0)
pluse_low;
else
pluse_hi;
*/
TCNT0 = 0xCE; //reload counter value
}

//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = BIT(URSEL) | 0x06;
UBRRL = 0x33; //set baud rate lo
UBRRH = 0x00; //set baud rate hi
UCSRB = 0x18;
}

int putchar(char c)
{
if (_textmode && c == '\n')
putchar('\r');
while (!(UCSRA & (1<<UDRE))) // UDRE, data register empty
;
UDR = c;
return c;
}
void all_zero(void)
{
uchar i;
for(i=0;i<48;i++)
{

total[i]=0;
}
}

void initialize_eeprom(void)
{

all_zero();
timer0_init();

count=0;

}

void display(void)
{
uint i,k,m,w;
uchar s,r,t;
/*
for(i=0;i<35;i++)
printf("total[%d]=%d\r\n",i,total[i]);
*/
m=15;
for(i=0;i<10;i++)
{
if(total[i]>230)
{

m=i;
i=12;
}
}
k=0;

if(0)
{
for(i=0;i<35;i++)
printf("total[%d]=%d\r\n",i,total[i]);
}

//printf("m=%d\r\n",m);
if(m<10)
{
for(i=(m+1);i<(17+m);i++)
{
if(total[i]>18 && total[i]<25)
k>>=1;
if(total[i]>39 && total[i]<45)
{
k>>=1;
k|=0x8000;

}
}

w=0;/*
for(i=(m+17);i<(27+m);i++)
{
if(total[i]>18 && total[i]<25)
w>>=1;
if(total[i]>39 && total[i]<45)
{
w>>=1;
w|=0x8000;

}

}
w>>=6;
printf("K=0x%X total[1]=%d w=0x%x\r\n",k,total[1],w); */
s=0;
for(i=(m+17);i<(25+m);i++)
{
if(total[i]>18 && total[i]<25)
s>>=1;
if(total[i]>39 && total[i]<45)
{
s>>=1;
s|=0x80;

}
}

r=0;
for(i=(m+25);i<(33+m);i++)
{
if(total[i]>18 && total[i]<25)
r>>=1;
if(total[i]>39 && total[i]<45)
{
r>>=1;
r|=0x80;

}

}

t=255-r;
n=0;
if(t==s)
{
printf("s=ox%x, r=0x%x, t=0x%x\r\n",s,r,t);
tp1=12;
switch(s)
{
case 0x43:
n=0x12;

break;

case 0x47:
n=0x16;

break;

case 0x42:
n=0x01;

break;

case 0x41:
n=0x02;

break;

case 0x40:
n=0x03;

break;

case 0x46:
n=0x04;

break;

case 0x45:
n=0x05;

break;

case 0x44:
n=0x06;

break;

case 0x4a:
n=0x07;

break;

case 0x49:
n=0x08;

break;

case 0x48:
n=0x09;

break;
case 0x4e:
n=0x0a;

break;
case 0x4d:
n=0x0;

break;
case 0x4c:
n=0x1a;

break;

case 0x14:
n=0x13;

break;

case 0x16:
n=0x17;

break;

case 0x1d:
n=0x14;

break;

case 0x11:
n=0x10;

break;

case 0x15:
n=0x0e;

break;

}

}

}
}

#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{

if(temp==56)
{
if(count>240)
{

total[0]=count;
count=0;
temp=57;
mm=1;

}
}
else
{
total[mm]=count;
count=0;
mm++;

if(mm>34)
{

CLI();
display();

temp=0;
mm=0;
CLI();
all_zero();
}

}

}

//TIMER1 initialize - prescale:8
// WGM: 0) Normal, TOP=0xFFFF
// desired value: 50uSec
// actual value: 50.000uSec (0.0%)
void timer1_init(void)
{
TCCR1B = 0x00; //stop
TCNT1H = 0xFF; //setup
TCNT1L = 0xCE;
OCR1AH = 0x00;
OCR1AL = 0x32;
OCR1BH = 0x00;
OCR1BL = 0x32;
ICR1H = 0x00;
ICR1L = 0x32;
TCCR1A = 0x00;
TCCR1B = 0x02; //start Timer
}

#pragma interrupt_handler timer1_ovf_isr:iv_TIM1_OVF
void timer1_ovf_isr(void)
{
//TIMER1 has overflowed
TCNT1H = 0xFF; //reload counter high value
TCNT1L = 0xCE; //reload counter low value
full++;

}

//TIMER2 initialize - prescale:8
// WGM: Normal
// desired value: 108uSec
// actual value: 108.000uSec (0.0%)
void timer2_init(void)
{
TCCR2 = 0x00; //stop
ASSR = 0x00; //set async mode
TCNT2 = 0x94; //setup
OCR2 = 0x6C;
TCCR2 = 0x02; //start
}

#pragma interrupt_handler timer2_ovf_isr:iv_TIM2_OVF
void timer2_ovf_isr(void)
{
TCNT2 = 0x94; //reload counter value
all++;
}

//call this routine to initialize all peripherals
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
//watchdog_init();
timer0_init();
uart0_init();

MCUCR = 0x02;
GICR = 0x40;
TIMSK = 0x45; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialized
}

void full_delay(unsigned long b)
{
full=0;
timer1_init();
while(1)
{
if(full>=b)
{
full=0;
TCCR1B = 0x00; //stop timer1
break;
}

}
}

void timer2_delay(uint b)
{

while(1)
{
if(all>(b-1))
{
all=0;
TCCR2 = 0x00; //stop timer2
break;
}

}
}

void zero_one(uint a)
{
uint b;

if(!a)
{
pluse_hi;
b=696/50;
full_delay(b);

pluse_low;
b=348/50;
full_delay(b);

}
else
{
pluse_hi;
b=696/50;
full_delay(b);

pluse_low;
b=1409/50;
full_delay(b);
}

}

void process(uchar ak)
{
uint b,m,i,a,k;
uchar ok;
SEI();
TCCR1B = 0x00; //stop timer1
full=0;
all=0;

pluse_hi;
b=8344/50;
timer2_init();
full_delay(b);

pluse_low;
b=3915/50;
full_delay(b);

m=0x611c;

for(i=0;i<16;i++)
{
a=m & 0x0001;
zero_one(a);
m>>=1;
}
m=0x3dc;
for(i=0;i<10;i++)
{
a=m & 0x0001;
zero_one(a);
m>>=1;
}

ok=255-ak;
k=ok;
k<<=8;
k|=ak;
m=k;
//printf("k=%x\r\n",k);
for(i=0;i<16;i++)
{
a=m & 0x0001;
zero_one(a);
m>>=1;
}

pluse_hi;
b=696/50;
full_delay(b);

pluse_low;
timer2_delay(978);

pluse_hi;
b=8344/50;
full_delay(b);

pluse_low;
b=3915/50;
full_delay(b);

pluse_hi;
b=696/50;
full_delay(b);

pluse_low;

while(!press)
{
;
}

CLI();
}

void main(void)
{
uint a,b,m;
uint k,msg;

init_devices();
delay_10us(1000);
printf("count1=%d\r\n",count);

timer0_ovf_isr();
CLI();
b=0;
m=0;
pluse_low;
tp1=0;
while(1)
{

if(!ir && temp==0 && a==12)
{
a=0;
initialize_eeprom();
temp=56;
count=0;
mm=0;
TCCR2 = 0x00; //stop TIMER2
TCCR1B = 0x00; //stop timer1
//printf("game_start\r\n");
SEI();
}

if(tp1==12)
{
printf("n=%x\r\n",n);
process(n);
all_zero();
CLI();
tp1=0;
}

if(ir)
a=12;

k++;
if(k>30000)
{
msg++;
k=0;
}

if(!ir)
{
msg=0;

}

if( msg>10)
{
all_zero();
msg=0;
temp=0;
CLI();
printf("time out\r\n");
}

if(!press )
{

process(0x08);
}

}

}

㈨ 求一个最简单的红外遥控电路高分。

你好:

——★1、电路图中的右上角,是12V继电器触点的符号。K1是12V继电器的线圈。

——★2、这个红外线发射、接收电路图,是最简单的。但需要专用的红外光敏管(图中的Q1),否则会出现严重的(普通光线)干扰。

——★3、控制“LED做出反应”不需要继电器。请看附图。

——★4、原图中“OUTPUT”是输出的英文,是继电器的触点。

阅读全文

与单片机红外接收电路图相关的资料

热点内容
java面试spring 浏览:143
得物程序员加班厉害吗 浏览:958
h1z1东京服务器地址 浏览:395
海贼王一番赏文件夹什么样 浏览:845
24bit高频精品解压音乐 浏览:181
api程序员遇到更新 浏览:298
程序员程序运行搞笑图 浏览:772
秦思怎么下载app 浏览:691
发抖音怎么发自己的APP网站 浏览:362
androidinbitmap 浏览:774
lzma源码使用 浏览:748
ibm服务器湖南经销商云服务器 浏览:991
正规模板建站配云服务器商家 浏览:876
安卓清楚缓存命令 浏览:380
汽车压缩机电磁离合器损坏怎么修 浏览:508
怎么提取安卓软件 浏览:597
单片机和主机高速传文件 浏览:480
男生直发加密需要剃光头吗 浏览:826
qtdesignerlinux 浏览:433
命令的几要素 浏览:934