附件:红外遥控器.zip## 项目简介
TCL空调遥控器
项目功能
简单完成一款能够实现学习的空调遥控器
硬件所需
软件编写
- 首先根据将开发板直接供电并通过逻辑分析仪获取到红外接收输出的红外协议。
- 假定我的空调是TCL ,此时我需要学习或者使用它来做到控制空调简单的开关。
- 我们需要用逻辑分析仪器抓取它收到的协议,空调遥控器也好,手机万能遥控也好,只要是可以正常的控制空调的都行,逻辑分析仪设置为下降边沿捕获,最后分析协议的特点进行编程。
- 根据捕获的协议编写发送的协议,低电平一般表示的就是38Khz 的载波,高电平呢就表示当时为空闲。
使用逻辑分析仪器抓取的协议如下图 例:

以TCL 空调为例子,它的协议和NEC 的协议就有略微的不同,它具有14 位数据,接收管接收的数据开始码是3150us 的低电平和1600us 的高电平,0和1 的区分是采用脉冲位置调制(PPM),通过脉冲之间的时间间隔来区分“0”和“1”,0的脉冲间隔是1150us,1的脉冲间隔是450us。
-
接收代码如下。
void Get_Infrared_Code(uint8_t *buf)
{
uint8_t data_bits=0,timer_10us=0;
while(1)
{
if(P22==1)
{
if(timer_10us<255)
timer_10us++;
}else
{
buf[data_bits/8]&=~(0x01<<(data_bits%8));
if(timer_10us<70)
buf[data_bits/8]|=(0x01<<(data_bits%8));
if(timer_10us>140)
data_bits=0;
else
data_bits++;
timer_10us=0;
while(P22==0);
}
if(data_bits==112)
break;
Delay10us();
}
}
-
发送代码如下,其中延时均通过stc下载软件生成,并通过逻辑分析仪校准查看过,使用的系统时钟为33.1766MHz:
void start2(void)
{
uint8_t i=0;
for(i=0;i<239;i++)
{
Delay13us();
P03=~P03;
}
P03=0;
Delay1600us();
}
void send_38k(void)
{
uint8_t i=0;
for(i=0;i<34;i++)
{
Delay13us();
P03=~P03;
}
P03=0;
}
void send_IR_Ctl(uint8_t *buf)
{
uint8_t i=0,j=0,tp;
start2();
for(i=0;i<14;i++)
{
tp=buf[i];
for(j=0;j<8;j++)
{
send_38k();
if(tp&0x01)
{
Delay450us();
}else
{
Delay1150us();
}
tp>>=1;
}
}
send_38k();
}
void main(void)
{
uint8_t tp=0;
uint8_t mode=0;
uint8_t buf[14];
char xdata show[29];
WTST = 0;
EAXSFR();
CKCON = 0;
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x04;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
I2CCFG = 0xc2;
I2CPSCR = 0x00; //MSSPEED[13:6]
I2CMSST = 0x00;
OLED_Init();
OLED_ShowString(0,0,"state:Rx",16);
Get_Infrared_Code(&buf);
my_sprintf(show,buf,14);
OLED_ShowString(0,2,show,16);
Delay100ms();
OLED_ShowString(0,0,"state:Rx",16);
while(1)
{
if(P32==0)
{
send_IR_Ctl(&buf);
}
}
}
验证功能
- 开机显示 state:Rx,说明设备进入学习功能模式了。

- 使用TCL空调遥控器或者红米手机中的我万能遥控功能对着接收管按下按键.此时OLED 会显示出接收到的红外码。

- 按下确认按键可以发送刚才收到的红外编码