标题:
51单片机做红外遥控器,信号发射不出去啊
[打印本页]
作者:
hys123h
时间:
2023-11-30 11:00
标题:
51单片机做红外遥控器,信号发射不出去啊
//模拟格力空调遥控器
//逻辑0 低550us+高550us(或600+600)
//逻辑1 低550us+高1660us(或600+1600)
//9000+4500引导码,
//第一数组数据 0011 1110 , 0111 0000, 0000 0000,0000 1010,
//010 ,低600us+20ms连接码
//第二数组数据 1000 1000, 0000 0010, 0000 0000, 0000 1001
//空闲 低490us+高40ms
//9000+4500引导码,
//第三数组数据 0011 1010, 0111 0000 , 0000 0000, 0000 1110
//010, 低490us+高20ms连接码
//第四数组数据 0000 0000 , 0000 0000, 0000 1011, 0000 100
#include <reg52.h>
sbit sendon =P3^0; //按键
sbit send=P2^1; //发射口
void delay_10us(int us) //10us延时函数//
{
while(us--);
}
void delay0() //逻辑0高低电平脉宽
{
send=0;
delay_10us(64);
send=1;
delay_10us(55);
}
void delay1() //逻辑1高低电平脉宽
{
send=0;
delay_10us(64);
send=1;
delay_10us(168);
}
char arr_time1[]={0x3e,0x70,0x00,0x0a}; //第一组发送的数据
char arr_time2[]={0x88,0x02,0x00,0x09}; //第二组发送的数据
char arr_time3[]={0x3a,0x70,0x00,0x0e}; //第三组发送的数据
char arr_time4[]={0x00,0x00,0x0b,0x08}; //第四组发送的数据
int main()
{
while(1)
{
send=1; //初始高电平
if (sendon==0) //判断按键按下
{
int a,b;
char s1,s2,s3,s4 ;
delay_10us(2000); //判断按键按下
if (sendon==0) //判断按键按下
{
send=0; //9ms低电平引导码
delay_10us(900);
send=1;
delay_10us(450); //4.5ms高电平引导码
for(a=0;a<4;a++) //循环第一个数组的四个数据
{
s1=arr_time1[a]; //将第一个数组赋值到S1
for (b=0;b<8;b++) //将每个数据的8位循环
{
if (s1&0x80) //数据&0x80后进行判断
{
delay1();
}
else
{
delay0();
}
s1 <<= 1; //左移一位再循环判断
}
}
delay0(); //010+高20000us连接码
delay1(); //010+高20000us连接码
delay0(); //010+高20000us连接码
send=0; //010+高20000us连接码
delay_10us(60); //010+高20000us连接码
send=1; //010+高20000us连接码
delay_10us(2000); //010+高20000us连接码
a=0;
b=0;
//s1
for(a=0;a<4;a++) //第二个数组发送
{
s2=arr_time2[a];
for (b=0;b<8;b++)
{
if (s2&0x80)
{
delay1();
}
else
{
delay0();
}
s2 <<= 1;
}
}
send=0; //40ms空闲
delay_10us(49); //40ms空闲
send=1; //40ms空闲
delay_10us(4000); //40ms空闲
//s2
a=0;
b=0;
send=0; //空闲之后再次引导码
delay_10us(900); //9ms低电平引导码
send=1;
delay_10us(450); //4.5ms高电平引导码
for(a=0;a<4;a++) //第三数组发送
{
s3=arr_time3[a];
for (b=0;b<8;b++)
{
if (s3&0x80)
{
delay1();
}
else
{
delay0();
}
s3 <<= 1;
}
}
delay0(); //010+高20000us连接码
delay1(); //
delay0(); //
send=0;
delay_10us(49);
send=1;
delay_10us(2000);
a=0;
b=0;
//s3
for(a=0;a<3;a++) //第四数组发送,第四数组在for循环中只有三个数据
{
s4=arr_time4[a];
for (b=0;b<8;b++)
{
if (s4&0x80)
{
delay1();
}
else
{
delay0();
}
s4 <<= 1;
}
}
delay0(); //第四个数据发送 数据为000100
delay0();
delay0();
delay0();
delay1();
delay0();
delay0();
//s4
while(!sendon); //按键松开
}
}
}
}
用示波器检测输出口有信号,但是用红外线接收头接收不到。
作者:
gongnn
时间:
2023-11-30 13:37
38K载波怎么产生的?
作者:
s1gm
时间:
2023-11-30 14:23
你这是直接发送数据当然不行了,红外遥控是需要38K载频的,要么你在程序里做,要么你在电路里做。
作者:
devcang
时间:
2023-11-30 16:19
软件延时,不是很可靠。
先检测发送的脉冲波形,是否正确
作者:
hys123h
时间:
2023-12-1 10:25
s1gm 发表于 2023-11-30 14:23
你这是直接发送数据当然不行了,红外遥控是需要38K载频的,要么你在程序里做,要么你在电路里做。
38k载波咋做啊,搜了一顿没看懂
作者:
597329015
时间:
2023-12-1 11:03
根据你提供的代码,你在发送红外信号之前已经正确地设置了引导码和逻辑0、逻辑1的时序。然而,有几个可能的原因会导致红外接收器无法接收到信号: 发送功率不足:请确保你的红外发射器输出的红外功率足够强,以便能够被红外接收器接收到。你可以尝试将发射器与接收器之间的距离缩短,并确保没有任何物体阻挡红外信号的传输。 发射频率不匹配:不同品牌和型号的空调使用不同的红外发射频率。请检查你使用的红外发射器和空调遥控器的发射频率是否一致。如果不一致,可能需要更换相应频率的红外发射器。 红外接收器故障:如果你确定发送端的代码和硬件设置都正确无误,但仍然无法接收到红外信号,那么可能是红外接收器本身存在问题。你可以尝试更换一个不同的红外接收器来进行测试。
作者:
a399288395
时间:
2023-12-1 11:23
要有38K的载波信号 才能正确发送和接收; 可以用定时器模拟, 或者外部555产生载波再硬件合成
作者:
coody_sz
时间:
2023-12-1 15:18
红外收发都是简单应用,基本初学者都要过的基本要求。
楼主先产生38K的载波,示波器看看输出了没有?然后加程序用数据调制输出。
作者:
大漠落日
时间:
2023-12-2 08:10
用示波器查看一下载波信号
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1