红外遥控器按键编码
P4M1 = 0X00; P4M0 = 0XFF; P44 = 0; P50=0;
EA = 1;
//允许全局中断
EX0 = 1;
//允许 INT0 中断
PX0 = 0;
//INT0 的中断级别为低
IT0 = 0;
//设定 INT0 上升沿和下降沿都可以中断
/*初始化 T0:16 位自动重装填模式*/
{LED1=ON;LED2=OFF;LED3=OFF;LED4=OFF;LED5=OFF;}
if(temp==IR_2)
{LED1=OFF;LED2=ON;LED3=OFF;LED4=OFF;LED5=OFF;}
if(temp==IR_3)
{LED1=OFF;LED2=OFF;LED3=ON;LED4=OFF;LED5=OFF;}
break;
}
case IR_WordA: {
if((IR_Num%2)==0&&InfraredRayPin==1) {
TH0 = 0x00; TL0 = 0x00; TimeStart; break; } if((IR_Num%2)==1&&InfraredRayPin==0) { TimeStop; IR_Time=TH0; IR_Time<<=8; IR_Time|=TL0; IR_DataA<<=1; if(IR_Time<800) {
1
#define IR_WordB
2
#define IR_End
3
#define TimeStart (TR0=1)
#define TimeStop (TR0=0)
void InfraredRay_Init(void);
//初始化红外遥控功能
unsigned int backdata(void);
#endif
AUXR &= 0X7F; //将 AUXR.7 清零,设置 T0 的工作时钟为传统时钟
// AUXR |= 0X80; //将 AUXR.7 置一,设置 T0 的工作时钟为传统时钟的 12 倍
ET0 = 0;
//不允许 T0 溢出中断
PT0 = 0;
//T0 的中断优先级别为 0
TL0 = 0X00; //清零 T0 计数寄存器低八位
TH0 = 0X00; //清零 T0 计数寄存器高八位
INT_CLKO &=0XFE;//不允许引脚将 T0 的频率输出
}
void INT0_OP(void) interrupt 0 using 1
{
IR_Num++;
switch(InfraredRay_Status)
{
case IR_Start:
unsigned int temp=0;
void main() {
InfraredRay_Init(); LED1=OFF;LED2=OFF;LED3=OFF;LED4=OFF;LED5=OFF; while(1)
{பைடு நூலகம்
while(EX0==0)
{
temp=backdata();
if(temp==IR_1)
IR_DataA&=0xfe; } if(IR_Time>=800) {
IR_DataA|=0x01; } if(IR_Num==35) {
InfraredRay_Status=IR_WordB; } break; } break; } case IR_WordB: { if((IR_Num%2)==0&&InfraredRayPin==1) { TH0 = 0x00; TL0 = 0x00; TimeStart; break; } if((IR_Num%2)==1&&InfraredRayPin==0) { TimeStop;
TF0 = 0;
//清除 T0 溢出中断标志,免得其产生中断
TR0 = 0;
//先不允许 T0 计数
TMOD &= 0XF7; //将 TMOD.3 清零,T0 计数只由 TR0 控制,与 INT0 的电平无关
TMOD &= 0XFB; //将 TMOD.2 清零,T0 对内部时钟进行计数
TMOD &= 0XFC; //将 TMOD.1&0 清零,T0 工作模式为 16 位自动重装填
#define _INFRAREDRAY_H_
#include "STC15W.H"
//各个按键对应码定义
#define IR_CHL 93
#define IR_CH 157
#define IR_CHR 29
#define IR_PREV 221
#define IR_NEXT 253
#define IR_PP 61
100+
00-FF-19-E6
00-FF-98-67
200+
00-FF-0D-F2
00-FF-B0-4F
1
00-FF-0C-F3
00-FF-30-CF
2
00-FF-18-E7
00-FF-18-E7
3
00-FF-5E-A1
00-FF-7A-85
4
00-FF-08-F7
00-FF-10-EF
5
00-FF-1C-E3
if(temp==IR_4)
{LED1=OFF;LED2=OFF;LED3=OFF;LED4=ON;LED5=OFF;}
if(temp==IR_5)
{LED1=OFF;LED2=OFF;LED3=OFF;LED4=OFF;LED5=ON;}
EX0 = 1;
}
}
}
②InfraredRay.h
#ifndef _INFRAREDRAY_H_
#define IR_4
239
#define IR_5
199
#define IR_6
165
#define IR_7
189
#define IR_8
181
#define IR_9
173
#define InfraredRayPin P32
//红外接收头的链接引脚
#define IR_Start
0
#define IR_WordA
#define IR_MINUS 31
#define IR_PLUS 87
#define IR_EQ 111
#define IR_0
151
#define IR_100A 103
#define IR_200A 79
#define IR_1
207
#define IR_2
231
#define IR_3
133
淘宝网上购买的遥控器图片:(这是脉宽调制的)
按键符号
某淘宝贴出来的按键对应码
我实际测得的按键对应码
CH-
00-FF-45-BA
00-FF-A2-5D
CH
00-FF-46-B9
00-FF-62-9D
CH+
00-FF-47-B8
00-FF-E2-1D
PREV
00-FF-44-BB
00-FF-22-DD
IR_Time|=TL0;
if(IR_Time>12000)
{
InfraredRay_Status=IR_WordA;
break;
}
else
{
InfraredRay_Status=IR_Start;
IR_Num=0;
break;
}
}
InfraredRay_Status=IR_Start;
IR_Num=0;
NEXT
00-FF-40-BF
00-FF-02-FD
PLAY/PAUSE 00-FF-43-BC
00-FF-C2-3D
-
00-FF-07-F8
00-FF-E0-1F
+
00-FF-15-EA
00-FF-A8-57
EQ
00-FF-09-F6
00-FF-90-6F
0
00-FF-16-E9
00-FF-68-97
③InfraredRay.c
#include "InfraredRay.h"
/*注意:时钟 12MHz!!!!!!*/
unsigned char InfraredRay_Status=IR_Start; unsigned char IR_Num=0; unsigned int IR_Time=0; unsigned int IR_Time0=0; unsigned int IR_DataA=0; unsigned int IR_DataB=0; void InfraredRay_Init(void) {
IR_Time=TH0; IR_Time<<=8; IR_Time|=TL0; IR_DataB<<=1; if(IR_Time<800) {
IR_DataB&=0xfe; } if(IR_Time>=800) {
IR_DataB|=0x01; } if(IR_Num==67) {
InfraredRay_Status=IR_End; } break; } break; } case IR_End: { if(IR_Num==68) { InfraredRay_Status=IR_Start; IR_Num=0; EX0 = 0;//不允许 INT0 中断 }break; } default:break; } } unsigned int backdata(void) { IR_Time0=IR_DataB&0x00ff; return IR_Time0; }