实验一 数据传送(RAM–>XRAM)
一、实验目的
熟悉星研集成环境软件或熟悉Keil C51集成环境软件的使用方法。 熟悉MCS51汇编指令,能自己编写简单的程序,掌握数据传输的方法。
二、实验内容
1、熟悉星研集成环境软件或熟悉Keil C51集成环境软件的安装和使用方法。 2、编写程序,实现内外部数据段的传送、校验。 三、程序框图
开始 堆栈指针初始化计数器、地址初始化内部RAM数据传送外部RAM一次地址指针+1 计数器-1=0?Y计数器、地址指针复位传送错误结束数据传送程序框图N取内部RAM和对应的外部RAMN比较是否相等Y地址指针+1 计数器-1=0?Y传送正确N
四、实验步骤
在内部RAM 30H ~3FH中输入数据;使用单步、断点方式调试程序,检测外部数据RAM的1000H ~100FH中的内容。熟悉查看特殊功能寄存器、内部数据RAM、外部数据空间的各种方法。
五、程序清单 ;将内部RAM Address1 开始的16个字节送到外部RAM从Address2开始的单元里,再作比较。 Address1 DATA 30H Address2 XDATA 1000H ORG 0000H LJMP STAR ORG 0100H STAR: MOV SP,#60H MOV R0,#Address1 MOV DPTR,#Address2
STAR1:
STAR2:
STAR3: MOV MOV MOVX INC INC DJNZ MOV MOV MOV MOV MOVX CJNE INC INC DJNZ SJMP SJMP END R7,#10H A,@R0 @DPTR,A R0 DPTR R7,STAR1 R0,#Address1 DPTR,#Address2 R7,#10H B,@R0 A,@DPTR A,B,STAR3 R0 DPTR R7,STAR2 $ $
;传送
;比较
;传送正确 ;传送错误
实验二 双字节BCD码(十进制数)加法
一、实验目的
熟悉51汇编指令,学会使用星研集成环境软件,能自己编写简单的程序,熟悉BCD码,了解如何调用系统提供的子程序。
二、实验内容
从键盘上输入4位被加数、加数,实现双字节BCD码(四位数)的加法,结果显示在数码管上;熟悉使用断点、单步进入、单步、运行到光标处、修改PC指针、全速运行等各种调试手段;熟悉查看特殊功能寄存器、内部数据RAM、外部数据空间的各种方法。
三、实验框图
开始初始化堆栈设定\"先清LED,再接收键输入\"标志通过键盘获得4位被加数(压缩BCD码)置位\"接收到第一个键后才清除LED\"标志通过键盘获得4位加数(压缩BCD码)被加数与加数的低位字节不带进位加法十进制调整被加数与加数的高位字节带进位加法十进制调整压缩BCD码(结果)转换为非压缩BCD码高位0消隐显示结果双字节BCD加法程序框图
四、实验步骤
1、连线说明:
D3区 :CLK D3区 :CS D3区 :A0 —— B2区:2M —— A3区:CS5 —— A3区:A0 2、在F4区的键盘上输入4位被加数、加数 3、结果显示在F4区的数码管上
五、程序清单 EXTRN
Buffer F1
START:
START1:
CODE(Display8, GetBCDKey) DATA 30H BIT 0D1H ORG 0000H LJMP START ORG 0100H MOV SP,#60H CLR F1 MOV R0,#buffer MOV A,#4 LCALL GetBCDKey SETB F1 MOV R0,#buffer+4 MOV A,#4
;8字节显示缓冲区 ;PSW.1
;先清除显示,再接收键输入
;按键次数
;得到双字节十进制数(被加数) ;接收到第一个键,才清除显示
;按键次数
LCALL GetBCDKey ;得到双字节十进制数(加数) MOV A,buffer+1 ADD A,buffer+5 DA A MOV buffer+5,A MOV A,buffer ADDC A,buffer+4 DA A MOV buffer+4,A CLR A RLC A Display: PUSH ACC ;显示结果 MOV R0,#buffer MOV A,buffer+5 ;低位 ACALL B1toB2 ;压缩BCD码转换成非压缩BCD码 MOV A,buffer+4 ;高位 ACALL B1toB2 POP ACC ;进位 ACALL B1toB2 MOV @R0,#10H ;最高二位消隐 INC R0 MOV @R0,#10H MOV R0,#buffer+5 MOV R7,#5 ACALL BlackDisplay ;将高位0消隐 MOV R0,#buffer LCALL Display8 SJMP START1 ;将一个字节压缩BCD码转换成二个字节非压缩BCD码 B1toB2: PUSH ACC ANL A,#0FH MOV @R0,A INC R0 POP ACC ANL A,#0F0H SWAP A MOV @R0,A INC R0 RET BlackDisplay: MOV A,@R0 ;将高位0消隐 JNZ Exit MOV A,#10H MOV @R0,A DEC R0
Exit: DJNZ RET END R7,BlackDisplay
实验三 双字节BCD码(十进制数)减法
一、实验目的
熟悉51汇编指令,学会使用星研集成环境软件,掌握汇编语言的设计和调试方法。能看懂程序流程框图,能自己设计程序,熟悉BCD码、补码,了解如何调用系统提供的子程序。
二、实验内容
从键盘上输入4位被减数、减数,实现双字节BCD码(四位数)的减法,结果显示在数码管上;进一步熟悉使用断点、单步进入、单步、运行到光标处、修改PC指针、全速运行等各种调试手段;熟悉查看特殊功能寄存器、内部数据RAM、外部数据空间的各种方法。
三、程序框图
开始堆栈初始化设定\"先清LED,再接收键输入\"标志通过键盘获得双字节十进制被减数(压缩BCD码)置位\"接收到第一个键后才清除LED\"标志通过键盘获得双字节十进制减数(压缩BCD码)减数进行十进制取补双字节十进制加法操作C=1?NC=0,有进位(结果为负),再执行一次求补运算,调整为正数高位0消隐,若结果为负,前面加上\"-\"显示结果Y双字节十进制减法程序框图
四、实验步骤
1、连线说明:
D3区 :CLK D3区 :CS D3区 :A0 —— B2区:2M —— A3区:CS5 —— A3区:A0 2、在F4区的键盘上输入4位被减数、减数 3、结果显示在F4区的数码管上
五、程序清单 EXTRN
CODE(Display8, GetBCDKey)
Buffer F1
START:
START1: DATA BIT ORG LJMP ORG MOV CLR MOV MOV LCALL SETB MOV MOV LCALL MOV CLR SUBB MOV MOV CLR SUBB MOV MOV ADD DA MOV MOV ADDC DA MOV MOV JC MOV SUBB 30H 0D1H 0000H START 0100H SP,#60H F1 R0,#buffer A,#4 GetBCDKey F1 R0,#buffer+4 A,#4 GetBCDKey A,#9AH C A,buffer+5 buffer+5,A A,#99H C A,buffer+4 buffer+4,A A,buffer+1 A,buffer+5 A buffer+5,A A,buffer A,buffer+4 A buffer+4,A F0,C Display A,#9AH A,buffer+5
字节显示缓冲区 先清除显示,再接收键输入 按键次数
得到双字节十进制数(被减数) 接收到第一个键,才清除显示 按键次数
得到双字节十进制数(减数) 减数取补 借位标志
;8;PSW.1
;
;;;
;;
;
;
Display:
BlackDisplay:
Exit:
Exit1: B1toB2:
MOV buffer+5,A MOV A,#99H SUBB A,buffer+4 XCH A,buffer+5 ADD A,#00H DA A
XCH A,buffer+5 ADDC A,#00H DA A
MOV buffer+4,A MOV R0,#buffer MOV A,buffer+5 ACALL B1toB2 MOV A,buffer+4 ACALL B1toB2 MOV @R0,#10H INC R0
MOV @R0,#10H INC R0
MOV @R0,#10H INC R0
MOV @R0,#10H MOV R0,#buffer+3 MOV R7,#3
ACALL BlackDisplay MOV R0,#buffer LCALL Display8 SJMP START1
MOV A,@R0 JNZ Exit MOV A,#10H MOV @R0,A DEC R0
DJNZ R7,BlackDisplay JB F0,Exit1 INC R0
MOV @R0,#11H RET ANL A,#0FH MOV @R0,A INC R0 POP
ACC
;显示结果 ;低位
;压缩BCD码转换成非压缩BCD码;高位
;最高四位消隐
;将高位0消隐
;将高位0消隐
;负数标志
PUSH
BlackDisplay:
Exit: END
ANL SWAP MOV INC RET MOV JNZ MOV MOV DEC DJNZ RET A,#0F0H A @R0,A R0
A,@R0 Exit A,#10H @R0,A R0
R7,BlackDisplay
实验四 四字节十六进制数转十进制数
一、实验目的
进一步熟悉51汇编指令,了解十六进制数转十进制数的方法。
二、实验内容
从键盘上输入8位十六进制数,实现四字节十六进制数转8位十进制数,并在数码管上显示。注意输入数据必须在00000000H~05F00000H范围,否则,结果超出8位十进制数,无法正确显示。
三、程序框图
开始初始化堆栈设定\"先清LED,再接收键输入\"标志通过键盘获得4字节十六进制数置位\"接收到第一个键后,才清除LED\"标志十六进制转十进制子程序显示主程序开始0→R4,R5,R6,R7(用于存放压缩BCD码)32→B(循环次数)CLR C四字节十六进制数带进位左移一位(R4R5R6R7)×2+进位位C→(R4R5R6R7),同时进行十进制调整NB-1=0?Y返回十六进制转十进制子程序
四、实验步骤
1、连线说明: D3区 :CLK D3区 :CS D3区 :A0 —— B2区:2M —— A3区:CS5 —— A3区:A0 2、在F4区的键盘上输入8位十六进制数 3、结果显示在F4区的数码管上
五、程序清单 EXTRN Buffer F1
START:
START1:
CODE(Display8, GetKey) DATA 30H BIT 0D1H ORG 0000H LJMP START ORG 0100H MOV SP,#60H CLR F1 MOV R0,#buffer MOV A,#8 LCALL GetKey SETB F1 MOV R0,buffer MOV R1,buffer+1 MOV R2,buffer+2 MOV R3,buffer+3 ACALL B4toD4
;8字节显示缓冲区
;PSW.1
;先清除显示,再接收键输入
;按键次数
;得到4字节十六进制数
;接收到第一个键后,才清除显示
;转换成十进制数
Display: MOV R0,#buffer ;显示结果 MOV A,R7 ;低位 ACALL B1toB2 ;压缩BCD码转换成非压缩BCD码 MOV A,R6 ACALL B1toB2 MOV A, R5 ACALL B1toB2 MOV A,R4 ;高位 ACALL B1toB2 MOV R0,#buffer+7 MOV R7,#7 ACALL BlackDisplay ;将高位0消隐 MOV R0,#buffer LCALL Display8 SJMP START1
;四字节十六进制数转十进制数:R0R1R2R3为十六进制,R4R5R6R7为压缩BCD码 B4toD4: CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,A MOV B,#32 LOOP: CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R1 RLC A MOV R1,A MOV A,R0 RLC A MOV R0,A MOV A,R7 ADDC A,R7 DA A MOV R7,A MOV A,R6 ADDC A,R6 DA A MOV R6,A MOV A,R5
B1toB2:
BlackDisplay:
Exit: END
ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ B,LOOP RET PUSH ACC ANL A,#0FH MOV @R0,A INC R0 POP ACC ANL A,#0F0H SWAP A MOV @R0,A INC R0 RET
MOV A,@R0 JNZ Exit MOV A,#10H MOV @R0,A DEC R0
DJNZ R7,BlackDisplay RET
;将高位0消隐
实验五 双字节BCD码(十进制数)乘法
一、实验目的
进一步熟悉51汇编指令,掌握汇编语言的设计和调试方法。根据程序流程图,自己设计程序,了解如何调用系统提供的子程序。
二、实验内容
从键盘上输入4位被乘数、乘数,实现四位十进制数的乘法,结果显示在数码管上。
三、程序框图
开始初始化堆栈设定\"先清LED再接收键输入\"标志通过键盘获得4位十进制被乘数转换成二进制数并压栈暂存置位\"接收到第一个键后,才清除LED\"标志通过键盘获得4位十进制乘数转换成二进制数(R2R3)被乘数出栈(R0R1)双字节十六进制乘法子程序十六进制结果转十进制压缩BCD码转非压缩BCD码将高位0消隐显示+ (R0)(R1) × (R2)(R3)(R3R1H)(R3R1L)(R3R0H)(R3R0L)(R2R1H)(R2R1L)(R2R0H)(R2R0L)R0 R1 R2 R3双字节十六进制乘法示意图双字节BCD乘法程序框图
四、实验步骤
1、连线说明:
D3区 :CLK D3区 :CS D3区 :A0 —— B2区:2M —— A3区:CS5 —— A3区:A0 2、在F4区的键盘上输入4位被乘数、乘数 3、结果显示在F4区的数码管上
五、程序清单 EXTRN Buffer F1
CODE(Display8, GetBCDKey) DATA 30H BIT 0D1H ORG 0000H
;8字节显示缓冲区
;PSW.1
LJMP START ORG 0100H START: MOV SP,#60H CLR F1 START1: MOV R0,#buffer MOV A,#4 LCALL GetBCDKey MOV R0,#buffer ACALL D4toB2 PUSH 02H PUSH 03H SETB F1 MOV R0,#buffer MOV A,#4 LCALL GetBCDKey MOV R0,#buffer ACALL D4toB2 POP 01H POP 00H ACALL WordMul ACALL B4toD4 Display: MOV R0,#buffer MOV A,R7 ACALL B1toB2 MOV A,R6 ACALL B1toB2 MOV A, R5 ACALL B1toB2 MOV A,R4 ACALL B1toB2 MOV R0,#buffer+7 MOV R7,#7 ACALL BlackDisplay MOV R0,#buffer LCALL Display8 SJMP START1
;双字节十六进制数乘以双字节十六进制数子程序WordMul: MOV A,R3 MOV B,R1 MUL AB XCH A,R3 MOV R7,B MOV B,R0 MUL AB
;先清除显示,再接收键输入
;按键次数
;得到双字节十进制数(被乘数)
;转换成二进制数
;接收到第一个键,才清除显示
;按键次数
;得到双字节十进制数(乘数)
;转换成二进制数
;(R0R1)*(R2R3)=R0R1R2R3 ;转换成十进制数 ;显示结果 ;低位
;压缩BCD码转换成非压缩BCD码
;高位
;将高位0消隐
; (R0)(R1) ; × (R2)(R3) ;--------------------------- ; (R3R1H)(R3R1L) ; (R3R0H)(R3R0L) ; (R2R1H)(R2R1L) ;(R2R0H)(R2R0L)
ADD A,R7 ;-------------------------------- MOV R7,A ; R0 R1 R2 R3 CLR A ADDC A,B XCH A,R1 MOV B,R2 MUL AB ADD A,R7 XCH A,R2 PUSH ACC MOV A,B ADDC A,R1 MOV R1,A CLR A RLC A XCH A,R0 POP B MUL AB ADD A,R1 MOV R1,A MOV A,R0 ADDC A,B MOV R0,A RET
;双字节十进制数转二进制数 ,R0--指向双字节十进制数,结果在R2R3中 D4toB2: MOV A,@R0 ANL A,#0FH XCH A,@R0 ANL A,#0F0H SWAP A MOV B,#10 MUL AB ADD A,@R0 INC R0 MOV B,#10 MUL AB MOV R2,B MOV R3,A MOV A,@R0 ANL A,#0FH XCH A,@R0 ANL A,#0F0H SWAP A ADD A,R3
XCH ADDC MOV MUL XCH MOV MUL ADD MOV MOV ADDC MOV RET B1toB2: PUSH ANL MOV INC POP ANL SWAP MOV INC RET BlackDisplay: MOV JNZ MOV MOV DEC DJNZ B4toD4: CLR MOV MOV MOV MOV MOV
Exit: RET END
A,R2 A,#0 B,#10 AB A,R2 B,#10 AB A,@R0 R3,A A,R2 A,B R2,A ACC A,#0FH @R0,A R0 ACC A,#0F0H A @R0,A R0
A,@R0 Exit A,#10H @R0,A R0
R7,BlackDisplay A R4,A R5,A R6,A R7,A B,#32
;将高位0消隐
实验六 双字节BCD码除于单字节BCD码
一、实验目的
进一步熟悉51汇编指令,掌握汇编语言的设计和调试方法。自己设计程序,了解如何调用系统提供的子程序。
二、实验内容
从键盘上输入4位被除数、二位除数,实现双字节BCD码除于单字节BCD码,结果显示在数码管上。
三、程序框图
开始初始化堆栈设定\"先清LED,再接收键输入\"标志通过键盘获得4位被除数,转换为十六进制数并暂存置位\"接收到第一个键后,才清除LED\"标志通过键盘获得单字节除数,转换为16进制数N双字节除以单字节(商为16位)显示子程序主程序开始循环次数8→R716位被除数(R2,R3)带进位左移一位(最低位补0,C→F0)R2-除数(B)YF0=1?NC=1?N差→R2,R3自加1R7-1=0?Y返回双字节除以单字节(商为8位)子程序双字节BCD除法程序框图Y最终获得结果(16位的商,8位余数)返回双字节除以单字节(商为16位)子程序开始单字节除法:被除数的高字节除以除数,结果为最终商的高8位双字节除以单字节(商只有8位)子程序
四、实验步骤
1、连线说明: D3区 :CLK D3区 :CS D3区 :A0 —— B2区:2M —— A3区:CS5 —— A3区:A0 2、在F4区的键盘上输入4位被乘数、乘数 3、使用各种手段调试程序
4、结果显示在F4区的数码管上
五、程序清单 EXTRN Buffer F1
CODE(Display8, GetBCDKey) DATA 30H BIT 0D1H ORG 0000H
;8字节显示缓冲区
;PSW.1
LJMP START ORG 0100H START: MOV SP,#60H CLR F1 ;先清除显示,再接收键输入 START1: MOV R0,#buffer MOV A,#4 ;按键次数 LCALL GetBCDKey ;得到双字节十进制数(被除数) SETB F1 ;接收到第一个键,才清除显示 MOV R0,#buffer ACALL D4toB2 ;转换成二进制数 MOV R0,#buffer MOV A,#2 LCALL GetBCDKey ;得到1字节十进制数(除数) MOV R0,#buffer ACALL D2toB2 ;转换成二进制数 JNZ START2 ACALL DisplayError ;除数为0,出错 SJMP START START2: ACALL B2_DIV_B1 ;被除数 / 除数 ACALL Display ;显示商和被除数 SJMP START1
; 双字节除于单字节,R2R3为16位二进制数,B为除数,商在R2R3中, 余数在A中 B2_DIV_B1: PUSH B MOV A,R2 DIV AB MOV R2,B POP B PUSH ACC CALL DIV_B2_B1 POP ACC XCH A,R2 RET
;双字节除于单字节,R2R3为被除数,B为除数,结果:商R3中,余数在R2中 DIV_B2_B1: MOV R7,#8 ;双字节除于单字节 DIV2: CLR C ;R2R3为被除数,B为除数, MOV A,R3 ;结果:商R3中,余数在R2中 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV F0,C CLR C SUBB A,B
JB F0,DIV3 JC DIV4 DIV3: MOV R2,A INC R3 DIV4: DJNZ R7,DIV2 RET
;4字节二进制数转十进制数,R2R3为16位二进制数,R4R5R6为压缩BCD码 B2toD5: LOOP: D2toB2: Display: CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,#16 CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,R6 DA A MOV R6,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ R7,LOOP RET MOV A,@R0 ANL A,#0FH
XCH A,@R0 ANL A,#0F0H SWAP A MOV B,#10 MUL AB ADD A,@R0 MOV B,A RET PUSH ACC ; ;1字节十进制数转二进制数
;R0--指向1字节十进制数,结果在B中 ;转换成二进制数 ;商在低四位,余数在高三位
DisplayError:
DisplayError1:
D4toB2:
ACALL B2toD5 MOV R0,#buffer MOV A,R6 ACALL B1toB2 MOV A,R5 ACALL B1toB2 DEC R0 MOV R7,#3
ACALL BlackDisplay MOV buffer+4,#10H MOV R0,#buffer+7 POP ACC MOV B,#100 DIV AB MOV @R0,A DEC R0 MOV A,B MOV B,#10 DIV AB MOV @R0,A DEC R0 MOV @R0,B
MOV R0,#buffer+7 MOV R7,#2
ACALL BlackDisplay MOV R0,#buffer LCALL Display8 RET
MOV R0,#buffer MOV R7,#8 MOV A,#0FH MOV @R0,A INC R0
DJNZ R7,DisplayError1 MOV R0,#buffer LCALL Display8 RET ANL A,#0FH XCH A,@R0 ANL A,#0F0H SWAP A MOV B,#10 MUL
AB
;二进制数转十进制数
;压缩BCD码转换成非压缩BCD码
;将高位0消隐 ;消隐
;将高位0消隐
MOV
B1toB2:
BlackDisplay: END
ADD A,@R0 INC R0 MOV B,#10 MUL AB MOV R2,B MOV R3,A MOV A,@R0 ANL A,#0FH XCH A,@R0 ANL A,#0F0H SWAP A ADD A,R3 XCH A,R2 ADDC A,#0 MOV B,#10 MUL AB XCH A,R2 MOV B,#10 MUL AB ADD A,@R0 MOV R3,A MOV A,R2 ADDC A,B MOV R2,A RET PUSH ACC ANL A,#0FH MOV @R0,A INC R0 POP ACC ANL A,#0F0H SWAP A MOV @R0,A INC R0 RET
MOV A,@R0 JNZ Exit MOV A,#10H MOV @R0,A DEC R0
DJNZ R7,BlackDisplay
;将高位0消隐
实验八 冒泡排序
一、实验目的
熟悉使用MCS51指令,掌握汇编语言的设计和调试方法,了解如何使用高效方法对数据排序。
二、实验内容
编写并调试一个排序程序,要求使用冒泡法将一组数据从小到大重新排列。
三、程序框图
开始初始化堆栈将待排序数组转移到内部30H开始的RAM中数据数-1→R7,数据交换标志bSort=0 PUSH 07H被比较数地址R0=30H比较数地址R1=R0+1NDEC R7@R0>@R1?Y@R0与@R1互换1→bSortINCINCNR0R1NR7=R7-1 R7=0?YPOPR7bSort=0?Y结束冒泡排序程序框图
四、实验步骤
使用断点方式调试程序,检查内部RAM 30H~3FH中数据是否按从小到大的顺序排列。
五、程序清单 bSort BIT F0 ORG 0000H LJMP STAR ORG 0100H STAR: MOV SP,#60H ;堆栈 MOV R0,#30H ;存放待排序数据的首地址 MOV R7,#16 ;数据个数 MOV DPTR,#TAB_1 STAR1: CLR A MOVC A,@A+DPTR MOV @R0,A ;将数据移入内部RAM中 INC R0 INC DPTR DJNZ R7,STAR1 MOV R7,#16-1 ;存放比较次数
STAR2:
STAR3:
STAR5:
Exit: TAB_1: PUSH 07H
MOV R0,#30H ;存放启始地址 CLR bSort MOV R1,00H INC R1 MOV A,@R0 MOV B,A MOV A,@R1 CJNE A,B,$+3 JNC STAR5 XCH A,@R0 MOV @R1,A SETB bSort INC R0 INC R1 DJNZ R7,STAR3 POP 07H JNB bSort,Exit DEC R7 SJMP STAR2 SJMP $
DB 0H,5H,6H,3H,8H,92H,04H,57H,46H,01H,0FFH,0A0H,45H,99H,55H,66H END
因篇幅问题不能全部显示,请点此查看更多更全内容