
你好:
——★1、LM 393 为电压比较器线路,原理是:当+(同向输入端)电位比-(反向输入端)电位高时,LM 393 输出高电平;而-端电位比+端电位高时,LM 393 输出低电平。
——★2、当光耦之间没有物体时,光耦内部的三极管导通、但存在一定的电压降,LM 393 +端也就有一定的电位。电位器的作用就是调整 LM 393 反向输入端的基准电压的,可以调整灵敏度。
——★3、LM 393 同向端的 10 K 电阻,实际上是光耦内三极管的集电极电阻,光耦导通时同名端电位降低、光耦截止时同名端电位升高 与反向端相比较,就可以输出相应的高、低电平了。
1> 准备一根手机耳机线
2> 准备一支两脚红外接收管
3> 将手机耳机线的GND端接红外管的正极,MIC端接红外管负极
4> 将耳机线另一端插手机耳机孔上,开启手机录音软件(例如RecForge)
5> 用家用的红外遥控器对着红外接收管按
6> 在手机录音的波形观察界面,可以看到信号波形
以此为原理,通过手机编程解析录制好的波形音频,可以完成信号的解析
给你一个PIC写的接收红外遥控器的程序。
//
//mcu: PIC16F883
//author:
//data:
//ver: 10
//
#include <pich>
#include <pic16f887h>
#include "mainh"
// 函数声明部份
void interrupt IRQ_TEST(void);
void fun_intset(void);
void set_port(void);
void fun_timerset(void);
void delay_10us(void);
void delay_130us(void);
void test_remote(void);
// 主函数
void main()
{
set_port();
fun_timerset();
fun_intset();
delay_10ms();
ram_ini();
GIE=1;
while(1)
{
asm("clrwd");
test_remote();
}
}
//端口I/O定义子程序
void set_port()
{
ANSEL =0X00; //porta io port
ANSELH=0X00; //portb io port
//TRISX BIT=1, PORTX AS INPUT
TRISA = 0x0F; //RA0-RA3 INPUT ,RA4-RA5 OUTPUT
TRISB = 0x07; //RB0 PASS0, RB1-RB2 INPUT ,RB3-RB6 OUTPUT
TRISC = 0x0F;
// TRISC = 0x03; //RC0-RC1 INPUT,RC5-RC6 OUTPUT , RC3 RC4 EEPROM SCL SDA
PORTC=0;
PORTA=0XFF;
// WPUB=0XFF;
PORTB=0X07;
}
//中断子程序
void interrupt IRQ_TEST(void)
{
if(T0IF) //Timer0中断服务子程序
{
TMR0=0xce;
T0IF=0;
timer_100us++; //100us
}
if(INTF==1)
{
INTF=0;
timer_rec=timer_100us;
timer_100us=0;
flag_rec_remote=1;
}
}
//定时器0初始化设置子程序
void fun_timerset()
{
//Timer0初始化设置
PSA=0;//Timer0 使用预分频器
//Timer0选择分频率为1:2
PS0=0;PS1=0;PS2=0;
//内部时钟定时方式,定时时间:200uS,误差:0uS
T0CS=0;
// TMR0=0x9b;
TMR0=0xce; //100us
}
/
//定时器2初始化设置子程序
void fun_timer2set()
{
//Timer2初始化设置
//timer2使用预分频率1:1
T2CKPS0=0;T2CKPS1=0;
//timer2使用后分频率1:1
TOUTPS0=0;
TOUTPS1=0;
TOUTPS2=0;
TOUTPS3=0;
//定时器2定时时间为:200uS,误差:0uS
TMR2=0x38;
TMR2ON=1;
}
/
//中断允许设置子程序
void fun_intset()
{
T0IE=1;//Tiemr0中断允许
INTEDG=0; //RB0 FALLAGE INTERRUPT
INTE=1;
INTF=0;
}
void ram_ini(void)
{
}
//------------------------------------------------------------
//
void delay_10us(void)
{
NOP;
NOP;
NOP;
NOP;
NOP;
NOP;
}
void delay_130us(void)
{
uchar i;
for(i=0;i<13;i++)
{
NOP;
NOP;
NOP;
}
}
void delay_10ms(void)
{
unsigned int i;
for(i=0;i<1000;i++)
{
NOP;
NOP;
NOP;
NOP;
NOP;
}
}
void test_remote(void)
{
uchar rec_ok,i;
if(flag_rec_remote==1)
{
flag_rec_remote=0;
// remote_buf[rec_byte]=timer_rec; //test use
// rec_byte++; //test use
// return; //test use
if(flag_rec_head==0)
{
if(timer_rec>=90&&timer_rec<=140) //135
{
flag_rec_head=1;
rec_byte=0;
rec_bit=0;
rec_buf=0;
return;
}
}
else
{
if(timer_rec>=8&&timer_rec<=12) //112
{
rec_buf=(rec_buf>>1);
rec_buf=rec_buf&0x7f;
}
else if(timer_rec>=18&&timer_rec<=22) //22
{
rec_buf=(rec_buf>>1);
rec_buf=rec_buf|0x80;
}
else if(timer_rec>=90&&timer_rec<=140)
{
flag_rec_head=1;
rec_byte=0;
rec_bit=0;
rec_buf=0;
return;
}
else
{
flag_rec_head=0;
rec_byte=0;
rec_bit=0;
rec_buf=0;
return;
}
}
if(flag_rec_head==1)
{
rec_bit++;
if(rec_bit==8)
{
remote_buf[rec_byte]=rec_buf;
rec_byte++;
rec_bit=0;
if(rec_byte==4)
{
NOP;
NOP;
NOP;
NOP;
rec_byte=0;
rec_bit=0;
rec_buf=0;
flag_rec_head=0;
}
}
}
}
}
#include\x0d\#include\x0d\#define uchar unsigned char\x0d\#define uint unsigned int\x0d\sbit lcden = P2^7;\x0d\sbit lcdrs = P2^6;\x0d\sbit lcdwr = P2^5;\x0d\sbit IR = P3^2;\x0d\uchar IRCOM[6];//数组,用于存储红外编码\x0d\uchar code table1[] = "remote control";\x0d\uchar code table2[] = "CODE:";\x0d\void delayms(uchar x)// 延时x014ms\x0d\{\x0d\uchar i;\x0d\while(x--)\x0d\for(i=0;i//延时xms\x0d\{\x0d\uchar i,j;\x0d\for(i=x;i>0;i--)\x0d\for(j=110;j>0;j--);\x0d\}\x0d\/LCD部分/\x0d\void write_com(uchar com)\x0d\{\x0d\lcden = 0;\x0d\lcdrs = 0;\x0d\lcdwr = 0;\x0d\P0 = com;\x0d\delay(5);\x0d\lcden = 1;\x0d\delay(5);\x0d\lcden = 0;//别忘了lcden拉低\x0d\}\x0d\void write_date(uchar date)\x0d\{\x0d\lcden = 0;\x0d\lcdrs = 1;\x0d\lcdwr = 0;\x0d\P0 = date;\x0d\delay(5);\x0d\lcden = 1;\x0d\delay(5);\x0d\lcden = 0;\x0d\}\x0d\void lcd_init(void)\x0d\{\x0d\lcden = 0;\x0d\lcdrs = 0;\x0d\lcdwr = 0;\x0d\delay(5);\x0d\write_com(0x38);\x0d\write_com(0x0c);\x0d\write_com(0x06);\x0d\write_com(0x01);\x0d\}\x0d\/main()/\x0d\void main(void)\x0d\{\x0d\uchar count=0;\x0d\IR = 1;\x0d\lcd_init();\x0d\write_com(0x80);\x0d\while(table1[count]!='\0')\x0d\{\x0d\write_date(table1[count]);\x0d\count++;\x0d\delay(5);\x0d\}\x0d\count = 0;\x0d\write_com(0x80+0x40);\x0d\while(table2[count]!='\0')\x0d\{\x0d\write_date(table2[count]);\x0d\count++;\x0d\delay(5);\x0d\}\x0d\\x0d\IE = 0x81; //开中断\x0d\TCON = 0x01;//脉冲负边沿触发\x0d\while(1);\x0d\\x0d\}\x0d\/红外中断/\x0d\void IR_time() interrupt 0 \x0d\{\x0d\uchar i,j,TimeNum=0;//TimeNum用来计IR高电平次数 从而判断是0还是1\x0d\EX0 = 0; //关闭中断\x0d\delayms(5);\x0d\if(1 == IR)\x0d\{\x0d\EX0 = 1;\x0d\return;\x0d\}\x0d\while(!IR) //跳过9ms前导低电平\x0d\delayms(1);\x0d\for(i=0;i{\x0d\for(j=0;j{\x0d\while(IR) //跳过45ms的前导高电平\x0d\delayms(1);\x0d\while(!IR) //跳过056ms的低电平\x0d\delayms(1);\x0d\\x0d\while(IR) \x0d\{\x0d\TimeNum++; //计时高电平时间从而判断读取的是0还是1\x0d\delayms(1);\x0d\}\x0d\if(TimeNum>=30)//按键按下时间过长 跳过\x0d\{\x0d\EX0 = 1;\x0d\return;\x0d\}\x0d\IRCOM[i] = IRCOM[i]>>1;\x0d\if(TimeNum >= 8) //8014ms 这时读取的是1;\x0d\{\x0d\IRCOM[i] = IRCOM[i]|0x80;\x0d\}\x0d\TimeNum = 0;\x0d\}\x0d\}\x0d\if(IRCOM[2]!=~IRCOM[3])//判断八位数据和八位数据反码是否相等\x0d\{\x0d\EX0 = 1;\x0d\return;\x0d\}\x0d\IRCOM[4] = IRCOM[2]&0x0f;//取低四位\x0d\IRCOM[5] = IRCOM[2]>>4; //IRCOM[5]取IRCOM[2]高四位\x0d\if(IRCOM[4] > 9) //转换成字符\x0d\{\x0d\IRCOM[4] = IRCOM[4] + 0x37;\x0d\}\x0d\else\x0d\IRCOM[4] = IRCOM[4] + 0x30;\x0d\if(IRCOM[5] > 9)\x0d\{\x0d\IRCOM[5] = IRCOM[5] + 0x37;\x0d\}\x0d\else\x0d\IRCOM[5] = IRCOM[5] + 0x30;\x0d\delay(5);\x0d\write_com(0x80 + 0x40 + 5);\x0d\write_date(IRCOM[5]);\x0d\write_date(IRCOM[4]);\x0d\EX0 = 1; //重新开启外部中断\x0d\}
红外发射、接收模块,三根线定义为电源、地、信号。
方法一:红外模块的信号可直接接ESP8266的IO脚,利用esp8266模块的MCU对红外模块进行控制接收,此方法硬件成本低,连接简单,但需要对ESP8266模块进行二次编程开发;
方法二:利用你熟悉的单片机,把ESP8266与红外模块连接起来。好处是可以利用你熟悉的环境进行编程解决,缺点是硬件成本加大。
个人建议使用方法一,懂单片机开发的人,对esp8266二次开发也容易上手。
以上就是关于请教几个关于红外发射接收模块的问题,电路图如下全部的内容,包括:请教几个关于红外发射接收模块的问题,电路图如下、怎么自己做38红外接收模块、单片机控制红外程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)