📄 mcs51.asm
字号:
ADDC A,B
MOV R4,A
SJMP $
;======================= 软件实验五 数据排序实验 =========================
ORG 09B0H
QUE: MOV R3,#50H
QUE1: MOV A,R3 ;指针送R0
MOV R0,A
MOV R7,#0AH ;长度送R7
CLR 00H ;标志位为0
MOV A,@R0
QL2: INC R0
MOV R2,A
CLR C
MOV 22H,@R0
CJNE A,22H,QL3 ;相等吗?
SETB C
QL3: MOV A,R2
JC QL1 ;大于交换位置
SETB 00H
XCH A,@R0
DEC R0
XCH A,@R0
INC R0 ;大于交换位置
QL1: MOV A,@R0
DJNZ R7,QL2
JB 00H,QUE1 ;一次循环中有交换继续
SJMP $ ;无交换退出
;======================== 软件实验八 多分支程序 ==========================
ORG 0A10H
MEMS: MOV A,20H
MOV DPTR,#KKKK ;散转首址
RL A ;(20)*2
JMP @A+DPTR ;转到(20)*2+DPTR
KKKK: AJMP MEMSP0
AJMP MEMSP1
AJMP MEMSP2
SJMP MEMSP3
MEMSP0: MOV 20H,#0C0H ;0字循环
LJMP SOX0
MEMSP1: MOV 20H,#0F9H ;1字循环
LJMP SOX0
MEMSP2: MOV 20H,#0A4H ;2字循环
LJMP SOX0
MEMSP3: MOV 20H,#0B0H ;3字循环
LJMP SOX0
;==================== 软件实验六 查找相同数个数 ===========================
ORG 0AA0H
L5800: MOV R0,#10H ;查找16个字节
MOV R1,#00H
MOV DPTR,#2000H
L5811: MOVX A,@DPTR
CJNE A,#00H,L5816 ;取出内容与00H相等吗?
INC R1 ;取出个数加1
L5816: INC DPTR
DJNZ R0,L5811 ;未完继续
MOV DPTR,#2100H
MOV A,R1
MOVX @DPTR,A ;相同数个数送2100H
L581E: SJMP L581E
;===================== 硬件实验八 简单I/O口扩展 ==========================
ORG 0B80H
GOD0: MOV DPTR,#0FFE0H
MOVX A,@DPTR ;取出244状态
MOV DPTR,#0FFE4H
MOVX @DPTR,A ;送273驱动发光二极管
SJMP GOD0
;==================== 硬件实验七 8255控制交通灯 ==========================
ORG 0BB0H
JOD0: MOV SP,#60H
MOV DPTR,#0FFDBH
MOV A,#88H
MOVX @DPTR,A ;8255初始化
MOV DPTR,#0FFD8H
MOV A,#0B6H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A ;点亮4个红灯
MOV R2,#25H ;延时
LCALL DELY
JOD3: MOV DPTR,#0FFD8H
MOV A,#75H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A ;东西绿灯亮,南北红灯亮
MOV R2,#55H
LCALL DELY ;延时
MOV R7,#05H ;闪烁次数
JOD1: MOV DPTR,#0FFD8H
MOV A,#0F3H
MOVX @DPTR,A
INC DPTR
MOV A,#0CH
MOVX @DPTR,A ;东西黄灯亮,南北红灯亮
MOV R2,#20H
LCALL DELY ;延时
MOV DPTR,#0FFD8H
MOV A,#0F7H
MOVX @DPTR,A
INC DPTR
MOV A,#0DH
MOVX @DPTR,A ;南北红灯亮
MOV R2,#20H
LCALL DELY ;延时
DJNZ R7,JOD1 ;闪烁次数未到继续
MOV DPTR,#0FFD8H
MOV A,#0AEH
MOVX @DPTR,A
INC DPTR
MOV A,#0BH
MOVX @DPTR,A ;东西红灯亮,南北绿灯亮
MOV R2,#55H
LCALL DELY ;延时
MOV R7,#05H ;闪烁次数
JOD2: MOV DPTR,#0FFD8H
MOV A,#9EH
MOVX @DPTR,A
INC DPTR
MOV A,#07H
MOVX @DPTR,A ;东西红灯亮,南北黄灯亮
MOV R2,#20H
LCALL DELY ;延时
MOV DPTR,#0FFD8H
MOV A,#0BEH
MOVX @DPTR,A
INC DPTR
MOV A,#0FH
MOVX @DPTR,A ;东西红灯亮
MOV R2,#20H
LCALL DELY ;延时
DJNZ R7,JOD2 ;闪烁次数未到继续
LJMP JOD3 ;循环
;==================== 硬件实验二 P1口转弯灯实验 ====================
ORG 0C30H
PX00: MOV P1,#0FFH ;初始化
PX03: MOV A,P1
MOV B,A
ANL A,#03H
CJNE A,#01H,PX01 ;满足只是P1.0为高条件吗?
JB 00H,PX04 ;闪烁标志位
CLR P1.4
CLR P1.5 ;开右灯
SETB P1.6
SETB P1.7 ;关左灯
MOV R2,#20H
LCALL DELY ;延时
SETB 00H ;置标志位
LJMP PX03 ;继续查状态
PX04: SETB P1.4
SETB P1.5
SETB P1.6 ;关灯
SETB P1.7
MOV R2,#20H
LCALL DELY ;延时
CLR 00H ;清标志位
AJMP PX03 ;继续查状态
PX01: CJNE A,#02H,PX02 ;满足只是P1.1为高条件吗?
JB 01H,PX05 ;判标志位
SETB P1.4
SETB P1.5 ;开左灯
CLR P1.6
CLR P1.7 ;关右灯
MOV R2,#20H ;延时
LCALL DELY
SETB 01H ;置标志位
LJMP PX03 ;继续查状态
PX05: SETB P1.4
SETB P1.5
SETB P1.6 ;关灯
SETB P1.7
MOV R2,#20H
LCALL DELY ;延时
CLR 01H ;清标志位
LJMP PX03 ;继续查状态
PX02: SETB P1.4
SETB P1.5
SETB P1.6 ;关灯
SETB P1.7
LJMP PX03 ;继续
;================== 硬件实验十六 步进电机控制 =========================
ORG 0CA0H
DOJ0: MOV SP,#53H
LCALL LEDP
DOJ6: LCALL X2 ;X1 ;调键扫显示子程序(见软件实验十)
JB ACC.4,DOJ5
LCALL X3 ;调数字键处理子程序(见软件实验十)
DB 79H,7EH
SJMP DOJ6
DOJ5: CJNE A,#16H,DOJ6 ;不是执行键转
MOV A,7AH
SWAP A
ORL A,79H
MOV R6,A ;低字节步距数送R6
MOV A,7CH
SWAP A
ORL A,7BH
MOV R7,A ;高字节步距数R7
MOV A,7EH
CJNE A,#00H,DOJ2 ;判转动方向
DOJ1: MOV P1,#03H ;顺时针转动
LCALL DEL0Y
LCALL GGJ0
MOV P1,#06H
LCALL DEL0Y
LCALL GGJ0
MOV P1,#0CH
LCALL DEL0Y
LCALL GGJ0
MOV P1,#09H
LCALL DEL0Y
LCALL GGJ0
SJMP DOJ1
DOJ2: MOV P1,#09H ;逆时针转动
LCALL DEL0Y
LCALL GGJ0
MOV P1,#0CH
LCALL DEL0Y
LCALL GGJ0
MOV P1,#06H
LCALL DEL0Y
LCALL GGJ0
MOV P1,#03H
LCALL DEL0Y
LCALL GGJ0
SJMP DOJ2
DEL0Y: MOV A,7DH ;根据(7D)内容改变延时时间
SWAP A
CLR C
RRC A
RRC A
MOV R2,A
DELY1: MOV R5,#01H
DEL1Y: LCALL DIS
DJNZ R5,DEL1Y
DJNZ R2,DELY1
RET
GGJ0: CJNE R7,#00H,GGJ1 ;步距数为0停止
CJNE R6,#00H,GGJ1 ;不为0减1后显示
AJMP DOJ4
GGJ1: DJNZ R6,DOJ3
CJNE R7,#00H,DDJ8
DOJ4: LCALL DOJ7
SJMP DOJ4
DDJ8: DJNZ R7,DOJ3
AJMP DOJ4
DOJ3: LCALL DOJ7
RET
DOJ7: MOV R0,#79H
MOV A,R6
LCALL PTDS5
MOV A,R7
LCALL PTDS5
LCALL SSEE ;显示
RET
PTDS5: MOV R1,A
ACALL PTDS6
MOV A,R1
SWAP A
PTDS6: ANL A,#0FH
MOV @R0,A
INC R0
RET
SSEE: SETB RS1 ;换工作区
MOV R5,#05H
SSE2: MOV 30H,#20H
MOV 31H,#7EH
MOV R7,#06H
SSE1: MOV R1,#0DDH
MOV A,30H
MOVX @R1,A ;字位送入
MOV R0,31H
MOV A,@R0
MOV DPTR,#DDFF
MOVC A,@A+DPTR ;取字形代码
MOV R1,#0DCH
MOVX @R1,A ;字形送入
MOV A,30H ;右移
RR A
MOV 30H,A
DEC 31H
MOV A,#0FFH
MOVX @R1,A ;关显示
DJNZ R7,SSE1 ;6位显示完了吗?
DJNZ R5,SSE2 ;5次显示完了吗?
CLR RS1
RET
;================= 软件实验十 电脑时钟(定时器、中断综合实验)=============
DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H
DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH
ORG 0DA0H
SOX0: MOV A,20H
MOV R0,#0DCH
MOV R1,#0DDH
MOVX @R0,A
MOV A,#01H
SOX1: MOVX @R1,A
MOV R2,#20H
LCALL DELY
RL A ;显示子程序
SJMP SOX1
ORG 0DC0H
ZO00: MOV TL0,#0B7H ;恢复初值
MOV TH0,#3CH ;0.1秒加1
INC 23H
MOV A,23H
CJNE A,#0AH,ZO01 ;1秒不到退出
MOV 23H,#00H
MOV 40H,TH1
MOV 41H,TL1 ;取出TH0.TL0内容
MOV TL1,#00H
MOV TH1,#00H ;重新计数
ZO01: RETI
ORG 0DF0H
LCK0: LCALL X2
JB ACC.4,LDFC
LCALL X3
DB 79H,7EH
SJMP LCK0
LDFC: CJNE A, #16H, LCK0
MOV A, 7AH
SWAP A
ORL A, 79H
MOV 22H, A
CJNE A, #60H, LE09
LE09: JNC LE24
MOV A, 7CH
SWAP A
ORL A, 7BH
MOV 21H, A
CJNE A, #60H, LE15
LE15: JNC LE24
MOV A, 7EH
SWAP A
ORL A, 7DH
MOV 20H, A
CJNE A, #24H, LE21
LE21: JNC LE24
RET
LE24: CLR 8CH
LJMP 0000H
DELYA: PUSH 02H
DELYB: PUSH 02H
DELYC: PUSH 02H
DELYD: DJNZ R2,DELYD
LCALL SSEE ;调显示子程序
POP 02H
DJNZ R2,DELYC
POP 02H
DJNZ R2,DELYB
POP 02H
DJNZ R2,DELYA ;延时
RET
ORG 0E42H
L240: MOV R5,#0CH
LJMP L245 ;0字循环
L241: MOV R5,#9FH
LJMP L245 ;1字循环
L242: MOV R5,#4AH
L245: MOV R6,#08H ;2字循环
L246: MOV A,R6
MOV DPTR,#0FFE1H
MOVX @DPTR,A ;字位送入8279
MOV A,R5
MOV DPTR,#0FFE0H
MOVX @DPTR,A ;字形送入8279
MOV R2,#20H
LCALL DELY ;延时
MOV A,#0FFH
MOVX @DPTR,A ;关显示
INC R6 ;下一位显示
CJNE R6,#88H,L246
AJMP L245 ;不到最后一位继续
;==================== 硬件实验十七 8253方波 ========================
ORG 0EC0H
L8253: MOV DPTR,#0FFE3H
MOV A,#36H
MOVX @DPTR,A ;置8253工作方式
MOV DPTR,#0FFE0H
MOV A,#00H ;启动8253方波程序
MOVX @DPTR,A
MOV A,#10H
MOVX @DPTR,A
SJMP $ ;结束
;================== 硬件实验十五 继电器控制 ==========================
ORG 0F00H
LOP3: CLR P1.0
MOV R2,#30H
LCALL DELY
SETB P1.0
MOV R2,#30H
LCALL DELY
SJMP LOP3
;--------------------------------
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -