DPTR1 发表于 2010-12-19 12:45:51

HT6221用89C51解码

请问:HT6221用89C51解码,在单片机用中断解码,延时的时间按遥控器的455KHZ晶振来计算,还是按单片机的12M晶振来算?

greatwall2 发表于 2010-12-19 17:59:53

按单片机的12M晶振算。
下面是改自网上的一段程序,原作摒弃了键连_发功能,我这里加上了。原作者每行都注释了,对初学者很有用。

;=============外部中断0服务程序 ,实现软件解码=========================================
INT:                                CLR EA                 ;关中断
                                MOV R6,#10
JM0:                                ACALL YS1        ;调用882微秒延时子程序
                                JB P3.2,EXIT        ;延时882微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
                                DJNZ R6, JM0        ;重复10次,目的是检测在8820微秒内如果出现高电平就退出解码程序
                                JNB P3.2, $         ;等待高电平避开9毫秒低电平引导脉冲
                                LCALL YS4           ;等待2.25毫秒再判断是否连_发
                                JB P3.2,JM1X        ;为高电平则不是连_发
                                SETB LF_FLAG        ;为低电平则置连_发标志
                                AJMP EXIT        ;退出解码
JM1X:                                ACALL YS5         ;延时4.74毫秒避开4.5毫秒的结果码
                                MOV R7,#16        ;忽略前16位系统识别码,HT6221共发送32位数据,前16位为用户码,后16为数据码才是我们需要的
JM1:                                 JNB P3.2,$        ;等待地址码第一位的高电平信号
                                LCALL YS1        ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
                                MOV C,P3.2        ;将P3.2引脚此时的电平状态0或1存入C中
                                JNC JM2                ;如果为0就跳转到JM2
                                LCALL YS3        ;检测到高电平1的话延时1毫秒等待脉冲高电平结束
JM2:                                DJNZ R7,JM1
                                MOV R1,#1AH         ;设定1AH为起始RAM区
                                MOV R2,#2         ;接收从1AH到1BH的2个内存,用于存放操作码和操作反码,
                                                   ;16位数据分前8位和后8位,后8位是前8位的反码,用于检验
JM3:                                MOV R3,#8        ;每组数据为8位
JM4:                                JNB P3.2,$        ;等待地址码第一位的高电平信号
                                LCALL YS1        ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
                                MOV C,P3.2        ;将P3.2引脚此时的电平状态0或1存入C中
                                JNC JM5                ;如果为0就跳转到JM5
                                LCALL YS3        ;检测到高电平1的话延时1毫秒等待脉冲高电平结束,然后把C中的1存入R1
JM5:                                MOV A,@R1        ;将R1中的数据给A
                                RRC A                ;将C中的值0或1移入A中的最低位
                                MOV @R1,A        ;将A中的数暂时存放在R1数值的内存中
                                DJNZ R3,JM4        ;接收满8位换一个内存
                                INC R1                ;对R1中的值加1,换下一个RAM
                                DJNZ R2,JM3         ;接收完8位数据码和8位数据反码,存放在1AH/1BH中
                                MOV A,1AH
                                CPL A                ;对1AH取反后和1BH比较
                                CJNE A,1BH,EXIT        ;如果不等表示接收数据发生错误,放弃
                                CPL A                ;再取反还原键值
                                MOV KVALUE,A        ;键值送KVALUE和KTEMP
                                MOV KTEMP,A       
                                SETB DF_FLAG
EXIT:                                SETB EA         ;开中断
                                RETI                ;退出解码子程序

;=============延时子程序1,精确延时882微秒,晶振11.0592M,下同=========================================
YS1:                                MOV TH0,#0FCH
                                MOV TL0,#0D4H
                                SETB TR0
                                JNB TF0,$
                                CLR TF0
                                RET

;============延时子程序2,精确延时4740微秒==========================================
YS2:                                MOV TH0,#0EEH
                                MOV TL0,#0EFH
                                SETB TR0
                                JNB TF0,$
                                CLR TF0
                                RET
;=============延时程序3,精确延时1000微秒===========================================
YS3:                                MOV TH0,#0FCH
                                MOV TL0,#66H
                                SETB TR0
                                JNB TF0,$
                                CLR TF0
                                RET
;=============延时程序4,精确延时2.25微秒===========================================
YS4:                                MOV TH0,#0F7H
                                MOV TL0,#0E6H
                                SETB TR0
                                JNB TF0,$
                                CLR TF0
                                RET
;=============延时程序5,精确延时2.49微秒===========================================
YS5:                                MOV TH0,#0F7H
                                MOV TL0,#09H
                                SETB TR0
                                JNB TF0,$
                                CLR TF0
                                RET

NE555 发表于 2010-12-19 21:14:07

不懂汇编的路过。

kaimpf 发表于 2010-12-19 23:21:11

又看到用延时来解码的,咋不用外部中断结合Timer来解码呢?

DPTR1 发表于 2010-12-20 16:44:02

回复【1楼】greatwall2
-----------------------------------------------------------------------

非常非常感谢!

oldfang 发表于 2010-12-20 16:51:32

谢谢1楼共享代码
最近本来想找个无线发射和接受模块
以前有成套的买,现在在电子城没有找到
这个软件解码的回去看看

hongkong 发表于 2011-9-26 21:11:10

回复【3楼】kaimpf
又看到用延时来解码的,咋不用外部中断结合timer来解码呢?
-----------------------------------------------------------------------

同意

ddcchh 发表于 2012-12-24 11:15:38

用过,很好用。
页: [1]
查看完整版本: HT6221用89C51解码