- 打卡等级:以坛为家I
- 打卡总天数:220
- 最近打卡:2025-05-01 18:20:12
金牌会员
- 积分
- 1132
|
发表于 2025-2-23 11:36:15
|
显示全部楼层
我往你的工程里加了一个红外的,直接把你的工程搞崩了。  
想要跟着你的步法,还是任重而道远。
---------------------------------------------------------------------------------
case VK_DIGIT_0:
// printf("00000000"); //在数码管上显示字符串
IrWave(rawDataAirOn1, sizeof(rawDataAirOn1) / sizeof(rawDataAirOn1[0]));
break;
case VK_DIGIT_1:
// printf("%08lx", 0x1234abcdL); //在数码管上显示字符串
IrWave(rawDataAirOn2, sizeof(rawDataAirOn2) / sizeof(rawDataAirOn2[0]));
break;
case VK_DIGIT_2:
// SEG7_ShowLong(0x98765432, 16); //在数码管上显示4字节长整型数
IrWave(rawDataAirOn3, sizeof(rawDataAirOn3) / sizeof(rawDataAirOn3[0]));
break;
-------------------------------------------------------------------------
#ifndef __IR_AIR_H__
#define __IR_AIR_H__
#include "ir_air.h"
#include "Ai8051U.h"
typedef unsigned int u16;
static volatile u16 tx_cnt; //发送或空闲的脉冲计数(等于38KHZ的脉冲数,对应时间), 红外频率为38KHZ, 周期26.3us
void PWM_config(void)
{
PWMA_CCER2 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR4 = 0x60; //设置 PWM4 模式1 输出
// PWMA_CCER2 = 0xB0; //使能 CC4E 通道, 低电平有效
PWMA_ARRH = 0x02; //设置周期时间
PWMA_ARRL = 0x77;
PWMA_CCR4H = 0;
PWMA_CCR4L = 210; //设置占空比时间
PWMA_PS = 0x80; //高级 PWM 通道 4N 输出脚选择位, 0x00:P1.7, 0x40:P0.7, 0x80:P2.7
// PWMA_PS = 0x80; //高级 PWM 通道 4P 输出脚选择位, 0x00:P1.6, 0x40:P0.6, 0x80:P2.6
PWMA_ENO = 0x80; //使能 PWM4N 输出
// PWMA_ENO = 0x40; //使能 PWM4P 输出
PWMA_BKR = 0x80; //使能主输出
// PWMA_IER = 0x10; //使能中断
PWMA_CR1 |= 0x81; //使能ARR预装载,开始计时
}
void PWMA_ISR() __interrupt(PWMA_VECTOR)
{
if(PWMA_SR1 & 0X10)
{
PWMA_SR1 &=~0X10;
// PWMA_SR1 = 0;
if(--tx_cnt == 0)
{
PWMA_CCER2 = 0x00; // 写 CCMRx 前必须先清零 CCxE 关闭通道
PWMA_CCMR4 = 0x40; // 设置 PWM4 强制为无效电平
PWMA_CCER2 = 0x70; // 使能 CC4NE 通道, 低电平有效
PWMA_IER = 0x00; // 关闭中断
}
}
}
void IR_TxPulse(u16 pulse)
{
tx_cnt = pulse;
PWMA_CCER2 = 0x00; //
PWMA_CCMR4 = 0x60; //
PWMA_CCER2 = 0x70; //
PWMA_IER = 0x10; //
while(tx_cnt);
}
void IR_TxSpace(u16 pulse)
{
tx_cnt = pulse;
PWMA_CCER2 = 0x00; //
PWMA_CCMR4 = 0x40; //
PWMA_CCER2 = 0x70; //
PWMA_IER = 0x10; //
while(tx_cnt);
}
void IrWave(u16 *raw, int rawNum)
{
int i;
for(i = 0; i < rawNum; i++)
{
if (i % 2 == 0) {
IR_TxPulse(raw/1000*38);
} else {
IR_TxSpace(raw/1000*38);
}
}
}
#endif
|
|