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

📄 mcs51.asm

📁 Keil正式中文版.rar
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;《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 + -