车载红外遥控按键源码(红外遥控小车流程图)
本文目录一览:
- 1、我用单片机编程,怎样知道一个红外遥控器的每个按键的代码,或者怎样操作?
- 2、基于51单片机红外遥控代码(C语言)
- 3、来个红外线遥控的编码程序吧!用汇编的!
- 4、求一份红外遥控程序(发射和接受)汇编。。。谢谢
我用单片机编程,怎样知道一个红外遥控器的每个按键的代码,或者怎样操作?
单片机UART接个红外接收。另外还要做个遥控器,也用单片机UART接个红外发射。用遥控器的单片机做按键编码,发射不同的数据到串口,例如0x01是开,0xfe是关。
然后接收的单片机做UART数据解码,接收到0X01就做开操作,0XFE做关操作。
基于51单片机红外遥控代码(C语言)
以下文件是51单片机实现遥控解码,通过数码管显示键码的程序,P0口驱动数码管段选,p2.6和p2.7为数码管位选,接收头连到P3.2口。此程序以通过验证,可以直接编译使用,另外还有一个继电器和蜂鸣器的控制,不用可以屏蔽掉。
;********************************************************************************
;* 描述: *
;* 遥控键值读取器 *
;* 数码管显示, P0口为数码管的数据口 *
;* *
;********************************************************************************
;遥控键值解码-数码管显示 *
;********************************************************************************/
#include reg51.h
#include intrins.h
void IR_SHOW();
void delay(unsigned char x);//x*0.14MS
void delay1(unsigned char ms);
void beep();
sbit IRIN = P3^2;
sbit BEEP = P3^7;
sbit RELAY= P1^3;
sbit GEWEI= P2^7;
sbit SHIWEI= P2^6;
unsigned char IRCOM[8];
unsigned char code table[16] =
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
main()
{
IE = 0x81; //允许总中断中断,使能 INT0 外部中断
TCON = 0x1; //触发方式为脉冲负边沿触发
delay(1);
IRIN=1;
BEEP=1;
RELAY=1;
for(;;)
{
IR_SHOW();
}
} //end main
void IR_IN() interrupt 0 using 0
{
unsigned char i,j,k,N=0;
EA = 0;
I1:
for (i=0;i4;i++)
{
if (IRIN==0) break;
if (i==3) {EA =1;return;}
}
delay(20);
if (IRIN==1) goto I1; //确认IR信号出现
while (!IRIN) //等 IR 变为高电平
{delay(1);}
for (j=0;j4;j++)
{
for (k=0;k8;k++)
{
while (IRIN) //等 IR 变为低电平
{delay(1);}
while (!IRIN) //等 IR 变为高电平
{delay(1);}
while (IRIN) //计算IR高电平时长
{
delay(1);
N++;
if (N=30) {EA=1;return;}
}
IRCOM[j]=IRCOM[j] 1;
if (N=8) {IRCOM[j] = IRCOM[j] | 0x80;}
N=0;
}//end for k
}//end for j
if (IRCOM[2]!=~IRCOM[3]) {EA=1;return;}
IRCOM[5]=IRCOM[2] 0x0F;
IRCOM[6]=IRCOM[2] 0xF0;
IRCOM[6]=IRCOM[6] 4;
beep();
EA = 1;
}
void IR_SHOW()
{
P0 = table[IRCOM[5]];
GEWEI = 0;
SHIWEI = 1;
delay1(4);
P0 = table[IRCOM[6]];
SHIWEI = 0;
GEWEI = 1;
delay1(4);
}
void beep()
{
unsigned char i;
for (i=0;i100;i++)
{
delay(5);
BEEP=!BEEP;
}
BEEP=1;
}
void delay(unsigned char x)//x*0.14MS
{
unsigned char i;
while(x--)
{
for (i = 0; i13; i++) {}
}
}
void delay1(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i120; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
来个红外线遥控的编码程序吧!用汇编的!
红外遥控电子密码锁程序
ORG 0000H ;主程序
CLR P1.7 ;清零
MOV RO, #OOH
CLR P1.3 ;关报警
CLR P1.7 ;P1.7清零
CLR P1.4 ;关报警
MOV RO, #OOH ;串行口初始化
MOV 52H, #02H ;将立即数02H送52H
MOV TMOD , #20H ;设置T1工作方式2
MOV TL1 ,#OF4H ;定时初始值送TL1
MOV TH1 ,#OF4H ;定时初始值送TH1
SETB TR1 ;启动定时器T1
MOV SCON, #ODOH ;定义串行行工作方式3
MOV PCON , #OOH
KEY: JNB P1.5 , KEP1 ;选择密码57618
LJMP KEP2
*******************************************************密码57618程序
KEP1: MOV P2 ,#0FFH ;关显示
MOV A , P0 判断是否有键按下
CPL A ;对P0口的数据取反
ANL A , #OFFH ;立即数OFF 与PO的数据相与
JNZ JP ;有键按下转至JP
MOV A , P1 ;判断是否有键盘按下
CPL A ;将P1口的数据取反
ANL A ,#O7H ;累加器数据为零转遥控接收程序
JZ WAIT
ACALL D10MS ;调用10秒延时
MOV A , P1
CPL A
ANL A ,#O7H
JZ WAIT
PP1: CJNE A , #01H ,JP1
MOV P2 , #89H ;显示字符”H”
LJMP K0P1
PP2: CJNE A , #02H ,JP2
MOV P2 , #89H ;显示字符”H”
LJMP KOP1
JP2: CJNE A , #04H ,KY
MOV P2 ,#89H ;显示字符”H”
JP3: MOV A , #O7H
CJNE A , #07H ,JP3
LJMP LP1
KOP1: MOV A ,P1
ANL A, #07H
CJNE A , #07H ,KOP1
LJMP KEP1
JP: LCALL D10MS
MOV A , PO
CPL A,
ANL A, #OFFH
JZ C6
CJZE A ,#01H ,KEY02
MOV P2, #89H
LJMP KEY1
KEY02: CJNE A ,#02H ,KEY03
MOV P2 ,#89H
LJMP KJP1
KEYO3: CJNE A , #04H, KEY04
MOV P2 ,#89
LJMP KJP1
KEY04: CJZE A , #08H, KEY05
MOV P2 ,#89H
LJMP KJP1
KEY05: CJZE A , #10H, KEY06
MOV P2 ,#89H
LJMP KJP1
KEY06: CJZE A , #08H, KEY07
MOV P2 ,#89H
LJMP KJP1
KEY07 CJZE A , #10H KEY08
MOV P2 ,#89H
LJMP KJP1
KEY08 CJZE A , #10H, C6
MOV P2 ,#89H
LJMP KJP1
KJP1: MOV A, P0
CJNE A , #OFFH ,KJP1
C6: LJMP WAIT
********************************************************************
KEY1: LCALL MP
CJNE A , #02H , KEY03
MOV P2 , #89H
KEY2 LCALL MP
CJNE A , #04 , KEY02
MOV P2 , #89H
KEY3 LCALL MP
CJNE A , #08 , KEY02
MOV P2 , #89H
KEY4 LCALL MP
CJNE A , #10H, KEY02
MOV P2 , #89H
KEY5 MOV A ,P0
CJNE A , #0FFH, KEY5
MOV P2 , #OFFH
MOV R5 ,#30H
KEY6: MOV A , PO
CPL A
ANL A , #OFFH
JNZ BB2
MOV A ,P1
CPL A
ANL A , #O7H
JZ BB1
LCALL D10MS
MOV A , P1
CPL A
ANL A ,#07H
JZ
CJNE A ,#04H ,B1
MOV P2 , #89H
LJMP LP2
B1: CJNE A, #01H ,BL1
MOV P2 ,#89H
LJMP KOP1
BL1: CJNE A , #02H ,BB1
MOV P2 , #89H
LJMP KOP1
BB2: LCALL D10MS
MOV A , P0
CPL A
ANL A , #OFFH
JZ BB1
LJMP KEY02
BB1: MOV R7 ,#OC8H
BB4: MOV R6 ,#OF9H
NOP
NOP
BB5: JNZ R6 ,BB5
DJNZ R7, BB4
DJNZ R5 , KEY6
LJMP WAIT
************************************************************密码81675程序
KEP2: MOV P2 ,#OFFH ;关显示
MOV A ,PO
] CPL A
ANL A , #OFFH
JNZ HP
MOV A ,P1
CPL A
ANL A , #07H
JZ C9
LCALL D1OMS
MOV A ,P1
CPL A
ANL A ,#07H
JZ C9
BB: CJNE A , #O1H ,HP1
MOV P2 ,#89H
LJMP K1P1
HP1: CJNE A ,#02H ,HP2
MOV P2 ,#89H
LJMP K1P1
HP2: CJNE A ,#04H ,C9
MOV P2, #89H
HP3: MOV A ,P1
ANL A ,#07H
CJNE A ,#07H ,HP3
MOV P2 ,#OFFH
LJMP LP1
K1P1 : MOV A ,P1
ANL A ,#O7H
CJNE A ,#07H ,K1P1
C9: LJMP WAIT
HP: LCALL D1OMS
MOV A , PO
CPL A
ANL A ,#OFFH
JZ C9
CJNE A , #1OH,K0Y02
MOV P2 ,#89H
LJMP K0Y1
K0Y02: CJNE A ,#01H ,K0Y03
MOV P2 ,#89H
LJMP KUP1
K0Y03 CJNE A ,#02H ,K0Y04
MOV P2 ,#89H
LJMP KUP1
K0Y04 CJNE A ,#04H ,K0Y05
MOV P2 ,#89H
LJMP KUP1
K0Y05 CJNE A ,#08H ,K0Y06
MOV P2 ,#89H
LJMP KUP1
K0Y06 CJNE A ,#20,K0Y07
MOV P2 ,#89H
LJMP KUP1
K0Y07 CJNE A ,#40,K0Y08
MOV P2 ,#89H
LJMP KUP1
K0Y08 CJNE A ,#80,U2
MOV P2 ,#89H
LJMP KUP1
KUP1: MOV A ,PO
CJNE A ,#OFFH ,KUP1
U2: LJMP WAIT
K0Y1: LCALL MP
CJNE A #08H ,K0Y02
MOV P2 ,#89H
K0Y2 LCALL MP
CJNE A #04 ,K0Y02
MOV P2 ,#89H
K0Y3 LCALL MP
CJNE A #02 ,K0Y02
MOV P2 ,#89H
K0Y4 LCALL MP
CJNE A #01H ,K0Y02
MOV P2 ,#89H
K0Y6: MOV A ,PO
CPL A
ANL A ,#OFFH
JNZ PP2
MOV A , P1
CPL A
ANL A ,#07H
JZ PPL
LCALL D10MS
MOV A , P1
CPL A
ANL A ,#07H
JZ PP1
CJNE A ,#04H ,Y1
MOV P2 , 389H
LJMP LP2
Y1: CJNE A ,#01H ,Y11
MOV P2 ,#89H
LJMP K1P1
Y11: CJNE A , #02H ,PP1
MOV P2 ,#89H
LJMP K1P1
PP2: LCALL D10MS
MOV A, PO
CPL A
ANL A ,#OFFH
JZ PP1
LJMP K0Y02
PP1: MOV R7 ,#OC8H
PP4: MOV R6 , #OF9H
NOP
NOP
PP5: DJNZ R6 ,PP5
DJNZ R7 ,PP4
DJNZ R5 ,K0Y6
LJMP WAIT
*****************************************************报警程序
LP1: SETB P1.4
INC RO
P019: MOV R3 ,#05H
P020: MOV R7 ,#0A0H
P018: SETB P1.3
LCALL P01A
CLR P1.3
LCALL P01A
DJNZ R7 ,P018
DJNZ R3 ,P020
CLR P1.3
CJNE R0 , #03H ,P017
LJMP P019
P017: CLR P1.4
LJMP WAIT
****************************************************开锁程序
LP2: SETB P1.7
LCALL T5S
CLR P1.7
MOV R0 ,#00H
LJMP WAIT
******************************************************判断键是否释放
MP: MOV A ,PO
CJNE A ,#OFFH ,MP
MOV P2 ,#OFFH
PM: MOV R5 ,#30H
LCALL TP
RET
******************************************************判断是否有键按下
TP: MOV A ,PO
CPL A
ANL A , #OFFH
JNZ AP
MOV A ,P1
CPL A
ANL A, #O7H
JZ TP3
LCALL D10MS
MOV A , P1
CPL A
ANL A , #07H
JZ TP3
LCALL D10MS
MOV A ,P1
CPL A
ANL A ,#07H
JZ TP3K
CJNE A, #04H ,C1
MOV P2 ,#89H
C3: MOV A P1
ANL A , #07H
CJNE A #07H ,C3
MOV P2 ,#0FFH
LJMP LP1
C1: CJNE A ,#01H ,C2
MOV P2 ,#OCOH
LJMP KCP1
C2: CJNE A ,#02 ,U11
MOV P2 ,#90HP
LJMP KCP1
KCP1: MOV A , P1
ANL A ,#07H
CJNE A ,#07H ,KCP1
U11: LJMP WAIT
AP: LCALL D10MS
MOV A ,P0
CPL A
ANL A , #0FFH
JZ TP3
RET
************************************************************400M延时程序
TP3: MOV R7 ,#OC8H
TP1: MOV R6 , #OF9H
NOP
NOP
TP2: DJNZ R6 , TP2
DJNZ R7 ,TP1
DJNZ R5 ,TP ;10S
LJMP WAIT
*********************************************************10延时程序]
D10MS : MOV R7 ,#05H
LOOP1: MOV R6 ,#OF9H
NOP
NOP
LOOP2: DJNZ R6 , LOOP2
DJNZ R7 ,LOOP1
RET
*****************************************************延时程序
P01A: MOV R2 ,#06H
LCALL DELY
RET
DELY: PUSH 02H
DEL2 : PUSH 02H
DEL3 : PUSH 02H
DEL4: DJNZ R2, ,DEL4
POP O2H
DJNZ R2 ,DEL3
POP O2H
DJNZ R2 ,DEL2
POP O2H
DJNZ R2 ,DELY
RET
******************************************************5S 延时程序
T5S: MOV R4 ,#15H
TS1: MOV R3 ,#64H
TS2: MOV R2 ,#05H
TS3: MOV R1 , #OF9H
NOP
NOP
T5S4 DJNZ R1 ,TS4
DJNZ R2 ,TS3
DJNZ R3 ,TS2
DJNZ R4 ,TS1
RET
3、遥控发送程序
ORG 0000H
LOOPO: MOV SCON ,#0C0H ;设定串行口工作方式3
MOV TMOD , #20H ;T1工作方式2
MOV PCON , #00H ;波特率设置
MOV TL1 , #OF4H ;定时初始值F4送TL1
MOV TH1 , #OF4H ;定时初始值F4送TH1
*******************************************************************
CP: JB P1.0 ,CPK ;判断遥控按键P1.0是否按下
LCALL PP ;调用延时
JB P1.0 , CP
STEB TR1 ;启动定时器T1
MOV 50H ,#5FH ; 将立即数5FH 送50H 存储单元
MOV RO ,#50H ;将立即数50H 送RO寄存器
MOV R1 , #05H ;将立即数05H送R1寄存器
IND: MOV A ,@R0 ; 将50H中的5F送累加器A
MOV C , P
MOV TB8 ,C
MOV SBUF ,A ;将要发送数据5F送串行数据缓冲器
AAA : JNB P1.1 ,ON1 ; P1.1是”0”电平时转至调制程序
BBB” JB P1.1 ,CCC ;P1.1是”1”电平等待
AMP AAA
CCC : JBC TI ,CP ;判断发送中断标志位]
SETB P1.2 ;P1.2置1
AJMP BBB
ON1: ACALL ON
AJMP AAA
PP: MOV R6, #05H ;延时子程序
100P3: MOV R5 , #OF9H
NOP
NOP
100P4: DJNZ R5 ,100P4
DJNZ R6 ,100P3
RET
ON: CP1 P1.2 ;0电平调制程序
。。。。。。。。。。。。。。(共有82个CP1 P1.2)
RET
********************************************************************
4、遥控接收程序
WAIT: JBC R1 ,LOOP5 ;遥控接收程序
LJMP KEY
LOOP5: MOV R0 ,#51H ;将立即数51H送R0
MOV R7 ,#03H ;将立即数03H送R7
LOOP6: MOV A ,SBUF ;将串行缓冲器接收到的数据累加器A
JNB PSW.0 LOOP7 ;标志位F0清零了吗?
JNB RB8 ,LOOP8 ;数据接收完了吗?
LOOP9 MOV @RO ,A ;开锁处理程序
MOV R1 , 51H
CJNE R1 ,#1EH ,LP
DJNZ 52H , KP
CLR P1.7
MOV 52H ,# 02H
MOV R0 ,#OOH
LJMP WAIT
KP: SETB P1.7
MOV R0 ,#00H
LJMP WAIT
LP: DJNZ R7 ,WAIT
CLR PSW.5
LJMP WAIT
LOOP7: JB RB8 , LOOP8
LJMP LOOP9
LOOP8: SETB PSW.5 ;给标志位F0置1
LJMP WAIT ;继续接收数据
参考下!
求一份红外遥控程序(发射和接受)汇编。。。谢谢
ORG 0000H
AJMP MAIN
ORG 0003H ;外部中断P3.2脚INT0入口地址
AJMP INTT0 ;转入外部中断服务子程序(解码程序)
ORG 0100H
MAIN: SETB EA
SETB IT0
SETB EX0
AJMP $
;******************以下为进入P3.2脚外部中断子程序,也就是解码程序*******************
INTT0: CLR EA ;暂时关闭CPU的所有中断请求
MOV R6,#5
SB: ACALL YS1 ;调用882微秒延时子程序
JB P3.2,EXIT ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB ;重复 5 次,目的是检测在 4410 微秒内如果出现高电平就退出解码程序
;---------------以上完成对遥控信号引导码的 4500 微秒的初始低电平信号的识别!!!!!
JNB P3.2, $ ;等待高电平避开 4.5 毫秒低电平引导脉冲
ACALL YS2 ;延时4.74毫秒避开 4.5 毫秒的结果码
;---------------以上是对引导码的 4500 微秒高电平的初始识别!!!!!
;-------------------------------------------------------------------------
MOV R7,#16 ;忽略前16位系统识别码 (即地址码)
JJJJA:JNB P3.2,$ ;等待地址码第一位的高电平信号
LCALL YS1 ;高电平开始后用882微秒的时间延时去判断信号此时的高低电平状态
MOV C,P3.2 ;将P3.2引脚此时的电平状态 0或1 存入C中
JNC UUUA ;如果为0就跳转到UUUA
LCALL YS3 ;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUUA: DJNZ R7,JJJJA
;--------------------------------------------------------------------------
MOV R1,#1AH ;设定1AH为起始RAM区
MOV R2,#2 ;接收从1AH到1BH的2个内存,用于存放操作码 (即数据码) 和操作反码
PP: MOV R3,#8 ;每组数据为8位
JJJJ: JNB P3.2,$ ;等待 数据码 第一位的高电平信号
LCALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
JNC UUU ;如果为0就跳转到UUU
LCALL YS3 ;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUU: MOV A,@R1 ;将R1中地址的给A
RRC A ;将C中的值0或1移入A中的最低位
MOV @R1,A ;将A中的数暂时存放在R1数值的内存中
DJNZ R3,JJJJ ;接收满8位换一个内存
INC R1 ;对R1中的值加1,换下一个RAM
DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在1AH/1BH中
MOV A,1AH
CPL A ;对1AH取反后和1BH比较
CJNE A,1BH,EXIT ;如果不等表示接收数据发生错误,放弃
;---------------------------------------------------------------------
MOV P0,1AH ;将按键的键值通过P1口的8个LED显示出来!
CLR P2.1 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
LCALL YS2
LCALL YS2
LCALL YS2
SETB P2.1 ;蜂鸣器停止
EXIT: SETB EA ;允许中断
RETI ;退出解码子程序
;-------------------------延时子程序---------------------------------
YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒
D1: MOV R5,#20
DJNZ R5,$
DJNZ R4,D1
RET
YS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒
D2: MOV R5,#235
DJNZ R5,$
DJNZ R4,D2
RET
YS3: MOV R4,#2;延时程序3,精确延时1000微秒
D3:MOV R5,#248
DJNZ R5,$
DJNZ R4,D3
RET
END