伟福 Lab2000P 单片机仿真实验系统
®
MCS51 汇编语言程序清单
附录 A MCS51 汇编语言程序清单
; 软件实验一 存储器块清零 S1.ASM
Block equ 6000h
0000 906000 mov dptr, #Block ; 起始地址
0003 7800 mov r0, #0 ; 清 256 字节
0005 E4 clr a
Loop:
0006 F0 movx @dptr, a
0007 A3 inc dptr ; 指向下一个地址
0008 D8FC djnz r0, Loop ; 记数减一
000A 02000A ljmp $
end
; 软件实验二 二进制到 BCD 码转换 S2.ASM
; 将 A 拆为三个 BCD 码, 并存入 Result 开始的叁个单元
Result equ 20h
org 0
0000 020015 ljmp Start
BinToBCD:
0003 75F064 mov b, #100
0006 84 div ab
0007 F520 mov Result, a ; 除以 100, 得百位数
0009 E5F0 mov a, b
000B 75F00A mov b, #10
000E 84 div ab
000F F521 mov Result+1, a ; 余数除以 10, 得十位数
0011 85F022 mov Result+2, b ; 余数为个位数
0014 22 ret
Start:
0015 758140 mov sp, #40h
0018 747B mov a, #123
001A 1103 call BinToBCD
001C 02001C ljmp $
end
; 软件实验三 二进制到 ASCII 码转换 S3.ASM
; 将 A 拆为二个 ASCII 码, 并存入 Result 开始的二个单元
Result equ 20h
org 0
0000 020026 ljmp Start
ASCIITab:
0003 303132
- 1 -
伟福 Lab2000P 单片机仿真实验系统 MCS51
®
汇编语言程序清单
0006 333435
0009 363738
000C 394142
000F 434445
0012 46 db '0123456789ABCDEF' ; 定义数字对应的 ASCII 表
BinToHex:
0013 900003 mov dptr, #ASCIITab
0016 F5F0 mov b, a ; 暂存 A
0018 C4 swap a
0019 540F anl a, #0fh ; 取高四位
001B 93 movc a, @a+dptr ; 查 ASCII 表
001C F520 mov Result, a
001E E5F0 mov a, b ; 恢复 A
0020 540F anl a, #0fh ; 取低四位
0022 93 movc a, @a+dptr ; 查 ASCII 表
0023 F521 mov Result+1, a
0025 22 ret
Start:
0026 758140 mov sp, #40h
0029 741A mov a, #1ah
002B 1113 call BinToHex
002D 02002D ljmp $
end
; 软件实验四 内存块移动 S4.ASM
; 移动 3000H --> 4000H, 256 字节
0000 7830 mov r0, #30h
0002 7900 mov r1, #00h
0004 7A40 mov r2, #40h
0006 7B00 mov r3, #00h
0008 7F00 mov r7, #0
Loop:
000A 8883 mov dph, r0
000C 8982 mov dpl, r1
000E E0 movx a, @dptr
000F 8A83 mov dph, r2
0011 8B82 mov dpl, r3
0013 F0 movx @dptr, a
0014 B9FF01 cjne r1, #0ffh, Goon1
0017 08 inc r0
Goon1:
0018 09 inc r1
0019 BBFF01 cjne r3, #0ffh, Goon2
001C 0A inc r2
Goon2:
001D 0B inc r3
001E DFEA djnz r7, Loop
0020 020020 ljmp $
end
- 2 -
伟福 Lab2000P 单片机仿真实验系统
®
MCS51 汇编语言程序清单
; 软件实验五 程序跳转表 S5.ASM
org 0
0000 02001D ljmp Start
0003 7400 Func0: mov a, #0
0005 22 ret
0006 7401 Func1: mov a, #1
0008 22 ret
0009 7402 Func2: mov a, #2
000B 22 ret
000C 7403 Func3: mov a, #3
000E 22 ret
FuncEnter:
000F 25E0 add a, acc ; ajmp 为二字节指令 , 调用号 X 2
0011 900015 mov dptr, #FuncTab
0014 73 jmp @a+dptr
FuncTab:
0015 0103 ajmp Func0
0017 0106 ajmp Func1
0019 0109 ajmp Func2
001B 010C ajmp Func3
Start:
001D 7400 mov a, #0
001F 110F call FuncEnter
0021 7401 mov a, #1
0023 110F call FuncEnter
0025 7402 mov a, #2
0027 110F call FuncEnter
0029 7403 mov a, #3
002B 110F call FuncEnter
002D 02002D ljmp $
end
; 软件实验六 数据排序 S6.ASM
Size equ 10 ; 数据个数
Array equ 50h ; 数据起始地址
Change equ 0 ; 交换标志
Sort:
0000 7850 mov r0, #Array
0002 7F09 mov r7, #Size-1
0004 C200 clr Change
Goon:
0006 E6 mov a, @r0
0007 FA mov r2, a
0008 08 inc r0
0009 86F0 mov B, @r0
000B B5F002 cjne a, B, NotEqual
000E 8008 sjmp Next
NotEqual:
0010 4006 jc Next ; 前小后大, 不交换
0012 D200 setb Change ; 前大后小, 置交换标志
0014 C6 xch a, @r0 ; 交换
- 3 -
伟福 Lab2000P 单片机仿真实验系统 MCS51
®
汇编语言程序清单
0015 18 dec r0
0016 C6 xch a, @r0
0017 08 inc r0
Next:
0018 DFEC djnz r7, Goon
001A 2000E3 jb Change, Sort
001D 02001D ljmp $
end
; 硬件实验一 P1 口输入、输出实验 H1A.ASM
Loop:
0000 7401 mov a, #01h
0002 7A08 mov r2, #8
Output:
0004 F590 mov P1, a
0006 23 rl a
0007 12000F call Delay
000A DAF8 djnz r2, Output
000C 020000 ljmp Loop
Delay:
000F 7E00 mov r6, #0
0011 7F00 mov r7, #0
DelayLoop:
0013 DEFE djnz r6, DelayLoop
0015 DFFC djnz r7, DelayLoop
0017 22 ret
end
; 硬件实验一 P1 口输入、输出实验 H1B.ASM
KeyLeft equ P1.0
KeyRight equ P1.1
LedLeft equ P1.2
LedRight equ P1.3
0000 D290 SETB KeyLeft
0002 D291 SETB KeyRight
Loop:
0004 A290 MOV C,KeyLeft
0006 9292 MOV LedLeft,C
0008 A291 MOV C,KeyRight
000A 9293 MOV Ledright,C
000C 020004 LJMP Loop
END
; 硬件实验二 继电器控制实验 H2.ASM
Output equ P1.0 ; P1.0 port
Loop:
0000 C3 clr c
0001 9290 mov Output,c
0003 12000F call Delay
0006 D3 setb c
0007 9290 mov Output,c
0009 12000F call Delay
000C 020000 ljmp Loop
- 4 -
伟福 Lab2000P 单片机仿真实验系统
®
MCS51 汇编语言程序清单
Delay:
000F 7E00 mov r6, #0
0011 7F00 mov r7, #0
DLoop:
0013 DFFE djnz r7, DLoop
0015 DEFC djnz r6, DLoop
0017 22 ret
end
; 硬件实验三 用 74LS245 扩展 I/O 口实验 H3.ASM
CS245 equ 8000h
org 0000h
Loop:
0000 908000 mov dptr,#CS245
0003 E0 movx a, @dptr
0004 020000 ljmp Loop
end
; 硬件实验四 用 74LS273 扩展 I/O 口实验 H4.ASM
CS273 equ 8000h
0000 908000 mov dptr, #CS273
0003 7401 mov a, #1
Loop:
0005 F0 movx @dptr, a
0006 23 rl a
0007 00 nop
0008 020005 ljmp Loop
end
; 硬件实验五 PWM 转换电压实验 H5.ASM
; 输出 50% (5:5) 占空比 PWM
; 输出 10% (1:9) 占空比 PWM
; 输出 90% (9:1) 占空比 PWM
OUTPUT equ P1.0
Loop:
0000 C290 clr OUTPUT
0002 7403 mov A, #3
0004 120011 call Delay
0007 D290 setb OUTPUT
0009 7407 mov a, #7
000B 120011 call Delay
000E 020000 ljmp Loop
Delay:
0011 7800 mov r0, #0
DLoop:
0013 D8FE djnz r0, DLoop
0015 D5E0FB djnz acc, DLoop
0018 22 ret
end
- 5 -
伟福 Lab2000P 单片机仿真实验系统 MCS51
®
汇编语言程序清单
; 硬件实验六 音频控制实验 H6.ASM
Speaker equ P1.0
CBit equ 0
Loop:
0000 C200 clr CBit
0002 850090 mov Speaker,CBit
0005 120013 call Delay
0008 D200 setb CBit
000A 850090 mov Speaker,CBit
000D 120013 call Delay
0010 020000 ljmp Loop
Delay:
0013 7832 mov r0, #50
0015 D8FE djnz r0, $
0017 22 ret
end
; 硬件实验七 8255 输入、输出实验 H7.ASM
mode equ 082h ; 方式 0,PA,PC 输出,PB 输入
PortA equ 0f000h ; Port A
PortB equ 0f001h ; Port B
PortC equ 0f002h ; Port C
CAddr equ 0f003h ; 控制字地址
org 0h
0000 7482 mov a, #mode
0002 90F003 mov dptr, #CAddr
0005 F0 movx @dptr,a ; 输出控制字
0006 02001B jmp EX_B
;实验 1:PortA 输出
EX_A:
0009 7480 mov a,#80H
000B 90F000 mov dptr,#PortA
000E 75F008 mov b,#8H
0011 F0 OutA: movx @dptr,a ; 输出 PortA
0012 03 rr a ; 移位
0013 7D01 mov r5,#1
0015 12002B call delay ; 延时
0018 D5F0F6 djnz b, OutA
;实验 2: PortB 输入 PortA 输出
EX_B:
001B 90F001 mov dptr,#PortB
001E E0 movx a,@dptr ; 读入 PortB
001F 90F000 mov dptr,#PortA
0022 F0 movx @dptr,a ; 输出到 PortA
0023 7D02 mov r5,#2
0025 12002B call delay
0028 020000 ljmp 0
delay:
002B 7F00 mov r7,#0
002D DFFE ddd: djnz r7,ddd
- 6 -
伟福 Lab2000P 单片机仿真实验系统
®
MCS51 汇编语言程序清单
002F DEFC djnz r6,ddd
0031 DDFA djnz r5,ddd
0033 22 ret
end
; 硬件实验八 串行数转换并行数实验 H8A.ASM
0000 759800 mov SCON, #0 ; 串口方式 0
0003 74AA mov a, #0aah
0005 F599 mov SBUF, a ; 输出 55h
0007 3099FD jnb ti, $
000A C299 clr ti
000C 02000C ljmp $
end
; 硬件实验八 串行数转换并行数实验 H8B.ASM
LD equ P1.0
DAT equ P1.1
CLK equ P1.2
0000 D292 setb CLK
0002 C290 clr LD
0004 D290 setb LD
0006 7F08 mov r7, #8
Next:
0008 03 rr a
0009 A291 mov c, DAT
000B 92E7 mov ACC.7, c
000D C292 clr CLK
000F D292 setb CLK
0011 DFF5 djnz r7, Next
0013 020013 ljmp $
end
; 硬件实验九 并行数转换串行数实验 H9A.ASM
LD equ P1.0
0000 C290 clr LD
0002 D290 setb LD
0004 759810 mov SCON, #00010000b
0007 3098FD Wait: jnb RI, Wait
000A E599 mov a, SBUF
000C C298 clr ri
000E 02000E ljmp $
end
; 硬件实验九 并行数转换串行数实验 H9B.ASM
LD equ P1.0
DAT equ P1.1
CLK equ P1.2
0000 D292 setb CLK
0002 C290 clr LD
0004 D290 setb LD
- 7 -
伟福 Lab2000P 单片机仿真实验系统 MCS51
®
汇编语言程序清单
0006 7F08 mov r7, #8
Next:
0008 03 rr a
0009 A291 mov c, DAT
000B 92E7 mov ACC.7, c
000D C292 clr CLK
000F D292 setb CLK
0011 DFF5 djnz r7, Next
0013 020013 ljmp $
end
; 硬件实验十 计数器实验 H10.ASM
0000 758905 mov TMOD, #00000101b ; 方式 1,记数器
0003 758C00 mov TH0, #0
0006 758A00 mov TL0, #0
0009 D28C setb TR0 ; 开始记数
Loop:
000B 858A90 mov P1, TL0 ; 将记数结果送 P1 口
000E 02000B ljmp Loop
end
; 硬件实验十一 外部中断实验 H11.ASM
LED equ P1.0
LEDBuf equ 0
0000 02000E ljmp Start
org 3
Interrupt0:
0003 C0D0 push PSW ; 保护现场
0005 B200 cpl LEDBuf ; 取反 LED
0007 A200 mov c, LEDBuf
0009 9290 mov LED, c
000B D0D0 pop PSW ; 恢复现场
000D 32 reti
Start:
000E C200 clr LEDBuf
0010 C290 clr LED
0012 758801 mov TCON, #01h ; 外部中断 0 下降沿触发
0015 75A881 mov IE, #81h ; 打开外部中断允许位(EX0)及总中断允许位(EA)
0018 020018 ljmp $
end
; 硬件实验十二 定时器实验 H12.ASM
T100us equ 256-50 ; 100us 时间常数(6M)
C100us equ 30h ; 100us 记数单元
LEDBuf equ 0
LED equ P1.0
0000 020026 ljmp Start
org 000bh
T0Int:
000B C0D0 push PSW
- 8 -