📄 mcs51.asm
字号:
;《MCS-51系列单片机实验指导书》程序清单
;硬件实验十七 电子音响 的程序请装载music.bin文件
ORG 0000H
LJMP CHK00
ORG 0003H
LJMP ZO00
ORG 0013H
LJMP PO16
;=============== 软件实验十 电脑时钟(定时器、中断综合实验) =============
ORG 0030H
CHK00: MOV SP,#60H
LCALL LEDP
MOV DPTR,#CLOCK
MOV R0,DPL
MOV R1,DPH
MOV DPTR,#000BH
MOV A,#02H
MOVX @DPTR,A
INC DPTR
MOV A,R1
MOVX @DPTR,A
INC DPTR
MOV A,R0
MOVX @DPTR,A
CHK0: LCALL LCK0 ;键扫,显示子程序
LCALL PTDS0 ;显示缓冲区放数子程序
MOV TMOD,#01H
ORL IE,#82H
MOV TL0,#0B7H
MOV TH0,#3CH ;定时中断初始化
MOV 23H,#00H
SETB TR0 ;开定时
LOO5: LCALL DIS ;SSEE ;显示
LCALL PTDS0
SJMP LOO5
PTDS0: MOV R0,#79H
MOV A,22H
ACALL PTDS
MOV A,21H
ACALL PTDS
MOV A,20H
ACALL PTDS
RET
;-------------------
PTDS: MOV R1,A ;拆送显示缓冲区
ACALL PTDS1
MOV A,R1
SWAP A
PTDS1: ANL A,#0FH
MOV @R0,A
INC R0
RET
CLOCK: MOV TL0,#0B7H
MOV TH0,#3CH ;恢复初值
PUSH PSW
PUSH ACC
SETB 0D3H ;保护
INC 23H ;0.1秒加1
MOV A,23H
CJNE A,#0AH,DONE ;1秒到吗?
MOV 23H,#00H ;清0.1秒单元
MOV A,22H
INC A ;秒加1
DA A
MOV 22H,A ;十进制调整
CJNE A,#60H,DONE ;60秒到吗?
MOV 22H,#00H ;秒单元清零
MOV A,21H
INC A
DA A ;分加1.十进制调整
MOV 21H,A
CJNE A,#60H,DONE ;60分到吗?
MOV 21H,#00H ;分单元清零
MOV A,20H
INC A
DA A ;时加1.十进制调整
MOV 20H,A
CJNE A,#24H,DONE ;24小时到吗?
MOV 20H,#00H ;时单元清零
DONE: POP ACC ;退栈
POP PSW
RETI
ORG 00D0H
H900: MOV SP,#53H
MOV DPTR,#0FFE1H
MOV A,#00H
MOVX @DPTR,A ;8279方式字写入
MOV A,#32H
MOVX @DPTR,A ;分频
MOV A,#0DFH
MOVX @DPTR,A
H901: MOVX A,@DPTR ;清缓冲区
JB ACC.7,H901
MOV DPTR,#0FFE0H
MOV A,#0C8H
MOVX @DPTR,A ;字形送入
INC DPTR
MOV A,#80H
MOVX @DPTR,A ;字位送入.显示P
H902: MOV 30H,#80H
MOV 31H,#40H
H903: MOV DPTR,#0FFE1H
MOVX A,@DPTR
ANL A,#07H
CJNE A,#00H,H904 ;有键按下吗?
AJMP H903
H904: MOV DPTR,#0FFE0H
MOVX A,@DPTR
MOV B,A ;取出键值
MOV R1,#00H
MOV DPTR,#GOJZ
H905: MOV A,#00H
MOVC A,@A+DPTR ;查键值表是否相同
CJNE A,B,H906
AJMP H907 ;转数字外处理程序
H906: INC DPTR ;键表地址加1
INC R1 ;查找次数加1
MOV A,R1
JB ACC.4,H908 ;是功能键吗?
AJMP H905 ;继续查找
H908: MOV R1,#00H
MOV DPTR,#GOJZ1
H909: MOV A,#00H
MOVC A,@A+DPTR ;功能键键值取出
CJNE A,B,H90A ;键值相等吗?
AJMP H90B ;转功能键处理子程序
H90A: INC DPTR
INC R1
MOV A,R1
JNB ACC.2,H909 ;继续查找
AJMP H900 ;无键按下返回
H907: MOV A,30H
MOV DPTR,#0FFE1H ;字位送入8297
MOVX @DPTR,A
MOV A,R1
MOV R0,31H
MOV @R0,A
INC 31H ;字形缓冲区加1
MOV DPTR,#ZOE0
MOVC A,@A+DPTR ;取出字形代码
MOV DPTR,#0FFE0H
MOVX @DPTR,A ;送入8279显示
INC 30H
MOV A,30H ;字位加1
CJNE A,#88H,H90C ;显示到第八位,从头显示
AJMP H902
H90C: AJMP H903
H90B: MOV DPTR,#CKEY3
MOV A,R1
RL A ;功能键 散转处理
ADD A,R1
JMP @A+DPTR
CKEY3: LJMP L240
LJMP L241
LJMP L242
GOJZ: DB 0C1H,0C8H,0C9H,0D0H,0D8H,0E0H,0C2H,0CAH,0D1H
DB 0D9H,0DAH,0C3H,0CBH,0D2H,0D3H,0DBH
GOJZ1: DB 0E3H,0E2H,0E1H
ZOE0: DB 0CH,9FH,4AH,0BH,99H,29H,28H,8FH,08H,09H,88H
DB 38H,6CH,1AH,68H,0E8H
;===================== 硬件实验四 工业顺序控制 ========================
ORG 0190H
PO10: MOV P1,#7FH
ORL P3,#00H
PO11: JNB P3.4,PO11 ;开工吗?
ORL IE,#84H
ORL IP,#01H
MOV PSW,#00H ;初始化
MOV SP,#53H
PO12: MOV P1,#7EH ;第一道工序
ACALL PO1B
MOV P1,#7DH ;第二道工序
ACALL PO1B
MOV P1,#7BH ;第三道工序
ACALL PO1B
MOV P1,#77H ;第四道工序
ACALL PO1B
MOV P1,#6FH ;第五道工序
ACALL PO1B
MOV P1,#5FH ;第六道工序
ACALL PO1B
MOV P1,#0FH ;第七道工序
ACALL PO1B
SJMP PO12
PO16: MOV B,R2 ;保护现场
PO17: MOV P1,#7FH ;关输出
MOV 20H,#0A0H ;振荡次数
PO18: SETB P1.7 ;振荡
ACALL PO1A ;延时
CLR P1.7 ;停振
ACALL PO1A ;延时
DJNZ 20H,PO18 ;不为0转
CLR P1.7
ACALL PO1A ;停振
JNB P3.3,PO17 ;故障消除吗?
MOV R2,B ;恢复现场
RETI
PO19: MOV R2,#10H
ACALL DELY ;延时1
RET
PO1A: MOV R2,#06H
ACALL DELY ;延时2
RET
PO1B: MOV R2,#30H
ACALL DELY ;延时3
RET
;---------------------
ORG 0213H
DELY: PUSH 02H
DEL2: PUSH 02H
DEL3: PUSH 02H ;延时
DEL4: DJNZ R2,DEL4
POP 02H
DJNZ R2,DEL3
POP 02H
DJNZ R2,DEL2
POP 02H
DJNZ R2,DELY
RET
ORG 0240H
DOE0: MOV DPTR,#0FFDBH
MOV A,#88H
MOVX @DPTR,A ;8255控制命令送入
MOV DPTR,#0FFDAH
MOV A,#01H ;关打印机
MOVX @DPTR,A
DOE1: MOVX A,@DPTR
JB ACC.4,DOE1 ;打印机忙吗?
MOV DPL,R0
MOV DPH,R1
MOVX A,@DPTR ;取数
INC DPTR
MOV R0,DPL
MOV R1,DPH ;DPTR加1
MOV DPTR,#0FFD8H
MOVX @DPTR,A ;送打印机
MOV DPTR,#0FFDAH
MOV A,#00H
MOVX @DPTR,A
MOV A,#01H
MOVX @DPTR,A ;开始打印
DJNZ R2,DOE1
DJNZ R3,DOE1 ;字节打完吗?
SJMP $
;================= 硬件实验十三 微型打印机打印字符/曲线/汉字 =============
ORG 0280H
D1E0: MOV SP,#53H
MOV DPTR,#0FFDBH
MOV A,#88H
MOVX @DPTR,A ;8255初始化.A.B口输出,.C口输入
ACALL D1E2 ;打印空格和#号
ACALL D1E3 ;换行
MOV R6,#0A6H ;取代码偏移量
MOV R7,#0DH ;13个代码
D1E1: MOV A,R6
MOVC A,@A+PC ;取代码
ACALL D1E4 ;打印
INC R6
DJNZ R7,D1E1 ;未完继续
ACALL D1E3
ACALL D1E2 ;再打印一行#和空格
ACALL D1E3
ACALL D1EA ;设置行间距子程序
ACALL D1E5 ;图形打印命令子程序
MOV R6,#68H
ACALL D1E6 ;取代码偏移量
ACALL D1E5 ;打印上部图形
MOV R6,#8CH
ACALL D1E6 ;打印下部图形
ACALL D1E7
ACALL D1E7 ;回车换行
MOV DPTR,#2000H ;曲线数据存放首址
MOV R6,#14H
ACALL D1E8 ;取曲线数据
MOV R7,#0DH ;行数
D1E9: MOV R6,#09H ;列数
ACALL D1E8
DJNZ R7,D1E9 ;取曲线数据
SJMP $
D1E3: MOV A,#0AH ;打完吗?
ACALL D1E4 ;换行子程序
RET
D1E7: MOV A,0DH ;回车子程序
ACALL D1E4
RET
D1EA: MOV A,#1BH
ACALL D1E4
MOV A,#31H
ACALL D1E4 ;ESC I n (n=o)
MOV A,#00H ;行间距=0
ACALL D1E4
ACALL D1E3
RET
D1E6: MOV R7,#24H
D1EB: MOV A,R6
MOVC A,@A+PC
ACALL D1E4 ;36个图形代码送打印机
INC R6
DJNZ R7,D1EB
ACALL D1E3
RET
D1E8: MOV A,#1BH
ACALL D1E4
MOV A,#27H
ACALL D1E4 ;ESC/ m n1 n2 nk CR命令
MOV A,R6
ACALL D1E4 ;(R6)=m
D1EC: MOVX A,@DPTR
INC DPTR ;(DPTR)=n1 n2 nk
ACALL D1E4
DJNZ R6,D1EC
ACALL D1E7 ;CR命令
RET
D1E5: MOV A,#1BH
ACALL D1E4
MOV A,#4BH
ACALL D1E4 ;ESC K n1 n2
MOV A,#24H ;图形打印命令
ACALL D1E4
MOV A,#00H
ACALL D1E4
RET
D1E2: MOV R7,#07H
D1ED: MOV A,#23H
ACALL D1E4 ;打印7个#号和空格
MOV A,#20H
ACALL D1E4
DJNZ R7,D1ED
RET
D1E4: PUSH DPH
PUSH DPL
PUSH ACC
MOV DPTR,#0FFDAH
D1EE: MOVX A,@DPTR
JB ACC.4,D1EE ;打印机忙吗?
POP ACC
MOV DPTR,#0FFD8H
MOVX @DPTR,A ;送打印机
MOV DPTR,#0FFDBH
MOV A,#00H
MOVX @DPTR,A
MOV A,#01H
MOVX @DPTR,A ;产生STB后沿
POP DPL
POP DPH
RET
;----------------------------------------------------
DB 23H,20H,39H,34H,8CH,31H,32H,8DH,33H,30H,8EH
DB 20H,23H
;#94年12月31日#
DB 00H,00H,00H,7FH,3FH,22H,22H,0A2H,0E2H,62H
DB 22H,22H,22H,3EH,7FH,20H,00H,00H
;“启”字上部代码
DB 00H,00H,00H,00H,20H,21H,27H,3FH,79H,0E1H,0BFH
DB 27H,21H,21H,23H,61H,20H,00H
;“东”字上部代码
DB 00H,03H,06H,0FCH,0FCH,7FH,3EH,22H,22H,22H,22H
DB 22H,22H,3FH,7FH,20H,00H,00H
;“启”字下部代码
DB 00H,00H,00H,00H,04H,0CH,0B8H,70H,22H,02H,0FEH
DB 0FEH,00H,40H,38H,1EH,08H,00H
;“东”字下部代码
;--------------------------------------------------------------
X3: MOV R4,A
MOV R0,#50H
MOV A,@R0
MOV R1,A
MOV A,R4
MOV @R1,A
CLR A
POP DPH
POP DPL
MOVC A,@A+DPTR
INC DPTR
CJNE A,01H,X30
dec r1
clr a
MOVC A,@A+DPTR
X31: MOV @R0,A
INC DPTR
PUSH DPL
PUSH DPH
RET
X30: DEC R1
MOV A,R1
SJMP X31
;--------------------------
X2: MOV R6,#50H
X0: ACALL XLE
JNB ACC.5,XX0
DJNZ R6,X0
MOV R6,#20H
MOV R0,#50H
MOV A,@R0
MOV R0,A
MOV A,@R0
MOV R7,A
MOV A,#10H
MOV @R0,A
X1: ACALL XLE
JNB ACC.5,XX1
DJNZ R6,X1
MOV A,R7
MOV @R0,A
SJMP X2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -