专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
HT6221用89C51解码
2020-02-01 16:28
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
11682
8
8
请问:HT6221用89C51解码,在单片机用中断解码,延时的时间按遥控器的455KHZ晶振来计算,还是按单片机的12M晶振来算?
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
greatwall2
1楼-- · 2020-02-01 20:44
按单片机的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
2楼-- · 2020-02-01 23:37
不懂汇编的路过。
加载中...
kaimpf
3楼-- · 2020-02-02 01:38
又看到用延时来解码的,咋不用外部中断结合Timer来解码呢?
加载中...
DPTR1
4楼-- · 2020-02-02 02:24
回复【1楼】greatwall2
-----------------------------------------------------------------------
非常非常感谢!
加载中...
oldfang
5楼-- · 2020-02-02 07:44
精彩回答 2 元偷偷看……
加载中...
hongkong
6楼-- · 2020-02-02 12:27
回复【3楼】kaimpf
又看到用延时来解码的,咋不用外部中断结合timer来解码呢?
-----------------------------------------------------------------------
同意
加载中...
1
2
下一页
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
东软载波ESF0654 PDS开发板串口USART0代码分享
1 个回答
普通32位单片机使用linux的应用代码
5 个回答
东软载波ESF0654 PDS开发板AT24C04的调试
9 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
下面是改自网上的一段程序,原作摒弃了键连_发功能,我这里加上了。原作者每行都注释了,对初学者很有用。
;=============外部中断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
-----------------------------------------------------------------------
非常非常感谢!
又看到用延时来解码的,咋不用外部中断结合timer来解码呢?
-----------------------------------------------------------------------
同意
一周热门 更多>