找回密码
 立即注册
查看: 386|回复: 6

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

[复制链接]
  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-28 10:23:12

11

主题

93

回帖

469

积分

中级会员

积分
469
发表于 2024-8-17 15:00:27 | 显示全部楼层 |阅读模式
本帖最后由 wszjw2 于 2024-8-19 16:13 编辑
  1. 检测到按键后就一直发射对应的键码,不会停止。在main中发射程序后置cod为0也没用。
复制代码
  1. #include "irsend.h"
  2. /**************声明函数*****************/
  3. void    PCA_config(void);
  4. void    IR_TxPulse(u16 pulse);
  5. void    IR_TxSpace(u16 pulse);
  6. void    IR_TxByte(u8 dat);
  7. void                txcode(void);
  8. void main(void)
  9. {
  10.         ioset();
  11.         PCA_config();
  12.         P_IR_TX = IR_TX_OFF;
  13.   EA=1;                //打开总中断
  14.         while(1)
  15.         {
  16.                 delay_ms(30);
  17.                 txcode();
  18.                 cod=0;
  19.         }
  20. }
  21. u8 getcode(void)
  22. {
  23.         u8 keycode;
  24.         
  25.         if(key_mov==0)
  26.         {
  27.                
  28.                 delay_us(10);
  29.                 if(key_mov==0)keycode=0x45;
  30.         }
  31.                 else if(key_add==0)
  32.         {
  33.                
  34.                 delay_us(10);
  35.                 if(key_add==0)keycode=0x40;
  36.         }
  37.                 else if(key_minus==0)
  38.         {
  39.                
  40.                 delay_us(10);
  41.                 if(key_minus==0)keycode=0x43;
  42.         }
  43.         return keycode;
  44. }
  45. void txcode(void)
  46. {
  47.         cod=getcode();
  48.         if(cod != 0)        //检测到键码
  49.         {
  50.                 TxTime = 0;
  51.                                 //一帧数据最小长度 = 9 + 4.5 + 0.5625 + 24 * 1.125 + 8 * 2.25 = 59.0625 ms
  52.                                 //一帧数据最大长度 = 9 + 4.5 + 0.5625 + 8 * 1.125 + 24 * 2.25 = 77.0625 ms
  53.                 IR_TxPulse(342);    //对应9ms,同步头       9ms
  54.                 IR_TxSpace(171);    //对应4.5ms,同步头间隔 4.5ms
  55.                 IR_TxPulse(21);     //开始发送数据          0.5625ms
  56.                 IR_TxByte(User_code%256);   //发用户码低字节
  57.                 IR_TxByte(User_code/256);   //发用户码高字节
  58.                 IR_TxByte(cod);         //发数据
  59.                 IR_TxByte(~cod);        //发数据反码
  60.             
  61.                 if(TxTime < 56)     //一帧按最大77ms发送, 不够的话,补偿时间     108ms
  62.                 {
  63.                         TxTime = 56 - TxTime;
  64.                         TxTime = TxTime + TxTime / 8;
  65.                         delay_ms(TxTime);
  66.                 }
  67.                 delay_ms(31);
  68.                
  69.                         /*while(IO_KeyState != 0) //键未释放发送连发码
  70.                         {
  71.                                 IR_TxPulse(342);    //对应9ms,   同步头        9ms
  72.                                 IR_TxSpace(86);     //对应2.25ms,同步头间隔    2.25ms
  73.                                 IR_TxPulse(21);     //开始发送数据              0.5625ms
  74.                                 delay_ms(96);
  75.                         }*/
  76.         }
  77. }
  78. /************* 发送脉冲函数 **************/
  79. void    IR_TxPulse(u16 pulse)
  80. {
  81.     tx_cnt = pulse;
  82.     B_Space = 0;    //发脉冲
  83.     CCAPM2 = 0x48 | 0x04 | 0x01;    //工作模式 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
  84.     CR = 1;     //启动
  85.     while(CR);
  86.     P_IR_TX = IR_TX_OFF;
  87. }
  88. /************* 发送空闲函数 **************/
  89. void    IR_TxSpace(u16 pulse)
  90. {
  91.     tx_cnt = pulse;
  92.     B_Space = 1;    //空闲
  93.     CCAPM2 = 0x48 | 0x01;   //工作模式 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
  94.     CR = 1;     //启动
  95.     while(CR);
  96.     P_IR_TX = IR_TX_OFF;
  97. }
  98. /************* 发送一个字节函数 **************/
  99. void    IR_TxByte(u8 dat)
  100. {
  101.     u8 i;
  102.     for(i=0; i<8; i++)
  103.     {
  104.         if(dat & 1)     IR_TxSpace(63), TxTime += 2;    //数据1对应 1.6875 + 0.5625 ms
  105.         else            IR_TxSpace(21), TxTime++;       //数据0对应 0.5625 + 0.5625 ms
  106.         IR_TxPulse(21);         //脉冲都是0.5625ms
  107.         dat >>= 1;              //下一个位
  108.     }
  109. }
  110. //========================================================================
  111. // 函数: void   PCA_config(void)
  112. // 描述: PCA配置函数.
  113. // 参数: None
  114. // 返回: none.
  115. // 版本: V1.0, 2012-11-22
  116. //========================================================================
  117. void    PCA_config(void)
  118. {
  119.     //  PCA0初始化
  120.     CCON = 0x00;    //清除所有中断标志
  121.     CCAPM0  = 0x48 | 0x01;  //工作模式 + 中断允许 0x00: PCA_Mode_Capture,  0x42: PCA_Mode_PWM,  0x48: PCA_Mode_SoftTimer
  122.     PCA_Timer0 = 100;       //随便给一个小的初值
  123.     CCAP0L = (u8)PCA_Timer0;    //将影射寄存器写入捕获寄存器,先写CCAP0L
  124.     CCAP0H = (u8)(PCA_Timer0 >> 8); //后写CCAP0H
  125.     PPCA = 1;   //高优先级中断
  126.     CMOD  = (CMOD  & ~0xe0) | 0x08; //选择时钟源, 0x00: 12T, 0x02: 2T, 0x04: Timer0溢出, 0x06: ECI, 0x08: 1T, 0x0A: 4T, 0x0C: 6T, 0x0E: 8T
  127.     CH = 0;
  128.     CL = 0;
  129.     CR = 0;
  130.     tx_cnt = 2;
  131. }
  132. //========================================================================
  133. // 函数: void   PCA_Handler (void) interrupt PCA_VECTOR
  134. // 描述: PCA中断处理程序.
  135. // 参数: None
  136. // 返回: none.
  137. // 版本: V1.0, 2012-11-22
  138. //========================================================================
  139. #define D_38K_DUTY  ((MAIN_Fosc * 26) / 1000000UL + MAIN_Fosc / 3000000UL)  /*  38KHZ周期时间   26.3us */
  140. #define D_38K_OFF   ((MAIN_Fosc * 17) / 1000000UL + MAIN_Fosc / 3000000UL)  /* 发射管关闭时间   17.3us */
  141. #define D_38K_ON    ((MAIN_Fosc * 9) / 1000000UL)                           /* 发射管导通时间   9us */
  142. void    PCA_Handler (void) interrupt 7
  143. {
  144.     CCON = 0x40;    //清除所有中断标志,但不关CR
  145.     if(!B_Space)    //发送载波
  146.     {                               //发送脉冲,交替装载TH0值,溢出时自动重装
  147.         P_IR_TX = ~P_IR_TX;
  148.         if(P_IR_TX)
  149.         {
  150.             PCA_Timer0 += D_38K_OFF;    //装载高电平时间    17.3us
  151.             if(--tx_cnt == 0)   CR = 0; //pulse has sent,   stop
  152.         }
  153.         else    PCA_Timer0 += D_38K_ON; //装载低电平时间    9us
  154.     }
  155.     else    //发送暂停时间
  156.     {
  157.         PCA_Timer0 += D_38K_DUTY;   //装载周期时间  26.3us
  158.         if(--tx_cnt == 0)   CR = 0; //空闲时间
  159.     }
  160.     CCAP0L = (u8)PCA_Timer0;            //将影射寄存器写入捕获寄存器,先写CCAP0L
  161.     CCAP0H = (u8)(PCA_Timer0 >> 8); //后写CCAP0H
  162. }
