wszjw2 发表于 2024-8-17 15:00:27

为何移植后的红外发射程序会一直发射信号(已解决)

本帖最后由 wszjw2 于 2024-8-19 16:13 编辑

检测到按键后就一直发射对应的键码,不会停止。在main中发射程序后置cod为0也没用。#include "irsend.h"

/**************声明函数*****************/
void    PCA_config(void);
void    IR_TxPulse(u16 pulse);
void    IR_TxSpace(u16 pulse);
void    IR_TxByte(u8 dat);
void                txcode(void);


void main(void)
{
      ioset();
      PCA_config();
      P_IR_TX = IR_TX_OFF;
EA=1;                //打开总中断

      while(1)
      {
                delay_ms(30);
                txcode();
                cod=0;
      }
}
u8 getcode(void)
{
      u8 keycode;
      
      if(key_mov==0)
      {
               
                delay_us(10);
                if(key_mov==0)keycode=0x45;
      }
                else if(key_add==0)
      {
               
                delay_us(10);
                if(key_add==0)keycode=0x40;
      }
                else if(key_minus==0)
      {
               
                delay_us(10);
                if(key_minus==0)keycode=0x43;
      }
      return keycode;
}

void txcode(void)
{
      cod=getcode();
      if(cod != 0)      //检测到键码
      {
                TxTime = 0;
                              //一帧数据最小长度 = 9 + 4.5 + 0.5625 + 24 * 1.125 + 8 * 2.25 = 59.0625 ms
                              //一帧数据最大长度 = 9 + 4.5 + 0.5625 + 8 * 1.125 + 24 * 2.25 = 77.0625 ms
                IR_TxPulse(342);    //对应9ms,同步头       9ms
                IR_TxSpace(171);    //对应4.5ms,同步头间隔 4.5ms
                IR_TxPulse(21);   //开始发送数据          0.5625ms

                IR_TxByte(User_code%256);   //发用户码低字节
                IR_TxByte(User_code/256);   //发用户码高字节
                IR_TxByte(cod);         //发数据
                IR_TxByte(~cod);      //发数据反码
            
                if(TxTime < 56)   //一帧按最大77ms发送, 不够的话,补偿时间   108ms
                {
                        TxTime = 56 - TxTime;
                        TxTime = TxTime + TxTime / 8;
                        delay_ms(TxTime);
                }
                delay_ms(31);
               
                        /*while(IO_KeyState != 0) //键未释放发送连发码
                        {
                              IR_TxPulse(342);    //对应9ms,   同步头      9ms
                              IR_TxSpace(86);   //对应2.25ms,同步头间隔    2.25ms
                              IR_TxPulse(21);   //开始发送数据            0.5625ms
                              delay_ms(96);
                        }*/
      }
}
/************* 发送脉冲函数 **************/
void    IR_TxPulse(u16 pulse)
{
    tx_cnt = pulse;
    B_Space = 0;    //发脉冲
    CCAPM2 = 0x48 | 0x04 | 0x01;    //工作模式 0x00: PCA_Mode_Capture,0x42: PCA_Mode_PWM,0x48: PCA_Mode_SoftTimer
    CR = 1;   //启动
    while(CR);
    P_IR_TX = IR_TX_OFF;
}
/************* 发送空闲函数 **************/
void    IR_TxSpace(u16 pulse)
{
    tx_cnt = pulse;
    B_Space = 1;    //空闲
    CCAPM2 = 0x48 | 0x01;   //工作模式 0x00: PCA_Mode_Capture,0x42: PCA_Mode_PWM,0x48: PCA_Mode_SoftTimer
    CR = 1;   //启动
    while(CR);
    P_IR_TX = IR_TX_OFF;
}
/************* 发送一个字节函数 **************/
void    IR_TxByte(u8 dat)
{
    u8 i;
    for(i=0; i<8; i++)
    {
      if(dat & 1)   IR_TxSpace(63), TxTime += 2;    //数据1对应 1.6875 + 0.5625 ms
      else            IR_TxSpace(21), TxTime++;       //数据0对应 0.5625 + 0.5625 ms
      IR_TxPulse(21);         //脉冲都是0.5625ms
      dat >>= 1;            //下一个位
    }
}

