Cynxx 2024-06-04 16:55 采纳率: 0%
浏览 0

红外遥控不能用,怎么才能成功使用红外扫描

img

img

img


为什么没有生成red.h 而且为什么红外遥控还是不行? 还有哪个位置需要修改的,请大家能告诉我一下,该怎么修改才能成功吗?

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-04 16:55
    关注

    引自免费微信小程序:皆我百晓生

    看起来你在尝试编写一个基于51单片机的红外遥控器解码程序,但遇到了一些问题。首先,让我们解决没有生成red.h的问题。根据提供的文件列表,似乎你并没有提供这个头文件的内容。通常,red.h可能包含了与红外遥控相关的结构体、枚举类型、全局变量和函数声明。为了创建一个基本的red.h文件,可以按照下面的样子进行:

    #ifndef RED_H_
    #define RED_H_
    
    // 定义红外解码结果枚举
    typedef enum {
        FAN_OFF,
        FAN_LOW,
        FAN_MEDIUM,
        FAN_HIGH,
        AUTO_MODE,
        MANUAL_MODE,
        EMERGENCY_STOP,
        STOP_FAN
    } InfraredGear;
    
    // 全局变量
    extern InfraredGear InfraredGear;
    extern uchar Flag;
    
    // 函数声明
    uchar decode_infrared_signal(void);
    
    #endif // RED_H_
    

    接下来,我们讨论如何改进红外遥控器的解码逻辑,以便正确识别不同的命令。

    red.c中的decode_infrared_signal()函数应该处理接收到的红外信号,并将它们转换为相应的操作。根据你的描述,你需要检查四个字节:两个用户码,一个数据码,以及一个数据反码。这里是一个简化版的解码函数示例:

    uchar decode_infrared_signal(void) {
        uint data[4]; // 存储四位数据
        uint i, j, k;
        
        for (k = 0; k < 4; k++) { // 读取4个字节
            for (j = 0; j < 8; j++) { // 每个字节读取8位
                uint low_time = 0, high_time = 0;
                
                while ((IRIN == 0) && (low_time < 560)) { // 等待低电平,至少0.56ms
                    delay_10us(1);
                    low_time++;
                }
                
                if (low_time >= 560) {
                    while ((IRIN == 1) && (high_time < 1690)) { // 等待高电平,至少1.69ms
                        delay_10us(1);
                        high_time++;
                    }
                    
                    if (high_time > 1690) {
                        return IR valore_ERROR; // 高电平过长,错误处理
                    }
                    
                    if (high_time < 800) {
                        data[k] |= (1 << (7 - j)); // 如果高电平小于800us,表示1
                    } else {
                        data[k] &= ~(1 << (7 - j)); // 否则表示0
                    }
                } else {
                    return IR valore_ERROR; // 低电平过短,错误处理
                }
            }
            
            IrValue[k] = data[k]; // 将解码后的数据存储到IrValue数组中
        }
    
        if (data[2] != ~data[3]) { // 数据位校验错误
            return IR valore_ERROR;
        }
    
        switch (data[2]) {
            case 69:
                InfraredGear = FAN_LOW;
                break;
            case 70:
                InfraredGear = FAN_MEDIUM;
                break;
            case 71:
                InfraredGear = FAN_HIGH;
                break;
            case 68:
                Flag = 0; // 切换到自动模式
                break;
            case 67:
                Flag = 1; // 切换到手动模式
                break;
            case 64:
                IN1 = 1; // 急停
                break;
            case 21:
                IN1 = 0; // 停止风扇
                break;
            default:
                return IR valore_UNKNOWN_COMMAND;
        }
    
        return IR valore_OK;
    }
    

    确保在main.c或其他适当的地方调用decode_infrared_signal()函数,这样当红外中断发生时,就能正确地解析并执行相应的操作了。

    如果你仍然遇到问题,可能是因为硬件连接或外部干扰导致的。确保你的电路连接无误,包括红外接收头与单片机的接口,以及电源稳定。此外,检查是否有其他设备的红外信号干扰你的接收。

    最后,确保你的红外遥控发送器发送的信号格式与你的接收端匹配,这包括脉冲宽度、编码方式等。如果不一致,你需要调整发送器或者单片机的解码代码以适应实际使用的红外协议。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月4日

悬赏问题

  • ¥15 flutter网页应用用python的http服务器访问速度慢
  • ¥15 VESTA绘图原子颜色显示异常
  • ¥15 天翼云搭建多ip l2tp
  • ¥15 python实现CAD识图
  • ¥15 如何实现在renpy中创建并应用不同大小尺寸对话框?
  • ¥15 table表格有一列是固定列 滑动到最下面时 固定的那一列有几行没显示出来
  • ¥20 单细胞数据注释时报错
  • ¥15 vscode编译ros找不到头文件,cmake.list文件出问题,如何解决?(语言-c++|操作系统-linux)
  • ¥15 通过AT指令控制esp8266发送信息
  • ¥15 有哪些AI工具提供可以通过代码上传EXCEL文件的API接口,并反馈分析结果