51系列单片机做的红外遥控解码
单片机汇编语言源程序如下:
- /**红外遥控解码范例**/
- /**作者:田开坤**/
- /**较网上可以下载到的程序相比,本代码考虑了解码过程容易死机的问题,采取办法解决了,可以解码失败,但决不死机**/
- 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)
|