;**************************************************************
; 红外遥控(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 ;程序结束
文章评论(0条评论)
登录后参与讨论