原创 红外遥控(NECformat)接收程序和LED显示

2006-11-8 21:26 4400 7 7 分类: MCU/ 嵌入式

 


;**************************************************************
;             红外遥控(NEC format)接收程序   LED显示
;**************************************************************
;*  Author:   Li Zheng hang
;*  Corp:     XXXXXXXXX
;*  Date  :   2006-08-12              
;*  Mobile:   13346446847
;*  Phone:    0760-xxxxxxxx
;*  E-mail:   47uf@sohu.com;56pf@163.com        
;***************************************************************
;*****         程序简介                                  
;***************************************************************
;1:本程序作用是实现红外线遥控的单片机接收,在数码管上显示出
;  遥控的码值(有8位显示,分别显示系统码4位,按键的键值码2位,
;   键值码的反码2位)
;2:单片机:AT89C51,晶体的频率:11.0592MHz.
;3:硬件连接:数码管是共阴极,采用8个CD4094驱动8个数码管
;4:在P0.6,P0.5,P0.4,接三个LED,用于显示程序运行的状态。
;5: 单片机接收后,遥控信号输出接在AT89C51的P3.2脚。
;   本程序是采用I/O线模拟串口进行数据传输
;6: 程序修改:李正航2006年05月22日最终确认
;
;;label------Opecode-Operand---------Note-----------------------
;****************************************************************
;****        符号定义        
;****************************************************************
;   定义三个LED,用来指示程序当前运行的状态(低电平亮)
RED_LED      BIT P0.6                ;RED LED亮表示接收代码出错。
BLUE_LED     BIT P0.5                ;BULE LED亮表示正在等待接收状态
YELLOW_LED   BIT P0.4                ;YELLOW LED表示解码正常。
SPEAKER      BIT P0.1
IRIN         BIT P3.2
VRXD         BIT P3.0
VTXD         BIT P3.1
;********************************************************
;****       中断入口程序     
;********************************************************
            ORG     0000H           ;程序执行开始地址
            LJMP    MAIN            ;跳到标号MAIN执行
            ORG     0003H           ;外中断0中断程序入口
            RETI                           ;外中断0中断返回
            ORG     000BH           ;定时器T0中断程序入口
;           LJMP    INTT0           ;跳至INTTO执行
            ORG     0013H           ;外中断1中断程序入口
            RETI                           ;外中断1中断返回
            ORG     001BH           ;定时器T1中断程序入口
;           LJMP    INTT1           ;跳至INTT1执行
            ORG     0023H           ;串行中断程序入口地址
            RETI                         ;串行中断程序返回
;********************************************************
;***        主程序初始化
;********************************************************
            ORG      030H
   MAIN:    MOV      SP, #5AH
            ;CLR      BLUE_LED        ;BLUE LED
            SETB     RED_LED
     M1:    JNB      P3.2,IR        ;遥控扫描
            LJMP     M1                ;在正常无遥控信号时,一体化红外接收头
                                                ;输出是高电平,程序一直在循环。
;**************************************************************************
;**          解码程序
;**************************************************************************
       ;以下对遥控信号的9000微秒的初始低电平信号的识别
;==========================================================================
     IR:    MOV      R6,#10
  IR_SB:    ACALL    DELAY882        ;调用882微秒延时子程序
            JB       P3.2,IR_ERROR   ;延时882微秒后判断P2.2脚是否出现
                                     ;高电平如果有就退出解码程序
            DJNZ     R6,IR_SB        ;重复10次,目的是检测在8820微秒内如果
                                     ;出现高电平就退出解码程序
                                     ;识别连发码,和跳过4.5MS的高电平。
            JNB      P3.2, $         ;等待高电平避开9毫秒低电平引导脉冲
            ACALL    DELAY2400
            JNB      P3.2,IR_GOTO    ;这里为低电平,认为是连发码信号
            ACALL    DELAY2400       ;延时4.74毫秒避开4.5毫秒的结果码
;*************************************************************************
           ;以下是32位数据码的读取,0和1的识别 请看图2
;=========================================================================
            MOV      R1,#3AH         ;设定3AH为起始RAM区
            MOV      R2,#4
 IR_4BYTE:  MOV      R3,#8
  IR_8BIT:  JNB      P3.2,$          ;等待地址码第一位的高电平信号//////
            LCALL    DELAY882        ;高电平开始后用882微秒的时间
                                     ;判断信号此时的高低电平状态
            MOV      C,P3.2          ;将P3.2引脚此时的电平状态0或1存入C中
            JNC      IR_8BIT_0       ;如果为0就跳转到IR_8BIT_0
            LCALL    DELAY1000       ;/////////////
