找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1028|回复: 8
打印 上一主题 下一主题
收起左侧

51单片机做红外遥控器,信号发射不出去啊

[复制链接]
跳转到指定楼层
楼主
ID:1101850 发表于 2023-11-30 11:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//模拟格力空调遥控器

//逻辑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);            //按键松开
    }
        
}   
}
}


用示波器检测输出口有信号,但是用红外线接收头接收不到。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:220661 发表于 2023-11-30 13:37 | 只看该作者
38K载波怎么产生的?
回复

使用道具 举报

板凳
ID:104825 发表于 2023-11-30 14:23 来自手机 | 只看该作者
你这是直接发送数据当然不行了,红外遥控是需要38K载频的,要么你在程序里做,要么你在电路里做。
回复

使用道具 举报

地板
ID:277550 发表于 2023-11-30 16:19 | 只看该作者
软件延时,不是很可靠。

先检测发送的脉冲波形,是否正确
回复

使用道具 举报

5#
ID:1101850 发表于 2023-12-1 10:25 | 只看该作者
s1gm 发表于 2023-11-30 14:23
你这是直接发送数据当然不行了,红外遥控是需要38K载频的,要么你在程序里做,要么你在电路里做。

38k载波咋做啊,搜了一顿没看懂
回复

使用道具 举报

6#
ID:1080331 发表于 2023-12-1 11:03 | 只看该作者
根据你提供的代码,你在发送红外信号之前已经正确地设置了引导码和逻辑0、逻辑1的时序。然而,有几个可能的原因会导致红外接收器无法接收到信号:  发送功率不足:请确保你的红外发射器输出的红外功率足够强,以便能够被红外接收器接收到。你可以尝试将发射器与接收器之间的距离缩短,并确保没有任何物体阻挡红外信号的传输。  发射频率不匹配:不同品牌和型号的空调使用不同的红外发射频率。请检查你使用的红外发射器和空调遥控器的发射频率是否一致。如果不一致,可能需要更换相应频率的红外发射器。  红外接收器故障:如果你确定发送端的代码和硬件设置都正确无误,但仍然无法接收到红外信号,那么可能是红外接收器本身存在问题。你可以尝试更换一个不同的红外接收器来进行测试。
回复

使用道具 举报

7#
ID:230500 发表于 2023-12-1 11:23 | 只看该作者
要有38K的载波信号 才能正确发送和接收; 可以用定时器模拟, 或者外部555产生载波再硬件合成
回复

使用道具 举报

8#
ID:1034262 发表于 2023-12-1 15:18 | 只看该作者
红外收发都是简单应用,基本初学者都要过的基本要求。
楼主先产生38K的载波,示波器看看输出了没有?然后加程序用数据调制输出。
回复

使用道具 举报

9#
ID:195496 发表于 2023-12-2 08:10 | 只看该作者
用示波器查看一下载波信号
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表