谁有红外接收和发射的原理图和源代码全套资料?已解答。
蜗牛-重庆:请问红外接收和发射用哪种管子?
鸿哥-深圳:
淘宝“红外接收管”,三个腿的,外观像直插三极管那种。
鸿哥-深圳:
这是红外发射管:
蜗牛-重庆:
我看红外遥控,需要38K的载波,请问我如果直接给发射管一个电压,接收管能能到信号吗?
鸿哥-深圳:
不能。必须要载波,两个io口控制,一个是PWM输出38K载波,一个是产生数据信号。以下是红外发射的原理图:
蜗牛-重庆:
DATA接口我是不是可以直接连接其它设备的TTL信号就可以呢?
鸿哥-深圳:
对。但是要产生脉冲发送数据。我再给你发一段参考源码,我当时是用PIC单片机做的,是6个通道,你只参考时序脉冲那部分:
void ir_send_data(unsigned char ir_ch,unsigned char ir_key_code,unsigned int ir_user_code)
{
unsigned charir_key_code_temp;
unsigned int ir_user_code_temp;
unsigned charir_send_for;
CCP2CON=CCP2CON|0x0f; //开PWM
if(ir_ch==1)//通道
{
cd4051_C_dr=1; //最高位
cd4051_B_dr=0;
cd4051_A_dr=1; //最低位
}
else if(ir_ch==2)//通道
{
cd4051_C_dr=1; //最高位
cd4051_B_dr=1;
cd4051_A_dr=0; //最低位
}
else if(ir_ch==3)//通道
{
cd4051_C_dr=1; //最高位
cd4051_B_dr=0;
cd4051_A_dr=0; //最低位
}
else if(ir_ch==4)//通道
{
cd4051_C_dr=0; //最高位
cd4051_B_dr=1;
cd4051_A_dr=0; //最低位
}
else if(ir_ch==5)//通道
{
cd4051_C_dr=0; //最高位
cd4051_B_dr=0;
cd4051_A_dr=1; //最低位
}
else if(ir_ch==6)//通道
{
cd4051_C_dr=0; //最高位
cd4051_B_dr=0;
cd4051_A_dr=0; //最低位
}
GIE=0;
ir_send_dr=1;
delay_ir(cnt_delay_9ms);
ir_send_dr=0;
delay_ir(cnt_delay_4_5ms);//引导码
ir_user_code_temp=ir_user_code;
ir_user_code_temp=ir_user_code_temp>>8;
ir_key_code_temp=ir_user_code_temp; //发用户码 低8位
for(ir_send_for=0;ir_send_for<8;ir_send_for++)
{
ir_send_dr=1;
delay_ir(cnt_delay_0_56ms);
if((ir_key_code_temp&0x01)==0x01)//1
{
ir_send_dr=0;
delay_ir(cnt_delay_1_69ms);
}
else //0
{
ir_send_dr=0;
delay_ir(cnt_delay_0_565ms);
}
ir_key_code_temp=ir_key_code_temp>>1;
}
ir_user_code_temp=ir_user_code;
ir_user_code_temp=ir_user_code_temp&0x00ff;
ir_key_code_temp=ir_user_code_temp; //发用户码 高8位
for(ir_send_for=0;ir_send_for<8;ir_send_for++)
{
ir_send_dr=1;
delay_ir(cnt_delay_0_56ms);
if((ir_key_code_temp&0x01)==0x01)//1
{
ir_send_dr=0;
delay_ir(cnt_delay_1_69ms);
}
else //0
{
ir_send_dr=0;
delay_ir(cnt_delay_0_565ms);
}
ir_key_code_temp=ir_key_code_temp>>1;
}
ir_key_code_temp=ir_key_code; //发按键码
for(ir_send_for=0;ir_send_for<8;ir_send_for++)
{
ir_send_dr=1;
delay_ir(cnt_delay_0_56ms);
if((ir_key_code_temp&0x01)==0x01)//1
{
ir_send_dr=0;
delay_ir(cnt_delay_1_69ms);
}
else //0
{
ir_send_dr=0;
delay_ir(cnt_delay_0_565ms);
}
ir_key_code_temp=ir_key_code_temp>>1;
}
ir_key_code_temp=ir_key_code; //发按键的反码
ir_key_code_temp=~ir_key_code_temp;
for(ir_send_for=0;ir_send_for<8;ir_send_for++)
{
ir_send_dr=1;
delay_ir(cnt_delay_0_56ms);
if((ir_key_code_temp&0x01)==0x01)//1
{
ir_send_dr=0;
delay_ir(cnt_delay_1_69ms);
}
else //0
{
ir_send_dr=0;
delay_ir(cnt_delay_0_565ms);
}
ir_key_code_temp=ir_key_code_temp>>1;
}
ir_send_dr=1; //结束位
delay_ir(cnt_delay_0_56ms);
ir_send_dr=0;
delay_ir(cnt_delay_0_565ms);
GIE=1;
CCP2CON=CCP2CON&0xf0; //关PWM模式
cd4051_C_dr=1; //最高位
cd4051_B_dr=1;
cd4051_A_dr=1; //最低位
ir_send_dr=0;
RC1=0;
}
蜗牛-重庆:
谢谢大家。
鸿哥-深圳:
我还有红外接收的参考代码,要不要?是利用外部中断接收的。
蜗牛-重庆:
能给我我一律接收哈,我慢慢消化!
鸿哥-深圳:
这是红外接收图,一个引脚接单片机的外部中断:
鸿哥-深圳:
这是我用PIC单片机做的红外接收代码,你可以参考:
//扫描遥控器数据
void IR_scan()
{
if(RB0==0)
{
pulse_cnt=0; //脉冲计数清零
while(RB0==0) //9ms低电平引导码
{
CLRWDT();
pulse_cnt=pulse_cnt+1;
if(pulse_cnt>cnt_over_9ms) //超出9ms
{
INT0IE=1;
return;
}
}
pulse_cnt=0; //脉冲计数清零
while(RB0==1) //4.5ms高电平引导码
{
CLRWDT();
pulse_cnt=pulse_cnt+1;
if(pulse_cnt>cnt_over_4_5ms) //超出4.5ms
{
INT0IE=1;
return;
}
}
if(pulse_cnt<cnt_4_5ms) //不够4.5ms
{
INT0IE=1;
return;
}
//以上表示通过引导码
beep_dr=0; //关掉蜂鸣器声音,避免出现声音突然加长的偶然现象
voice_time=0;
int_cnt=0;
while(1)
{
CLRWDT();
pulse_cnt=0; //脉冲计数清零
while(RB0==0) //9ms低电平引导码
{
CLRWDT();
pulse_cnt=pulse_cnt+1;
if(pulse_cnt>cnt_over_each)//超出数据间隔
{
INT0IE=1;
return;
}
}
if(pulse_cnt<cnt_each) //不够0.56ms
{
INT0IE=1;
return;
}
//以上表示通过一个数据间隔
pulse_cnt=0; //脉冲计数清零
while(RB0==1) //数据位判断
{
CLRWDT();
pulse_cnt=pulse_cnt+1;
if(pulse_cnt>cnt_over_data)//超出1.69ms
{
INT0IE=1;
return;
}
}
IR_buf=IR_buf>>1;
if(pulse_cnt>cnt_data) //表示是数据1,否则为0
{
IR_buf=IR_buf|0x80000000;
}
else
{
IR_buf=IR_buf&0x7fffffff;
}
int_cnt=int_cnt+1;
if(int_cnt>=32)
{
break;
}
}
IR_buf_update=1; //遥控器有新数据更新
}
}
:):):):):) 鸿哥,你这个的6个通道,是为了只使用一个IO口,来控制6个红外发送头吗? whoyzf 发表于 2015-2-3 13:01
鸿哥,你这个的6个通道,是为了只使用一个IO口,来控制6个红外发送头吗?
对。我项目中是用了好像是模拟开关进行通道切换的。 jianhong_wu 发表于 2015-2-3 16:24
对。我项目中是用了好像是模拟开关进行通道切换的。
嗯。一般哪有一次用这么多发送头啊,
页:
[1]