Mcs51系列单片机实训指导书
实验三 冒泡排序
一、实验目的
熟悉使用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
6
Mcs51系列单片机实训指导书
INC DPTR DJNZ R7,STAR1 MOV R7,#16-1 ;存放比较次数 STAR2: PUSH 07H MOV R0,#30H ;存放启始地址 CLR bSort MOV R1,00H INC R1 MOV A,@R0 STAR3: MOV B,A MOV A,@R1 CJNE A,B,$+3 JNC STAR5 XCH A,@R0 MOV @R1,A SETB bSort STAR5: INC R0 INC R1 DJNZ R7,STAR3 POP 07H JNB bSort,Exit DEC R7 SJMP STAR2 Exit: SJMP $ TAB_1: DB 0H,5H,6H,3H,8H,92H,04H,57H,46H,01H,0FFH,0A0H,45H,99H,55H,66H END 六、思考题
你还知道哪些排序方法?另外编写一个排序子程序。(数据结构方面的教材上有十几种排序方法)。
7
Mcs51系列单片机实训指导书
实验四 电子钟(定时器、中断综合实验)
一、实验目的
熟悉MCS51类CPU的定时器、中断系统编程方法,了解定时器的应用、实时程序的设计和调试技巧。
二、实验内容
编写一个时钟程序,产生一个50ms的定时中断,对定时中断计数,将时、分、秒显示在数码管上。
三、程序框图
开始初始化堆栈给时钟单元赋初值使用定时器方式一,相关寄存器赋初值开中断,开定时器调显示刷新标志=1?Y清0刷新标志中断处理主程序电子钟程序框图N中断开始恢复定时器初值50ms单元+150ms单元=20?Y50ms单元复位0 秒单元+1秒单元=60?Y秒单元复位0 分单元+1NNN时单元=24?Y时单元复位01→刷新显示标志中断返回N分单元=60?Y分单元复位0 时单元+1
四、实验步骤
1、连线说明:
D3区 :CLK D3区 :CS D3区 :A0 —— B2区:2M —— A3区:CS5 —— A3区:A0 2、时间显示在数码管上
五、程序清单 ms50 DATA sec DATA min DATA hour DATA buffer DATA EXTRN CODE(Display8) ORG
31H
32H 33H 34H 35H 0000H
8
;存放多少个50ms ;秒 ;分 ;时
;显示缓冲区
Mcs51系列单片机实训指导书
LJMP ORG LJMP ORG STAR: MOV MOV MOV MOV MOV MOV MOV MOV MOV SETB STAR1: LCALL JNB CLR SJMP ;中断服务程序 INT_Timer0: MOV MOV PUSH MOV INC CJNE MOV INC INC CJNE MOV INC INC CJNE MOV INC INC CJNE MOV ExitInt1: SETB ExitInt: POP RETI HexToBCD: MOV DIV MOV
STAR
000BH
INT_Timer0 0100H SP,#60H ms50,A hour,#12 min,#59 sec,#50 TH0,#60 TL0,#176 TMOD,#1 IE,#82H TR0 Display F0,$ F0 STAR1
TL0,#176-5 TH0,#60 01H
R1,#ms50 @R1
@R1,#20,ExitInt @R1,#0 R1 @R1
@R1,#60,ExitInt1 @R1,#0 R1 @R1
@R1,#60,ExitInt1 @R1,#0 R1 @R1
@R1,#24,ExitInt1 @R1,#0 F0 01H
B,#10 AB @R0,B
9
;定时器T0中断处理入口地址
;堆栈
;清零ms50
;设定初值: 12:59:50
;定时中断计数器初值 ;定时50ms
;定时器0:方式一 ;允许定时器0中断 ;开定时器T0 ;调用显示
;需要重新显示时间
;50ms单元加1
;恢复初值
;秒加1
;分加1
;时加1
Mcs51系列单片机实训指导书
Display: INC MOV INC RET MOV MOV ACALL MOV INC MOV ACALL MOV INC MOV ACALL MOV LCALL RET END R0 @R0,A R0
R0,#buffer A,sec HexToBCD @R0,#10H R0 A,min HexToBCD @R0,#10H R0 A,hour HexToBCD R0,#buffer Display8
;第三位不显示
;第六位不显示
六、思考题
1、电子钟走时精度与哪些有关系?中断程序中给TL0赋值为什么与初始化程序中不一样?
2、使用定时器方式二,重新编写程序。
10