单片机试验五:流水数字显示综合练习
P1.0,P1.1, P1.2,P1.3, P1.4,P1.5, P1.6,P1.7, 依次点亮然后轮流点亮 ;
本文引用地址://m.amcfsurvey.com/article/201612/325252.htm蜂鸣器鸣响一声;
继电器J1吸合一次;
继电器J2吸合一次;
千位数码管显示8;
百位数码管显示8;
十位数码管显示8;
个位数码管显示8,反复循环;
随时按遥控器可以终止,并将遥控解码出的数据通过RS232传出,同时也通过P1口显示出来。
注意:此程序的对遥控器的编码芯片为50462才可以。
ORG 0000H
AJMP MAIN;转入主程序
ORG 0003H;外部中断P3.2脚INT0入口地址
AJMP INT;转入外部中断服务子程序(红外遥控解码程序)
;以下为主程序进行CPU中断方式设置
MAIN: LCALL YS3;等待硬件上电稳定
SETB EA;打开CPU总中断请求
SETB IT0;设定INT0的触发方式为脉冲负边沿触发
SETB EX0;打开INT0中断请求
MOV SCON,#50H;设置成串口1方式
MOV TMOD,#20H;波特率发生器T1工作在模式2上
MOV PCON,#80H;波特率翻倍为2400x2=4800BPS
MOV TH1,#0F3H;预置初值(按照波特率2400BPS预置初值)
MOV TL1,#0F3H;预置初值(按照波特率2400BPS预置初值)
SETB TR1;启动定时器T1
;以上完成串口通讯初始化设置
START: MOV P1,#01111111B
LCALL DELAY
MOV P1,#10111111B
LCALL DELAY
MOV P1,#11011111B
LCALL DELAY
MOV P1,#11101111B
LCALL DELAY
MOV P1,#11110111B
LCALL DELAY
MOV P1,#11111011B
LCALL DELAY
MOV P1,#11111101B
LCALL DELAY
MOV P1,#11111110B;P1口的LED循环由下往上点亮一次,延时约250毫秒
LCALL DELAY
MOV P1,#0FFH
MOV P3,#01111111B;蜂鸣器鸣响一声
LCALL DELAY
MOV P3,#11011111B;继电器J1吸合一次
LCALL DELAY
MOV P3,#10111111B;继电器J2吸合一次
LCALL DELAY
MOV P3,#0FFH
MOV P1,#00H
LCALL DELAY
LCALL DELAY
MOV P1,#0FFH
MOV P2,#11111110B
MOV P1,#00H;数码管个位显示8
LCALL DELAY
MOV P2,#11111101B
MOV P1,#00H;数码管十位显示8
LCALL DELAY
MOV P1,#00H
MOV P2,#11111011B;数码管百位显示8
LCALL DELAY
MOV P1,#00H
MOV P2,#11110111B;数码管千位显示8
LCALL DELAY
MOV P2,#0FFH
AJMP START;反复循环
;以下为进入P3.3脚外部中断子程序,也就是解码程序
INT: CLR EA ;暂时关闭CPU的所有中断请求
MOV R6,#10
SB: CALL YS1 ;转到882微秒延时判断子程序
JB P3.2,EXIT
;SBB: DJNZ R6, SB ;重复R6次,目的是检测在8820微秒内如果出现高电平就退出解码程序
;JNB P3.2, $ ;等待高电平避开9毫秒低电平引导脉冲
; ACALL YS2 ;延时4.74毫秒避开4.5毫秒的结果码
MOV R1,#1AH ;设定1AH为起始RAM区
MOV R2,#4
PP: MOV R3,#8
JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号
CALL YS1 ;高电平开始后用882微秒的时间尺去判断信号此时的高低电平状态
MOV C,P3.2 ;将P3.3引脚此时的电平状态0或1存入C中
JNC UUU ;如果为0就跳转到UUU
CALL YS3
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 ;接收完16位地址码和8位数据码和8位数据反码,存放在5CH/5DH/5EH/5FH的RAM中
MOV A,1AH
; CPL A ;对5EH取反后和5FH比较
CJNE A,#8FH,EXIT ;如果不等表示接收数据发生错误,放弃
MOV P1,1AH
MOV SBUF,1BH;通过串口在电脑屏幕上显示出来
CLR P3.7
LCALL YS2
LCALL YS2
LCALL YS2
SETB P3.7;蜂鸣器停止
CJNE A,#0FFH,IR_REC ;跳开#0FFh,如果按时间长,解出的码是#0FFh
SJMP EXIT
IR_REC: ;mov ir_code,5fh
CLR P0.0
; call ir_key_code
EXIT: SETB EA ;允许中断
RETI ;退出解码子程序
YS1: MOV R4,#20 ;延时子程序1,精确延时882微秒
IRD1: MOV R5,#21
DJNZ R5,$
NOP
DJNZ R4,IRD1
RET
YS2: MOV R4,#10 ;延时子程序2,精确延时4740微秒
IRD2: MOV R5,#235
DJNZ R5,$
DJNZ R4,IRD2
RET
YS3: MOV R4,#2;延时程序3,精确延时1000微秒
IRD3: MOV R5,#248
DJNZ R5,$
DJNZ R4,IRD3
RET
DELAY: MOV R1,#08H;(占用R1/R2/R3)延时子程序,12M晶振延时约250毫秒
L3: MOV R2 ,#0FAH
L1: MOV R3 ,#0FAH
L2: DJNZ R3 ,L2
DJNZ R2 ,L1
DJNZ R1 ,L3
RET
YANSHI: MOV R4,#1 ;(占用R4/R5)延时子程序1,精确延时882微秒
DS1: MOV R5,#5
DJNZ R5,$
DJNZ R4,DS1
RET
END
评论