红外遥控解码程序
程序已经编译好了。
;遥控器读码程序(晶振为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新板
结束