//========================================================================
// 函数: void   PCA_config(void)
// 描述: PCA配置函数.
// 参数: None
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void    PCA_config(void)
{
    //PCA0初始化
    CCON = 0x00;    //清除所有中断标志
    CCAPM0= 0x48 | 0x01;//工作模式 + 中断允许 0x00: PCA_Mode_Capture,0x42: PCA_Mode_PWM,0x48: PCA_Mode_SoftTimer
    PCA_Timer0 = 100;       //随便给一个小的初值
    CCAP0L = (u8)PCA_Timer0;    //将影射寄存器写入捕获寄存器,先写CCAP0L
    CCAP0H = (u8)(PCA_Timer0 >> 8); //后写CCAP0H

    PPCA = 1;   //高优先级中断
    CMOD= (CMOD& ~0xe0) | 0x08; //选择时钟源, 0x00: 12T, 0x02: 2T, 0x04: Timer0溢出, 0x06: ECI, 0x08: 1T, 0x0A: 4T, 0x0C: 6T, 0x0E: 8T
    CH = 0;
    CL = 0;
    CR = 0;
    tx_cnt = 2;
}

//========================================================================
// 函数: void   PCA_Handler (void) interrupt PCA_VECTOR
// 描述: PCA中断处理程序.
// 参数: None
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================

#define D_38K_DUTY((MAIN_Fosc * 26) / 1000000UL + MAIN_Fosc / 3000000UL)/*38KHZ周期时间   26.3us */
#define D_38K_OFF   ((MAIN_Fosc * 17) / 1000000UL + MAIN_Fosc / 3000000UL)/* 发射管关闭时间   17.3us */
#define D_38K_ON    ((MAIN_Fosc * 9) / 1000000UL)                           /* 发射管导通时间   9us */

void    PCA_Handler (void) interrupt 7
{
    CCON = 0x40;    //清除所有中断标志,但不关CR
    if(!B_Space)    //发送载波
    {                               //发送脉冲,交替装载TH0值,溢出时自动重装
      P_IR_TX = ~P_IR_TX;
      if(P_IR_TX)
      {
            PCA_Timer0 += D_38K_OFF;    //装载高电平时间    17.3us
            if(--tx_cnt == 0)   CR = 0; //pulse has sent,   stop
      }
      else    PCA_Timer0 += D_38K_ON; //装载低电平时间    9us
    }
    else    //发送暂停时间
    {
      PCA_Timer0 += D_38K_DUTY;   //装载周期时间26.3us
      if(--tx_cnt == 0)   CR = 0; //空闲时间
    }
    CCAP0L = (u8)PCA_Timer0;            //将影射寄存器写入捕获寄存器,先写CCAP0L
    CCAP0H = (u8)(PCA_Timer0 >> 8); //后写CCAP0H
}

DebugLab 发表于 2024-8-17 15:28:53

https://www.stcaimcu.com/data/attachment/forum/202408/17/152255rv39jwiglldgvila.jpg

https://www.stcaimcu.com/data/attachment/forum/202408/17/152527d65kc4284pzhii6i.jpg

发一次数据的就这一块,其他不需要的可以删除,还有就是按键需要边沿检测,持续按着只发一次

hsrzq 发表于 2024-8-19 10:20:57

因为你main里面的cod和txcode里面的cod没有任何关系,所以在main里面赋值当然不会影响到txcode方法的执行了

wszjw2 发表于 2024-8-19 16:13:27

hsrzq 发表于 2024-8-19 10:20
因为你main里面的cod和txcode里面的cod没有任何关系,所以在main里面赋值当然不会影响到txcode方法的执行了 ...

确实是这个问题

huatlwangl 发表于 2024-10-16 10:22:11

DebugLab 发表于 2024-8-17 15:28
发一次数据的就这一块,其他不需要的可以删除,还有就是按键需要边沿检测,持续按着只发一次
...

请教下怎么实现边沿检测,持续按着只发送一次

Lkck8210 发表于 2024-10-16 12:00:33

本方法
u8 getcode(void)
{
        u8 keycode;

        if(key_mov==0)
        {

                delay_us(10);
                if(key_mov==0)
                {
                        keycode=0x45;
                        while(key_mov==0);
                        }
        }
        else if(key_add==0)
        {

                delay_us(10);
                if(key_add==0)
                {
                        keycode=0x40;
                        while(key_add==0);
                }
        }
        else if(key_minus==0)
        {

                delay_us(10);
                if(key_minus==0)
                {
                        keycode=0x43;
                        while(key_minus==0);
                }
        }
        return keycode;
}

angalp 发表于 2024-10-20 08:43:27

学习了
页: [1]
查看完整版本: 为何移植后的红外发射程序会一直发射信号(已解决)