红外遥控解码程序

这是一个接收后用数码管显示红外遥控的程序。请参考。

程序已经编译好了。

;遥控器读码程序(晶振为11.0592),可以读取遥控器的控制码,并通过LED显示。

;TCL的OMEN 2005/1/16

;***************************************************************

a _ BIT EQU 20H;数码管一位数存储单元

b _ BIT EQU 21H;数码管十位存储单元

没有EQU 24H;最终控制数存储单元

a _ NO EQU 25H;数码管的数字对应于存储代码的存储位置。

b _ NO EQU 26H;数码管的十位数字对应于存储代码的存储位置。

;22h和23h是控制代码及其逆代码的存储单元。

;* * * * * * * * * * * * * * * * * * * & lt& lt主程序> & gt***********************************

ORG 0000H

AJMP 0030H

ORG 0003H外部中断P3.2引脚INT0入口地址

AJMP INT切换到外部中断服务子程序(解码器)

ORG 0030H

AJMP MAIN转移到主程序

;***************************************************************

主要:MOV NO_OUT,#0H

SETB EA;打开CPU总中断请求

SETB IT0;将INT0的触发模式设置为脉冲负沿触发。

SETB EX0;打开INT0中断请求

循环:MOV A,NO _ OUT通过P1端口的8个led显示按键的键值!

CPL A;因为P1 LED显示电平的反相状态,所以它是反相的。

MOV P1,A;LED显示输出

LCALL显示;LED数码管显示输出

AJMP循环;传播

;* * * * * * * * * * * * * * * * * * * & lt& lt中断接受远程控制程序>:& gt************************

;下面是进入P3.2引脚的外部中断子程序,也就是解码程序。

INT:

推送ACC

推PSW将PSW和ACC推入堆栈保护

CLR EA暂时关闭CPU的所有中断请求。

MOV R6,#10

SB:LCALL dl 865;调用865微秒延迟子程序

JB P3.2,退出;延迟865微秒后,判断P3.2引脚是否为高电平,如果是,则退出解码程序。

DJNZ R6,SB;重复10次,目的是检测8650微秒内是否有高电平,退出解码程序。

;以上完成了遥控信号的9000微秒的初始低电平信号的识别。

JNB P3.2,$;等待高电平以避免9 ms低电平导频脉冲。

LCALL DL4737延迟4.74毫秒以避免4.5毫秒的结果代码。

MOV R7,# 16;忽略系统识别码的前26位数字。

JJJJA:JNB P3.2,$;等待地址码第一位的高电平信号。

LCALL DL865高电平开始后,用865微秒的时标来判断此时信号的高低电平状态。

MOV C,P3.2将P3.2引脚的电平状态0或1存储在c中。

JNC UUUA如果是0,跳转到UUUA。

LCALL dl 1000;如果检测到高电平1,延迟1毫秒,等待脉冲高电平结束。

UUUA: DJNZ R7,JJJJA

MOV R1,# 22H将22H设置为起始RAM区域。

MOV·R2,排名第二;从22H到23H接收2个存储器,用于存储操作码和操作逆。

PP: MOV R3,# 8;每组数据为8位。

JJJJ: JNB P3.2,$;等待地址码第一位的高电平信号。

LCALL DL865高电平开始后,用865微秒的时标来判断此时信号的高低电平状态。

MOV C,P3.2将P3.2引脚的电平状态0或1存储在c中。

JNC UUU;如果是0,跳到UUU。

LCALL dl 1000;如果检测到高电平1,延迟1毫秒,等待脉冲高电平结束。

UUU: MOV A,@ r 1;将R1中的地址给a。

RRC A;将C中的值0或1移动到a中的最低位。

MOV @R1,A;将该数暂时存储在一个R1值的存储器中。

DJNZ R3,JJJJ接收完整的8位内存。

INC r 1;将R1中的值加上1,并替换为RAM。

DJNZ R2,PP;接收到8位数据码和8位数据逆码后,存储在22H/23H中。

MOV A,22H

CPL A;倒置后比较22H和23H。

CJNE A,23H,出口;如果不等式表示接收数据有错误,放弃。

MOV A,22H

MOV NO_OUT,A

;LCALL EEPROM _ C;清除先前保存的代码。

;LCALL DL4737

;LCALL EEPROM _ W;将代码存储在单片机内部的EEPROM中

;LCALL DL4737

CLR P3.6蜂鸣器发出-哔-哔的声音,表示解码成功。

LCALL DL4737

LCALL DL4737

LCALL DL4737

SETB p 3.6;蜂鸣器停止

lcall DL4737

出口:SETB EA;允许中断

POP PSW

POP ACC将PSW和ACC推入堆栈保护

RETI;退出解码子程序

;* * * * * * * * * * * * * * * * * * * & lt& ltLED数码管显示子程序>:& gt**********************

显示:

MOV A,NO _ OUT将NO_OUT分为位和16位。

ANL A,# 0FH取低四位,放入a_bit。

MOV A_BIT,A;单位

MOV A,NO _ OUT

RR A

RR A

RR A

RR A;四招,高四换低四。

ANL A,# 0FH取高四位,放入B_bit。

MOV B_BIT,A;b区有点。

MOV DPTR,# NUMTAB指定表格查找的起始地址。

MOV A,A _ BIT取一位数

MOVC A,@ A+DPTR;查找一位数的7段代码

MOV A _不,A

MOV A,B _ BIT取十位数

MOVC A,@ A+DPTR;检查十位数的7段代码。

MOV B _不,A

MOV,不

MOV P0,A;发送一个7位代码

;SETB p 2.1;关闭十位数显示,防止重影。

CLR P2.0打开一个位显示

LCALL DL40显示4737微秒

SETB p 2.0;关闭单元显示器以防止重影。

MOV A,B_NO

MOV P0,A;发送一个十位数的7段代码。

CLR p 2.1;打开十位数显示

LCALL DL40显示4737微秒

SETB p 2.1;关闭十位数显示,防止重影。

浸水使柔软

;* * * * * * * * * * * * * * * * * * * * * & lt& lt延迟程序> & gt******************************

DL865: MOV R4,# 12;1.09*(2R5+4)*R4+2延迟子程序1,精确延迟865微秒。

D1: MOV R5,#31

DJNZ R5,美元

DJNZ R4,D1

浸水使柔软

DL4737: MOV R4,# 12;延时子程序2,精确延时4737微秒

D2: MOV R5,#179

DJNZ R5,美元

D2 DJNZ R4

浸水使柔软

DL1000: MOV R4,# 17;延时程序3,精确延时1000微秒。

D3: MOV R5,#25

DJNZ R5,美元

DJNZ R4 D3

浸水使柔软

DL40: MOV R4,# 1;延时程序4,精确延时40/17微秒。

D4: MOV R5,#1

DJNZ R5,美元

D4 DJNZ R4

浸水使柔软

;****************************************************************

;如果是* * * LED的显示代码是1-F 16代码。

NUMTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EHSTC新板

结束