IR_8BIT_0:  MOV      A,@R1           ;将R1中地址的给A
            RRC      A               ;将C中的值0或1移入A中的最低位
            MOV      @R1,A           ;将A中的数暂时存放在R1中
            DJNZ     R3,IR_8BIT      ;接收地址码的高8位
            INC      R1              ;对R1中的值加1,换下一个RAM
            DJNZ     R2,IR_4BYTE     ;接收完16位地址码和8位数据码和8位数据,
                                     ;存放在3AH/3BH/3CH/3DH的RAM中
            JMP      IR_GOTO         ;解码完成!跳到相应的执行部份
;************************************************************************ 
;***         重复码执行处
;************************************************************************
;          IR_Rp:
                                     ;这里为重复码执行处
                                     ;按住遥控按键时,每过108ms就到这里来
;          JMP       IR_GOTO
;***********************************************************************
IR_ERROR:  CLR       RED_LED         ;RED LED==Error退出
           LCALL     DELAY2400
           LCALL     DELAY2400
           LCALL     DELAY2400
           LJMP      MAIN            ;退出解码子程
 
;************************************************************************
;**        遥控码值识别判断
;************************************************************************
IR_GOTO:
;        这里还要判断3AH和3BH两个系统码或用户码,用于识别不同的遥控器
;          MOV      A,3AH
;          CJNE     A,#xxH,IR_ERROR   ;用户码1不对则退出
;          MOV      A,3BH
;          CJNE     A,#xxH,IR_ERROR   ;用户码2不对则退出
           MOV      A,3AH
           CPL      A
           CJNE     A,3BH,IR_ERROR    ;有些遥控器用户码1的用户码2不是反码


           MOV      A,3CH             ;判断两个数据码是否相反
           CPL      A
           CLR      YELLOW_LED        ;YELLOW LED亮,解码正常
           CJNE     A,3DH,IR_ERROR    ;两个数据码不相反则退出
;**************************************************************************
    ;     遥控执行部份
;**************************************************************************
;          MOV      A,3CH               ;判断对应按键
;          CJNE     A,#xxH,$+6
;          LJMP     跳到对应按键执行处
;          CJNE     A,#xxH,$+6
;          LJMP     跳到对应按键执行处
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;         MOV       P1,3DH             ;将按键的键值通过P1口的8个LED显示出来!
;         CLR       P0.0               ;蜂鸣器鸣响-嘀嘀嘀-的声音,表示解码成功
;         LCALL     DELAY2400
;         LCALL     DELAY2400
;         LCALL     DELAY2400
;         SETB      P0.0               ;蜂鸣器停止
;*========================================================================
;**************************************************************************
;**     比较数值,将3A,3B,3C的3个16位的码值转换成6个8位分别存放在79H--7FH.
;**************************************************************************
 BIJIAO:   MOV      A,3CH            ;按键数值判断执行,将3CH的八位数的                       
           ANL      A,#0FH           ;高4位和低4位分别转存在7AH和79H中
           MOV      7AH,A
           MOV      A,3CH
           ANL      A,#0F0H
           SWAP     A
           MOV      7BH,A
 
           MOV      A,3DH            ;按键数值判断执行,将3CH的八位数的                       
           ANL      A,#0FH           ;高4位和低4位分别转存在7AH和79H中
           MOV      78H,A
           MOV      A,3DH
           ANL      A,#0F0H
           SWAP     A
           MOV      79H,A


           MOV      A,3AH           ;按键数值判断执行,将3AH的八位数的
           ANL      A,#0FH          ;高4位和低4位分别转存在7CH和7BH中
           MOV      7EH,A        
           MOV      A,3AH
           ANL      A,#0F0H
           SWAP     A
           MOV      7FH,A


           MOV      A,3BH           ;按键数值判断执行,将3BH的八位数的高4位和
           ANL      A,#0FH          ;低4位分别转存在7CH和7BH中
           MOV      7CH,A           ;转存后79H,7AH,7BH,7CH,7EH,7FH的高4位都是0
           MOV      A,3BH
           ANL      A,#0F0H
           SWAP     A
           MOV      7DH,A


           MOV      P1,3CH          ;将按键的键值通过P1口的8个LED显示出来
           CALL     DELAY1
           CALL     DELAY1
           CALL     DELAY1
           SETB     YELLOW_LED
           ACALL    DISPLAY         ;执行显示功能,将码值显示在数码管上


;清除遥控值使连按失效
           MOV    3AH,#00H
           MOV    3BH,#00H
           MOV    3CH,#00H
           MOV    3DH,#00H
           LJMP   MAIN
;=================================================
;          四个延时子程序
;=========================882
DELAY882:                           ;1.085x ((202x4)+5)=882
           MOV    R7,#202
