标题:
单片机红外遥控解码ASM汇编程序
[打印本页]
作者:
liugengzhuang
时间:
2017-7-2 14:07
标题:
单片机红外遥控解码ASM汇编程序
51系列单片机做的红外遥控解码
0.png
(44.4 KB, 下载次数: 46)
下载附件
2017-7-3 03:24 上传
单片机汇编语言源程序如下:
/**红外遥控解码范例**/
/**作者:田开坤**/
/**较网上可以下载到的程序相比,本代码考虑了解码过程容易死机的问题,采取办法解决了,可以解码失败,但决不死机**/
DQ equ 0ebh ;P4.3定义接口,参考STC89C51数据手册
EX2 equ 0c2h ;外部中断2,参考STC89C51数据手册
SEG1 equ 0ffech ;数码管1(最右)
SEG2 equ 0ffedh ;数码管2
SEG3 equ 0ffeeh ;数码管3
SEG4 equ 0ffefh ;数码管4(最左)
BYT_DLY equ 5FH ;延时函数参数变量
DA_BUF equ 40H ;解码出的数据缓冲区,包括41H
ORG 0000h
LJMP main
ORG 003bh ;外部中断2入口地址,参考STC89C51数据手册
LJMP EINT3
ORG 40h
main: MOV SP,#60h
SETB EA
SETB EX2
SJMP [ DISCUZ_CODE_1 ]nbsp; ;原地踏步,等中断解码
//中断接收解码模块
EINT3: CLR EA//关闭
MOV R6,#10
SB: MOV BYT_DLY,#13 ;834uS
ACALL DELAY ;调用834微秒延时子程序
JB DQ,EXIT ;延时834微秒后判断DQ脚是否出现高电平如果有就退出解码程序
DJNZ R6, SB ;重复 10 次,目的是检测在 9000 微秒内如果出现高电平就退出解码程序
;-------------------------------;以上完成对遥控信号 起始码 的 9000 微秒的初始低电平信号的识别!!!!!
JNB DQ, [ DISCUZ_CODE_1 ]nbsp; ;等待,避开 起始码 低电平
JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;避开结果码
/*;测试按键一次有多少位低电平,不同遥控器不一样*/
/*;电工电子中心投影遥控器只有32位,这对后边程序参数设置关系重大
CLR A
ADDLOOP: JNB DQ,$
ADD A,#1
MOV P1,A
JB DQ,cADD
sjmp $
*/
MOV R7,#16 ;忽略前16位系统识别码 (即地址码)
AAQQ: JNB DQ,[ DISCUZ_CODE_1 ]nbsp; ;通过低电平段
;JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;以下6行代码可以用本行替换,但这样容易出现死机。
MOV R6,#255
CTN2: JNB DQ,DER7 ;等待有效低电平到来,避开 结果码 高电平
MOV BYT_DLY,#3 ;42uS
ACALL DELAY ;调用42微秒延时子程序,延时太短,计数器R6不够大,延时太长,会错过最佳检测点
DJNZ R6,CTN2
LJMP EXIT ;防止死机
DER7: DJNZ R7,AAQQ
MOV R1,#DA_BUF ;设定1AH为起始RAM区
MOV R2,#2 ;接收从DA_BUF到DA_BUF+1的2个内存,用于存放操作码 (即数据码) 和操作反码
PP: MOV R3,#8 ;每组数据为8位
JJJJ: JNB DQ,[ DISCUZ_CODE_1 ]nbsp; ;等待通过数据码的低电平信号,等高电平到来后出去;
MOV BYT_DLY,#13 ;834uS
ACALL DELAY ;高电平开始后用840(560<t<1125,)微秒的时间尺去判断信号此时的高低电平状态
MOV C,DQ ;将DQ引脚此时的电平状态0或1存入C中
JNC UUU ;如果为0就跳转到UUU
;JB DQ,[ DISCUZ_CODE_1 ]nbsp; ;以下6行代码可以用本行替换,但这样容易出现死机。
MOV R6,#255
CTN3: JNB DQ,UUU ;等待有效低电平到来,避开 结果码 高电平
MOV BYT_DLY,#3 ;42uS
ACALL DELAY ;调用840微秒延时子程序
DJNZ R6,CTN3
LJMP EXIT ;防止死机
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,DA_BUF
CPL A ;对1AH取反后和1BH比较
CJNE A,DA_BUF+1,EXIT ;如果不等表示接收数据发生错误,放弃
MOV R7,DA_BUF ;将按键的键值通过数码管显示出来!
ACALL DISP
CLR P1.0 ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
MOV BYT_DLY,#50
ACALL DELAY
SETB P1.0 ;蜂鸣器停止
EXIT: SETB EA
reti
;-------------------------延时子程序---------------------------------
;晶振22.1184M
DELAY: PUSH BYT_DLY
DEL31: PUSH BYT_DLY
DEL32: DJNZ BYT_DLY,DEL32
POP BYT_DLY
DJNZ BYT_DLY,DEL31
POP BYT_DLY
DJNZ BYT_DLY,DELAY
RET
//数码管显示,数据由R7传入
DISP: mov dptr,#ledmap
mov a,r7
anl a,#0fh
movc a,@a+dptr
mov dptr,#SEG1
cpl a
movx @dptr,a
mov dptr,#ledmap
mov a,r7
swap a
anl a,#0fh
movc a,@a+dptr
mov dptr,#SEG2
cpl a
movx @dptr,a
mov dptr,#SEG3
mov a,#0ffh
movx @dptr,a
mov dptr,#SEG4
movx @dptr,a
ret
ledmap: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,00
END
复制代码
所有资料51hei提供下载:
红外遥控解码ASM.7z
(12.52 KB, 下载次数: 32)
2017-7-2 14:07 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1