找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1559|回复: 5
收起左侧

单片机红外NEC解码汇编有两个结果?

[复制链接]
ID:521383 发表于 2020-3-13 23:21 | 显示全部楼层 |阅读模式
测试的时候发现有两个结果 一个是正确的解码了 一个是错误的解码 然后错误的解码好像少接收了两位 不知道哪里出错了 应该不是因为干扰 我没有弄验证数据的 因为我用别人的程序的时候 感觉没有任何出错 每次都是解码成功 我的这个错误的解码得到的结果也是反码补码是对的上的 错误的和正确的差两位 比如一个是00000000(正确的)  一个是00000011(错误的)  都是少偏移了两位一样

单片机源程序如下:
  1. ORG 000H
  2. MOV TMOD,#20H
  3. MOV TH1,#0FDH
  4. MOV TL1,#0FDH
  5. SETB TR1
  6. MOV SCON,#01000000B
  7. MAIN:
  8. JB P3.2,$;等待遥控信号出现
  9. MOV R6,#8
  10. SB: ACALL YS1 ;调用888微秒延时子程序
  11. JB P3.2,MAIN ;延时888微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
  12. DJNZ R6, SB;重复10次,目的是检测在8880微秒内如果出现高电平就退出解码程序
  13. ;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
  14. JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲
  15. JB P3.2,$;等待高电平的引导码过去
  16. ;CALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码
  17. MOV R1,#24H ;设定24H为起始RAM区
  18. MOV R2,#4
  19. PP: MOV R3,#8
  20. JJJJ:JNB P3.2,$;等待地址码第一位的高电平信号
  21. ACALL YS3 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
  22. MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
  23. JNC  UUU;如果为0就跳转到UUU
  24. JB P3.2,$;如果为1就等待高电平信号结束
  25. UUU: MOV A,@R1 ;将R1中地址的给A
  26. RRC A;将C中的值0或1移入A中的最低位
  27. MOV @R1,A ;将A中的数暂时存放在R1中
  28. DJNZ R3,JJJJ;接收地址码的高8位
  29. INC R1;对R1中的值加1,换成下一个RAM
  30. DJNZ R2,PP ;接收完16位地址码和8位数据码和8位数据反码,存放在24H/25H/26H/27H的RAM中
  31. CPL P1.1
  32. LCALL SEND3
  33. JMP MAIN

  34. YS1: MOV R4,#20 ;
  35. D1: MOV R5,#19 ;
  36. DJNZ R5,$;
  37. DJNZ R4,D1;
  38. RET;延时888us左右

  39. YS3: MOV R4,#35 ;
  40. D3: MOV R5,#10 ;
  41. DJNZ R5,$;
  42. DJNZ R4,D3;
  43. RET;一共846.9us

  44. YS2: MOV R4,#17 ;
  45. D2: MOV R5,#125;
  46. DJNZ R5,$;
  47. DJNZ R4,D2;
  48. RET;大概921us

  49. SEND3:
  50. MOV A,26H
  51. MOV SBUF,A
  52. JNB TI,$
  53. CLR TI
  54. RET

  55. END
复制代码


回复

使用道具 举报

ID:235200 发表于 2020-3-14 01:06 | 显示全部楼层
程序中下列两句需仔细去测量时间
ACALL YS3 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2 ;将P3.2引脚此时的电平状态0或1存入C中
回复

使用道具 举报

ID:401564 发表于 2020-3-14 08:42 | 显示全部楼层
红外接收最好使用中断,而你的代码是直接在中断向量地址那进行,虽然中断没有打开,但我不知道会有什么不同,一般都不这么干的
你单片机的具体型号是什么?延时是否对应得上?

ORG 0H
LJMP MAIN
ORG 003H
LJMP INT0_ISR  ;这是红外接收程序
ORG 100H
MAIN



INT0_ISR:

;红外接收在这里进行
RETI
回复

使用道具 举报

ID:521383 发表于 2020-3-14 15:03 | 显示全部楼层
csmyldl 发表于 2020-3-14 01:06
程序中下列两句需仔细去测量时间
ACALL YS3 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态 ...

振晶是11.0592MHZ 时间上应该是对的上的吧 YS3大概是873.425us左右 应该用873.425延时应该是可以判断的吧 会不会出现时间的叠加 然后就错误了 可是有时候解码成功 有时解码有误差 前面多接收了两位 然后后面少接收了两位 造成了误差 但是不知道为啥这样
回复

使用道具 举报

ID:521383 发表于 2020-3-14 15:04 | 显示全部楼层
Y_G_G 发表于 2020-3-14 08:42
红外接收最好使用中断,而你的代码是直接在中断向量地址那进行,虽然中断没有打开,但我不知道会有什么不同,一 ...

好的 我试一下不在那个地址写一下看看  当时没想那么多
回复

使用道具 举报

ID:401564 发表于 2020-3-14 15:28 | 显示全部楼层
qcw729 发表于 2020-3-14 15:04
好的 我试一下不在那个地址写一下看看  当时没想那么多

我不知道你用的单片机型号是什么,不能确定延时对不对
你可以去STC下载器那,那有现成的延时程序,自己不用计算,套用就可以了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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