DELAY882_A:
           NOP
           NOP
           DJNZ   R7,DELAY882_A
           RET
;=========================1000
DELAY1000:                          ;1.085x ((229x4)+5)=999.285
           MOV    R7,#229
DELAY1000_A:
           NOP
           NOP
           DJNZ   R7,DELAY1000_A
           RET
;========================2400
DELAY2400:                          ;1.085x ((245x9)+5)=2397.85
           MOV R7,#230
DELAY2400_A:
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP
           NOP  
           DJNZ   R7,DELAY2400_A
           RET
;===========================================
DELAY1:                             ;DELAY1 是数码管扫描延时子程序。  
           MOV    41H,#6  
AD_1:      MOV    40H,#6 
AD_2:      MOV    42H,#6 
           DJNZ   42H,$
           DJNZ   40H,AD_2
           DJNZ   41H,AD_1
           RET                     ;RET延时子程序返回。
;=================================================================
;***********************************************************************
;**       显示子程序
;***********************************************************************
DISPLAY:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;         以下是标准的串口数据传输程序写法
;***********************************************************************************
                       ;DIR子程序的作用是将3AH,3BH,3CH的三个八位二进制数
                       ;以十进制数形式显示在数码上。
;MOV SCON,#00H         ;初始化串行口方式0
;MOV R7,#08H           ;显示8位数
;MOV R0,#7FH           ;50H-55H为显示缓冲区
;MOV DPTR,#TABLE       ;字形表的入口地址
;LOOP:
;MOV A,@R0             ;取最高位的待显示数据
;MOVC A,@A+DPTR        ;查表获取字形码
;MOV SBUF,A            ;送串口显示
;DELAY:
;JNB TI,DELAY          ;等待发送完毕
;CLR TI                ;清发送标志
;DEC R0                ;指针下移一位,准备取下一个待显示数
;DJNZ R7,LOOP          ;直到8个数据全显示完。
;RET                   ;程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;*********************************************************************************
;;         以下是用I/O线模拟串口进行数据的转送
;********************************************************************************
; 设定VTXD和VRXD分别为模拟串口的TXD和RXD


VUARTNO:   MOV       R0,#7FH                 ;发送缓冲区首址
           MOV       R2,#8H                  ;设置发送的字节数
TCONTU:    MOV       R3, #8H                 ; 一帧中的发送位数8位
           MOV       DPTR,#TABLE             ;字形表的入口地址
           MOV       A, @R0                  ;发送字节数据入A 中
           MOVC      A,@A+DPTR               ;查表获取字形码
TSTA:      JNB       ACC.0,ST0               ; 检查发送位是0 还是1 分别转ST0 或ST1
ST1:       SETB      VRXD                    ; 发送1
           CLR       VTXD
           SETB      VTXD
           SJMP      TCONT
ST0:       CLR       VRXD                    ;发送0
           CLR       VTXD
           SETB      VTXD
TCONT:     RR        A                       ;发送完一位指向下一位
           DJNZ      R3, TSTA                ;一帧发送完毕未完继续
           DEC       R0                      ;指向下一个发送单元
           DJNZ      R2 ,TCONTU              ;8个字节发送完未完继续
           RET                               ;8个字节数据发送完结束,程序返回
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;     


;*********************************************************************
;**       数据列表
;*********************************************************************
;TABLE:DB 0C0H, 0F9H,  0A4H,  0B0H,  99H       ; (共阳数码管,显示的字
;      DB  92H,  82H,  0F8H,  80H,  90H ,088H  ; 形码对应从0--F)
;      DB  83H, 0C6H,  0A1H, 86H, 84H, 0FFH
;#####################################################################
;TABLE: DB  03FH, 06H,  05BH,  04FH,  66H      ; (共阴数码管,显示的字
;       DB  6DH,  7DH,  07H,  7FH,  6FH ,077H  ; 形码对应从0--F)
;       DB  7CH,  39H,  5EH,  79H,  71H
;%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
;TABLE: DB 0BFH, 86H,  0DBH, 0CFH, 0E6H         ;01234  (IR WORD CODE)
;       DB 0EDH, 0FDH, 0E0H,  0FFH, 0F6H        ;56789
;       DB 0F7H, 0FCH, 0B9H ,0DEH, 0F9H, 0F1H   ;AbCdEF
;&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
TABLE: DB  0FCH, 060H, 0DAH, 0F2H, 66H         ;01234串口共阴数码管
       DB  0B6H, 0BEH, 0E0H, 0FEH, 0F6H        ;56789
       DB  0EEH, 3EH,  9CH,  7AH,  9EH,8EH     ;AbCdEF
;======================================================================
         END                                       ;程序结束



 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /1 下一条