⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rmt_led.asm

📁 电子开发网培训用的51单片机内部培训代码
💻 ASM
字号:
;遥控器读码程序(晶振为11.0592),该程序能读出遥控器的控制码,并通过LED显示出来
;开发商  :电子开发网www.dzkf.com (专业提供开发方案,
;          电子元器件网上订购,单片机培训服务)
;对开发板有什么疑问,请上我们的论坛bbs.dzkf.com探讨
;OMEN 2005/1/16于TCL
;***************************************************************
A_BIT  EQU  20H ;数码管个位数存放内存位置
B_BIT  EQU  21H ;数码管十位数存放内存位置
NO_OUT EQU  24H  ;最终控制号码存放单元
A_NO   EQU  25H  ;数码管个位数对应代码存放内存位置
B_NO   EQU  26H  ;数码管十位数对应代码存放内存位置
;22H,23H为控制码及其反码的存放单元

;*******************<<主程序>>***********************************
       ORG  0000H
       AJMP 0030H
       ORG  0003H ;外部中断P3.2脚INT0入口地址
       AJMP INT   ;转入外部中断服务子程序(解码程序)
       ORG  0030H
       AJMP MAIN  ;转入主程序
;***************************************************************
MAIN:  MOV  NO_OUT,#0H
       SETB EA  ;打开CPU总中断请求
       SETB IT0 ;设定INT0的触发方式为脉冲负边沿触发
       SETB EX0 ;打开INT0中断请求
LOOP:  MOV A,NO_OUT;将按键的键值通过P1口的8个LED显示出来!
       CPL A    ;由于P1发光二极管显示的是电平的反状态,所以取反
       MOV P1,A ;发光二极管显示输出
       LCALL DISPLAY;LED数码管显示输出
       AJMP LOOP;循环
;********************<<中断接受遥控程序>>************************
;以下为进入P3.2脚外部中断子程序,也就是解码程序
INT:
     PUSH ACC
     PUSH PSW ;将PSW和ACC推入堆栈保护
     CLR EA ;暂时关闭CPU的所有中断请求
     MOV R6,#10
SB:  LCALL DL865;调用865微秒延时子程序
     JB P3.2,EXIT;延时865微秒后判断P3.2脚是否出现高电平如果有就退出解码程序
     DJNZ R6, SB;重复10次,目的是检测在8650微秒内如果出现高电平就退出解码程序
;以上完成对遥控信号的9000微秒的初始低电平信号的识别。
     JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲
     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 DL1000;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUUA: DJNZ R7,JJJJA
     MOV R1,#22H ;设定22H为起始RAM区
     MOV R2,#2;接收从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 DL1000;检测到高电平1的话延时1毫秒等待脉冲高电平结束
UUU: MOV A,@R1;将R1中地址的给A
     RRC A;将C中的值0或1移入A中的最低位
     MOV @R1,A;将A中的数暂时存放在R1数值的内存中
     DJNZ R3,JJJJ;接收满8位换一个内存
     INC R1;对R1中的值加1,换下一个RAM
     DJNZ R2,PP ;接收完8位数据码和8位数据反码,存放在22H/23H中
     MOV A,22H
     CPL A;对22H取反后和23H比较
     CJNE A,23H,EXIT;如果不等表示接收数据发生错误,放弃
     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 P3.6;蜂鸣器停止
     lcall DL4737
EXIT: SETB EA ;允许中断
     POP PSW
     POP ACC ;将PSW和ACC推入堆栈保护
     RETI ;退出解码子程序

;*******************<<LED数码管显示子程序>>**********************
DISPLAY:
     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_NO,A
     MOV A,B_BIT ;取十位数
     MOVC A,@A+DPTR ;查十位数的7段代码
     MOV B_NO,A
DPLOP:MOV A,A_NO
     MOV P0,A ;送出个位的7段代码
     ;SETB P2.1;关闭十位显示,防止鬼影
     CLR P2.0 ;开个位显示
     LCALL DL40 ;显示4737微秒
     SETB P2.0;关闭个位显示,防止鬼影
     MOV A,B_NO
     MOV P0,A ;送出十位的7段代码
     CLR P2.1 ;开十位显示
     LCALL DL40 ;显示4737微秒
     SETB P2.1;关闭十位显示,防止鬼影
     RET
;**********************<<延时程序>>******************************
DL865: MOV R4,#12 ; 1.09*(2R5+4)*R4+2延时子程序1,精确延时865微秒
D1:  MOV R5,#31
     DJNZ R5,$
     DJNZ R4,D1
     RET
DL4737: MOV R4,#12 ;延时子程序2,精确延时4737微秒
D2:  MOV R5,#179
     DJNZ R5,$
     DJNZ R4,D2
     RET
DL1000: MOV R4,#17;延时程序3,精确延时1000微秒
D3:  MOV R5,#25
     DJNZ R5,$
     DJNZ R4,D3
     RET
DL40: MOV R4,#1;延时程序4,精确延时40/17微秒
D4:  MOV R5,#1
     DJNZ R5,$
     DJNZ R4,D4
     RET

;****************************************************************
;如果是共阳数码管的显示代码 1-F 16个代码
NUMTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH  ;STC新板的
     END

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -