实验四 数据排序实验
一、实验目的
掌握排序程序的设计方法。 二、实验内容
本例程采用交换排序法将内部RAM 中的50~59H 单元中的10个单字节无符号二进制数按从小到大的次序排列,并将这一列排序后的数据从小到大依次存贮到外部RAM 1000H开始处。 三、实验步骤
1)启动PC机,打开KEIL软件,软件设置为模拟调试状态。在所建的Project文件中添加Order.ASM文件,打开Order.ASM文件,阅读、分析、理解程序,编译程序进行调试。
2)在VIEW菜单中打开MEMORY WINDOW数据窗口,分别观察50H(在MEMORY#1中输入D:50H)、1000H(MEMORY#2窗口输入X:1000H)
3)可在程序指令NOP 处设置断点,在第一个断点处可观察50~59H 单元内容是否为10 个任意排列原始数据。
4)在第二个断点处可观察每次排序的结果。 5)可单步执行程序观察排序过程。 四、实验参考程序
ORG 0000H
JMP MAIN ORG 0100H
MAIN: MOV R0,#50H
MOV @R0,#5FH
INC R0
MOV @R0,#56H INC R0
MOV @R0,#5AH INC R0
MOV @R0,#5EH INC R0
MOV @R0,#51H INC R0
MOV @R0,#5BH INC R0
MOV @R0,#53H INC R0
MOV @R0,#58H INC R0
MOV @R0,#57H INC R0
MOV @R0,#55H ;将10 个随机数送入内部RAM 的50~59H 单元 NOP ;可在此处设置断点 ACALL QUE ;调用排序子程序
OUT: MOV R0,#50H
5
MOV DPTR,#1000H MOV R7,#10
OUT1: MOV A,@R0
MOVX @DPTR,A INC R0 INC DPTR
DJNZ R7,OUT1
HERE: AJMP HERE
NOP ;可在此处设置断点,观察每次排序结果
QUE: CLR 00H ;清交换标志
MOV R1MOV R6I3: MOV AMOV R7MOV AMOV R0MOV AI2: INC R0
MOV R2SUBB AMOV AJC I1 SETB 00H XCH AI1: DJNZ R7JNB 00HMOV @R1INC R1 DJNZ R6 RET
END ,#50H ,#09H
,R6
,A ,R1 ,A ,@R0
,A ,@R0 ,R2 ,@R0
,I2
,STOP ,A ,I3
6
第二章 硬件接口实验部分
实验五 I/O口输入、输出实验
一、实验目的
掌握单片机I/O口输入、输出数据的方法; 二、实验内容
以P1口为输入口,接八位逻辑电平输出,以P0口为输出口,接八位逻辑电平显示,编写一个程序,读入P1口状态并在P0口输出显示。 三、实验电路
实验电路参见指导书中的附录一系统原理图。系统原理图的第一部分为MCU模块,详细地描述了MCU的管脚连接。系统原理图的其它部分为各模块原理图。本实验所需电路请参见系统原理图的第一部分和图9-1、图10-1。 四、实验步骤
1) 系统各跳线器处在初始设置状态(参见附录四),J1的8只短路帽打在1,2处,3,4五只短路帽打在右边,用8位数据线连接八位逻辑电平输出模块的JD50到MCU的JD12(P1口), MCU的JD13连接到八位逻辑电平显示模块的JD30。
2)启动PC机,打开KEIL软件,软件设置为硬件调试状态。在所建的Project文件中添加“LED.ASM”文件,打开“LED.ASM”文件,阅读、分析、理解程序,编译程序进行调试。
3)观察发光二极管的亮灭与拨动开关的状态是否一致。设拨动开关拨下输出为低电平,发光二极管点亮。改变拨动开关的状态,发光二极管的亮灭随之变化。 五、源程序:
ORG 0000H LJMP START ORG 0100H MAIN: MOV A,#0XFF MOV A,P1 MOV P0,A LCALL DELAY LJMP MAIN DELAY: MOV R6,#20 DLOOP1: MOV R7,#0 DLOOP2: DJNZ R7,DLOOP2 DJNZ R6,DLOOP1 RET End
7
实验六 定时器实验
一、实验目的
1.学习8051内部计数器的使用和编程方法 2.进一步掌握中断处理程序的编写方法 二、实验说明
关于内部计数器的编程主要是定时常数的设置和有关控制寄存器的设置。内部计数器在单片机中主要有定时器和计数器两个功能。本实验使用的是定时器,定时为一秒钟。CPU运用定时中断方式,实现每一秒钟输出状态发生一次反转,即发光管每隔一秒钟亮一次。
定时器有关的寄存器有工作方式寄存器TMOD和控制寄存器TCON。TMOD用于设置定时器/计数器的工作方式0-3,并确定用于定时还是用于计数。TCON主要功能是为定时器在溢出时设定标志位,并控制定时器的运行或停止等。
内部计数器用作定时器时,是对机器周期计数。每个机器周期的长度是12个振荡器周期。假设实验系统的晶振是12MHZ,程序工作于方式2,即8位自动重装方式定时器, 定时器100uS中断一次, 所以定时常数的设置可按以下方法计算:
机器周期=12÷12MHz=1uS (256-定时常数)×1uS=100uS
定时常数=156。然后对100uS中断次数计数10000次,就是1秒钟。
在本实验的中断处理程序中,因为中断定时常数的设置对中断程序的运行起到关键作用,所以在置数前要先关对应的中断,置数完之后再打开相应的中断。 三、实验内容及步骤
1)J1的P1.0打在左边,JD12用排线接到JD30八位逻辑电平显示上。 2)安装好仿真器,用串行数据通信线连接计算机与仿真器。
3)启动PC机,打开KEIL软件,软件设置为硬件调试状态。在所建的Project文件中添加“定时器.ASM”文件,打开“定时器.ASM”文件,阅读、分析、理解程序,编译程序进行调试。
4)运行程序观察发光二极管隔一秒点亮一次,点亮时间为一秒。
8
实验七 计数器实验
一、实验目的
1.学习8031内部定时/计数器使用方法 2.学习计数器各种工作方式的用法 二、实验说明
1.8031内部有两个定时/计数器T0和T1,16位是指定时/计数器内的计数器是16位的,由2个8位计数器组成。本实验用的是T0,它的2个8位计数器TH0和TL0,TH0是高8位,TL0是低八位。所谓加法计数器,指其计数的方法是对计数脉冲每次加1。在其它单片机和可编程计数器芯片中,有的计数器是减法计数器,如8155的14位计数器,8253的16计数器,即先设置计数器的初值,然后对计数器脉冲每次减1,减到0,计数器溢出。而8031内部的计数器是加法计数器,需先设置计数器的初值,本实验设置计数器初值为0,然后对计数脉冲每次加1,加到计数器满后溢出。
2.本实验中内部计数器起计数器的作用。外部事件计数脉冲由P3.4引入定时器T0。单片机在每个机器周期采样一次输入波形,因此单片机至少需要两个机器周期才能检测到一次跳变。这就要求被采样电平至少维持一个完整的机器周期,以保证电平在变化之前即被采样。这就决定了输入波形的频率不能超过机器周期频率。 三、实验内容及步骤
T0接外部脉冲输入,P1口接八位逻辑电平显示模块,脉冲个数以二进制形式显示出来。 1)J1的P1.0-P1.7打在左边,JD12用排线接到JD30八位逻辑电平显示上。T0端口接单次脉冲电路的输出端。
2)安装好仿真器,把仿真头插到模块的单片机插座中
3)启动计算机,进入仿真环境,所建的Project文件添加“计数器.ASM”源程序,编译无误后全速运行程序,连续按动单次脉冲的按键,8位逻辑电平显示按键次数。
9