搜索
bottom↓
回复: 7

HT6221用89C51解码

[复制链接]

出0入0汤圆

发表于 2010-12-19 12:45:51 | 显示全部楼层 |阅读模式
请问:HT6221用89C51解码,在单片机用中断解码,延时的时间按遥控器的455KHZ晶振来计算,还是按单片机的12M晶振来算?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 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

出0入0汤圆

发表于 2010-12-19 21:14:07 | 显示全部楼层
不懂汇编的路过。

出0入0汤圆

发表于 2010-12-19 23:21:11 | 显示全部楼层
又看到用延时来解码的,咋不用外部中断结合Timer来解码呢?

出0入0汤圆

 楼主| 发表于 2010-12-20 16:44:02 | 显示全部楼层
回复【1楼】greatwall2
-----------------------------------------------------------------------

非常非常感谢!

出0入0汤圆

发表于 2010-12-20 16:51:32 | 显示全部楼层
谢谢1楼共享代码
最近本来想找个无线发射和接受模块
以前有成套的买,现在在电子城没有找到
这个软件解码的回去看看

出0入0汤圆

发表于 2011-9-26 21:11:10 | 显示全部楼层
回复【3楼】kaimpf
又看到用延时来解码的,咋不用外部中断结合timer来解码呢?
-----------------------------------------------------------------------

同意

出0入0汤圆

发表于 2012-12-24 11:15:38 | 显示全部楼层
用过,很好用。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 15:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表