- DQ EQU P3.3 ;P3.3定义接口,参考STC89C51数据手册
- EX2 EQU P3.2 ;外部中断0,参考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 003H ;外部中断0入口地址,参考STC89C51数据手册
- LJMP EINT3
- ORG 40H
- MAIN: MOV SP,#60H
- SETB EA
- SETB EX0
- SJMP $; ;原地踏步,等中断解码
- ;//中断接收解码模块
- EINT3: CLR EA;//关闭
- MOV R6,#10
- SB: MOV BYT_DLY,#13 ;834uS
- LCALL DELAY ;调用834微秒延时子程序
- JB DQ,EXIT ;延时834微秒后判断DQ脚是否出现高电平如果有就退出解码程序
- DJNZ R6, SB ;重复 10 次,目的是检测在 9000 微秒内如果出现高电平就退出解码程序
- ;-------------------------------;以上完成对遥控信号 起始码 的 9000 微秒的初始低电平信号的识别!!!!!
- JNB DQ, $; ;等待,避开 起始码 低电平
- JB DQ,$; ;避开结果码
- ;/*;测试按键一次有多少位低电平,不同遥控器不一样*/
- ;/*;电工电子中心投影遥控器只有32位,这对后边程序参数设置关系重大
- ; CLR A
- ;ADDLOOP: JNB DQ,$
- ; ADD A,#1
- ; MOV P1,A
- ; JB DQ,cADD
- ; sjmp $
- ;*/
- MOV R7,#16 ;忽略前16位系统识别码 (即地址码)
- AAQQ: JNB DQ,$; ;通过低电平段
- ;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_0 ]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: ;误差 0us
- MOV R6,#03H
- DL0:
- MOV R5,#89H
- DJNZ R5,$
- DJNZ R6,DL0
- 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,
- END
复制代码
|