找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4409|回复: 0
打印 上一主题 下一主题
收起左侧

单片机红外遥控解码ASM汇编程序

[复制链接]
跳转到指定楼层
楼主
51系列单片机做的红外遥控解码


单片机汇编语言源程序如下:
  1. /**红外遥控解码范例**/
  2. /**作者:田开坤**/
  3. /**较网上可以下载到的程序相比,本代码考虑了解码过程容易死机的问题,采取办法解决了,可以解码失败,但决不死机**/

  4. DQ      equ     0ebh            ;P4.3定义接口,参考STC89C51数据手册
  5. EX2     equ     0c2h            ;外部中断2,参考STC89C51数据手册
  6. SEG1    equ     0ffech          ;数码管1(最右)
  7. SEG2    equ     0ffedh          ;数码管2
  8. SEG3    equ     0ffeeh          ;数码管3
  9. SEG4    equ     0ffefh          ;数码管4(最左)
  10. BYT_DLY equ     5FH             ;延时函数参数变量
  11. DA_BUF  equ     40H             ;解码出的数据缓冲区,包括41H


  12.                 ORG 0000h
  13.                 LJMP main

  14.                 ORG 003bh       ;外部中断2入口地址,参考STC89C51数据手册
  15.                 LJMP EINT3

  16.                 ORG 40h
  17. main:           MOV SP,#60h
  18.                 SETB EA
  19.                 SETB EX2
  20.                 SJMP [        DISCUZ_CODE_1        ]nbsp;         ;原地踏步,等中断解码


  21. //中断接收解码模块

  22. EINT3:          CLR EA//关闭
  23.                 MOV R6,#10
  24. SB:             MOV BYT_DLY,#13 ;834uS
  25.                 ACALL DELAY     ;调用834微秒延时子程序
  26.                 JB DQ,EXIT      ;延时834微秒后判断DQ脚是否出现高电平如果有就退出解码程序
  27.                 DJNZ R6, SB     ;重复 10 次,目的是检测在 9000 微秒内如果出现高电平就退出解码程序
  28. ;-------------------------------;以上完成对遥控信号 起始码 的 9000 微秒的初始低电平信号的识别!!!!!

  29.                 JNB DQ, [        DISCUZ_CODE_1        ]nbsp;      ;等待,避开 起始码 低电平
  30.                 JB DQ,[        DISCUZ_CODE_1        ]nbsp;        ;避开结果码


  31. /*;测试按键一次有多少位低电平,不同遥控器不一样*/
  32. /*;电工电子中心投影遥控器只有32位,这对后边程序参数设置关系重大
  33.                 CLR A
  34. ADDLOOP:        JNB DQ,$
  35.                 ADD A,#1
  36.                 MOV P1,A
  37.                 JB DQ,cADD
  38.                 sjmp $
  39. */

  40.                 MOV R7,#16      ;忽略前16位系统识别码 (即地址码)
  41. AAQQ:           JNB DQ,[        DISCUZ_CODE_1        ]nbsp;       ;通过低电平段
  42.                 ;JB DQ,[        DISCUZ_CODE_1        ]nbsp;       ;以下6行代码可以用本行替换,但这样容易出现死机。
  43.                 MOV R6,#255
  44. CTN2:           JNB DQ,DER7     ;等待有效低电平到来,避开 结果码 高电平
  45.                 MOV BYT_DLY,#3  ;42uS
  46.                 ACALL DELAY     ;调用42微秒延时子程序,延时太短,计数器R6不够大,延时太长,会错过最佳检测点
  47.                 DJNZ R6,CTN2                     
  48.                 LJMP EXIT       ;防止死机
  49. DER7:           DJNZ R7,AAQQ

  50.                 MOV R1,#DA_BUF  ;设定1AH为起始RAM区
  51.                 MOV R2,#2       ;接收从DA_BUF到DA_BUF+1的2个内存,用于存放操作码 (即数据码) 和操作反码
  52. PP:             MOV R3,#8       ;每组数据为8位
  53. JJJJ:           JNB DQ,[        DISCUZ_CODE_1        ]nbsp;       ;等待通过数据码的低电平信号,等高电平到来后出去;
  54.                 MOV BYT_DLY,#13 ;834uS
  55.                 ACALL DELAY     ;高电平开始后用840(560<t<1125,)微秒的时间尺去判断信号此时的高低电平状态
  56.                 MOV C,DQ        ;将DQ引脚此时的电平状态0或1存入C中
  57.                 JNC UUU         ;如果为0就跳转到UUU
  58.                 ;JB DQ,[        DISCUZ_CODE_1        ]nbsp;       ;以下6行代码可以用本行替换,但这样容易出现死机。
  59.                 MOV R6,#255
  60. CTN3:           JNB DQ,UUU      ;等待有效低电平到来,避开 结果码 高电平
  61.                 MOV BYT_DLY,#3  ;42uS
  62.                 ACALL DELAY     ;调用840微秒延时子程序
  63.                 DJNZ R6,CTN3            
  64.                 LJMP EXIT       ;防止死机

  65. UUU:            MOV A,@R1       ;将R1中地址的给A
  66.                 RRC A           ;将C中的值0或1移入A中的最低位
  67.                 MOV @R1,A       ;将A中的数暂时存放在R1数值的内存中
  68.                 DJNZ R3,JJJJ    ;接收满8位换一个内存

  69.                 INC R1          ;对R1中的值加1,换下一个RAM
  70.                 DJNZ R2,PP      ;接收完8位数据码和8位数据反码,存放在1AH/1BH中                          

  71.                 MOV A,DA_BUF
  72.                 CPL A           ;对1AH取反后和1BH比较
  73.                 CJNE A,DA_BUF+1,EXIT    ;如果不等表示接收数据发生错误,放弃
  74.                                 
  75.                 MOV R7,DA_BUF   ;将按键的键值通过数码管显示出来!
  76.                 ACALL DISP
  77.                 CLR P1.0        ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功               
  78.                 MOV BYT_DLY,#50
  79.                 ACALL DELAY
  80.                 SETB P1.0       ;蜂鸣器停止
  81. EXIT:           SETB EA
  82.                 reti


  83. ;-------------------------延时子程序---------------------------------
  84. ;晶振22.1184M

  85. DELAY:          PUSH    BYT_DLY
  86. DEL31:          PUSH    BYT_DLY
  87. DEL32:          DJNZ    BYT_DLY,DEL32
  88.                 POP     BYT_DLY
  89.                 DJNZ    BYT_DLY,DEL31
  90.                 POP     BYT_DLY
  91.                 DJNZ    BYT_DLY,DELAY
  92.                 RET

  93. //数码管显示,数据由R7传入
  94. DISP:           mov dptr,#ledmap
  95.                 mov a,r7
  96.                 anl a,#0fh
  97.                 movc a,@a+dptr
  98.                 mov dptr,#SEG1
  99.                 cpl a
  100.                 movx @dptr,a

  101.                 mov dptr,#ledmap
  102.                 mov a,r7
  103.                 swap a                                 
  104.                 anl a,#0fh
  105.                 movc a,@a+dptr
  106.                 mov dptr,#SEG2
  107.                 cpl a
  108.                 movx @dptr,a

  109.                 mov dptr,#SEG3
  110.                 mov a,#0ffh
  111.                 movx @dptr,a
  112.                 mov dptr,#SEG4         
  113.                 movx @dptr,a  
  114.                 ret

  115. ledmap: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,77h,7ch,39h,5eh,79h,71h,00

  116.                 END
复制代码

所有资料51hei提供下载:
红外遥控解码ASM.7z (12.52 KB, 下载次数: 32)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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