红外遥控系统之二:GPIO模拟红外遥控发射

(1)NEC码的发射完整波形图诠释如下(接收与发射反向):

                   

 

(2)用一个GPIO口模拟IR,来输出到另一个接收端,程序如下:
void Simulate_IR_Init(void) //GPIO初始化
{
       MFT4MOD=0;
       PTDIR0_4=1;   //设置输出
       IR_LINE=1;   //默认为高,IR脚的默认电平也是为高
}
void  T_560US(void)
{
        BusWait(_560us); //使用一定的机器时间来耗时,精度可以用示波器来测出
}
void  T_1680US(void)   //3个560US
{
        T_560US();
        T_560US();
        T_560US();
}
void T_500US(void)
{
        BusWait(_500_us);
}
void  T_1MS(void)
{
        T_500US();
        T_500US(); 
}
void T_9MS(void)    //开始码
{
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
}
void T_4_5_MS(void)    //结果码
{
        T_1MS();
        T_1MS();
        T_1MS();
        T_1MS();
        T_500US();
}
void send_d0(void)       //发数据0,参照上述图示反向
{
        IR_LINE=0;
        T_560US();
        IR_LINE=1;
        T_560US();
}
void send_d1(void) //发数据1,参照上述图示反向
{
        IR_LINE=0;
        T_560US();
        IR_LINE=1;
        T_1680US();
}
void send_ir_byte(uchar tp)   //发送一个字节
{
        uchar i;
        for(i=0;i<8;i++)
        {
                if(tp&0x80)
                {
                       send_d1();
                }
                Else
                {
                       send_d0();
                }
                tp<<=1;      //从高位往低位发送
        }
}
void ir_start(void)         //NEC遥控码起始条件
{
        IR_LINE=0;
        T_9MS();
        IR_LINE=1;
        T_4_5_MS();
}
void send_ir_key(uchar key)    //发送单个遥控码的完整程序
{
        Simulate_IR_Init();          //初始化GPIO
        ir_start();                        //NEC起始


        send_ir_byte(IR_USER_CODE);    //客户码
        send_ir_byte(~IR_USER_CODE);   //客户码反码
        send_ir_byte(key);                      //数据码
        send_ir_byte(~key);                    //数据码反码


        IR_LINE=0;
        T_560US();   //为了跟最后一个数据位区别开来,如上图所示


        IR_LINE=1; //恢复默认的高
}

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
使用红外遥控模块进行GPIO控制时,你需要进行以下步骤来设计代码: 1. 初始化红外接收模块的GPIO引脚。 ```c // 假设红外接收模块的信号引脚连接到GPIOA的Pin0引脚 #define IR_RECEIVER_PIN GPIO_Pin_0 #define IR_RECEIVER_PORT GPIOA // 使能GPIOA时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); // 初始化GPIOA引脚 GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Pin = IR_RECEIVER_PIN; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN; GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(IR_RECEIVER_PORT, &GPIO_InitStruct); ``` 2. 在主循环中读取红外接收模块的GPIO状态。 ```c while (1) { if (GPIO_ReadInputDataBit(IR_RECEIVER_PORT, IR_RECEIVER_PIN) == Bit_RESET) { // 接收到红外信号时,执行相应的动作 // 这里可以调用相应的函数来处理接收到的信号 } } ``` 3. 根据你所使用的红外遥控模块的编码方式和协议,进行信号的解码和处理。 这一步需要根据具体的红外编码方式和协议进行相应的处理。一般来说,你需要使用定时器计算红外信号的高低电平持续时间,通过持续时间来判断按键的编码。具体的解码过程可能需要使用外部库或者自行编写解码函数来完成。 ```c // 假设你有一个名为IR_Decode的函数来进行红外信号解码 uint32_t key = IR_Decode(); // 解码红外信号,得到按键编码 // 根据按键编码执行相应的动作 switch (key) { case KEY_FORWARD: // 执行前进动作 break; case KEY_BACKWARD: // 执行后退动作 break; case KEY_LEFT: // 执行左转动作 break; case KEY_RIGHT: // 执行右转动作 break; // 其他按键处理... } ``` 这里只是一个基础的代码框架,具体的红外编码解析和动作执行过程需要根据你所使用的红外遥控模块和协议进行相应的设计和实现。 希望以上信息对你有所帮助!如有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值