为何移植后的红外发射程序会一直发射信号(已解决)
本帖最后由 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
}
https://www.stcaimcu.com/data/attachment/forum/202408/17/152255rv39jwiglldgvila.jpg
https://www.stcaimcu.com/data/attachment/forum/202408/17/152527d65kc4284pzhii6i.jpg
发一次数据的就这一块,其他不需要的可以删除,还有就是按键需要边沿检测,持续按着只发一次
因为你main里面的cod和txcode里面的cod没有任何关系,所以在main里面赋值当然不会影响到txcode方法的执行了 hsrzq 发表于 2024-8-19 10:20
因为你main里面的cod和txcode里面的cod没有任何关系,所以在main里面赋值当然不会影响到txcode方法的执行了 ...
确实是这个问题 DebugLab 发表于 2024-8-17 15:28
发一次数据的就这一块,其他不需要的可以删除,还有就是按键需要边沿检测,持续按着只发一次
...
请教下怎么实现边沿检测,持续按着只发送一次 本方法
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;
} 学习了
页:
[1]