复制代码

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:423
  • 最近打卡:2025-05-01 07:10:25
已绑定手机

76

主题

4833

回帖

8343

积分

超级版主

DebugLab

积分
8343
发表于 2024-8-17 15:28:53 | 显示全部楼层




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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2025-05-01 08:13:06
已绑定手机

27

主题

341

回帖

1687

积分

金牌会员

机长

积分
1687
发表于 2024-8-19 10:20:57 | 显示全部楼层
因为你main里面的cod和txcode里面的cod没有任何关系,所以在main里面赋值当然不会影响到txcode方法的执行了
业余撸代码,专业开飞机
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:33
  • 最近打卡:2025-04-28 10:23:12

11

主题

93

回帖

469

积分

中级会员

积分
469
发表于 2024-8-19 16:13:27 | 显示全部楼层
hsr*** 发表于 2024-8-19 10:20
因为你main里面的cod和txcode里面的cod没有任何关系,所以在main里面赋值当然不会影响到txcode方法的执行了 ...

确实是这个问题
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:15
  • 最近打卡:2025-03-26 09:09:59

6

主题

104

回帖

351

积分

中级会员

积分
351
发表于 2024-10-16 10:22:11 | 显示全部楼层
Debu*** 发表于 2024-8-17 15:28
发一次数据的就这一块,其他不需要的可以删除,还有就是按键需要边沿检测,持续按着只发一次
...

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

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:294
  • 最近打卡:2025-03-06 09:25:41

8

主题

318

回帖

1835

积分

金牌会员

积分
1835
发表于 2024-10-16 12:00:33 | 显示全部楼层
本方法
  1. u8 getcode(void)
  2. {
  3.         u8 keycode;
  4.         if(key_mov==0)
  5.         {
  6.                 delay_us(10);
  7.                 if(key_mov==0)
  8.                 {
  9.                         keycode=0x45;
  10.                         while(key_mov==0);
  11.                         }
  12.         }
  13.         else if(key_add==0)
  14.         {
  15.                 delay_us(10);
  16.                 if(key_add==0)
  17.                 {
  18.                         keycode=0x40;
  19.                         while(key_add==0);
  20.                 }
  21.         }
  22.         else if(key_minus==0)
  23.         {
  24.                 delay_us(10);
  25.                 if(key_minus==0)
  26.                 {
  27.                         keycode=0x43;
  28.                         while(key_minus==0);
  29.                 }
  30.         }
  31.         return keycode;
  32. }
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:198
  • 最近打卡:2025-05-01 00:16:05
已绑定手机

24

主题

345

回帖

1629

积分

金牌会员

积分
1629
发表于 2024-10-20 08:43:27 | 显示全部楼层
学习了
回复

使用道具 举报 送花

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

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-1 19:37 , Processed in 0.268143 second(s), 92 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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