单片机实验报告1

时间:2024.5.2

实验1 开发环境使用及常用指令功能

一、实验目的

1、掌握集成开发环境的使用;

2、初步了解实验装置的使用方法;

3、熟悉常用指令的功能;

4、熟悉程序调试的方法;

5、学习自己编写、调试计算程序。

二、实验说明

利用单片机及Keil uVision4软件实现程序的编译、运行、调试,学会利用软件硬件的几次开发使用。

三、实验内容

1、自行编写一段计算程序,实现双字节二进制数除以单字节二进制数,将所编程序录入、编译加载并调试。分析运行过程

2、用排线将单片机P2口与通用板上LED指示灯连接,单步执行下列指令:

SETB P2.0

CLR P2.0

CPL P2.1

CPL P2.1

MOV A,#55H

MOV P2,A

XRL A,#0FFH

MOV P2,A

RLC A

MOV P2,A

观察指令执行后,指示灯的亮、熄现象,理解指令的功能。在实验报告中记录实验现象和分析。

四、实验程序

1、双字节二进制数除以单字节二进制数程序如下:

ORG 0000H

START: LJMP CLATE

ORG 0030H

CLATE: MOV 34H,#10 ;被除数高位34H设为10

MOV 33H,#0 ;被除数低位33H设为0

MOV 35H,#10 ;除数35H设为10

MOV R3,34H ;被除数高位移至R3

MOV R2,33H ;被除数高位移至R2

MOV R4,35H ;除数移至R4

MOV 32H,0 ;设置商存放在32H

MOV B,#8 ;设置循环次数

LOOP: CLR C ;

MOV A,R3 ;被除数高位移至A

SUBB A,R4 ;R3-R4

MOV 31H,A ;余数暂存31H

JNC LOOP1 ;若够减,则跳转LOOP1

MOV A,R2 ;若不够减,则R3R2整体左移

RLC A ;

MOV R2,A ;

MOV A,R3 ;

RLC A ;

MOV R3,A ; 至此R3R2整体左移

LJMP LOOP2 ;

LOOP1: INC 32H ;够减商增1

MOV R3,31H ;余数存回至除数高位

LOOP2: MOV A,32H

RL A

MOV 32H,A

DJNZ B,LOOP ;未做完除法,则转LOOP继续

MOV R6,32H

END

五、实验现象

1、双字节二进制数除以单字节二进制数程序:

运行结束后,R6为Ox0a,即商为10

2、P2口与LED指示灯亮暗实验:

SETB P2.0 L1 L2 L3 L4 L5 L6 L7 L8

CLR P2.0 亮 暗 暗 暗 暗 暗 暗 暗

CPL P2.1 亮 亮 暗 暗 暗 暗 暗 暗

CPL P2.1 亮 暗 暗 暗 暗 暗 暗 暗

MOV A,#55H

MOV P2,A

XRL A,#0FFH 暗 亮 暗 亮 暗 亮 暗 亮

MOV P2,A

RLC A 亮 暗 亮 暗 亮 暗 亮 暗

MOV P2,A

END 亮 亮 暗 亮 暗 亮 暗 亮

六、思考题

1、跨越式单步运行方式和进入式单步运行方式有什么区别?

答:进入式单步:在调试状态下,点击图标,或执行快捷键F11,或者使用“Debug”菜单栏“Step Into”选项,可以执行进入式单步操作。每进行一次操作,程序将运行一条指令。每执行一行指令,表征PC指针的图标都会向下移动一行,已执行过的语句呈现绿色。进入式单步当遇到子程序调用时,将会跟踪到子程序中执行。

跨越式单步:点击图标,或者执行快捷键F10,或者使用“Debug”菜单栏的“Step over”选项,可以执行跨越式单步。跨越式单步当遇到子程序调用指令时,不跟进子程序中执行,直接把整个子程序一步执行完。对于其它指令来说,跨越式单步和进入式单步的作用相同。

2、如何设置程序指针到光标所在程序行?

答:(1)移动PC到光标所在行

在光标所在程序行,点击鼠标右键,弹出一个菜单,选中“Set Program Counter”选项,可以将程序指针PC图标强行移到光标所在行。

调试程序时,如果希望改变程序的起始运行地址,可以利用此功能移动程序指针PC指向需运行的程序位置。

(2)执行到光标所在行

点击图标,或者使用快捷键Ctrl+F10,或者使用“Debug”菜单栏中的 “Run to Cursor line”选项,可以使程序从当前图标所在行执行到光标所在行。

3、如何修改内部RAM存储单元的值?

答: 通过打开数据存储器观察窗口,用户可以观察指定范围内的数据存储器内容。指定一个内部RAM存储单元所包含的一个地址,将鼠标放到该地址数值上,在右键弹出的窗口中,可以人为强行修改相应地址单元的值。程序调试时,也可以采用指令给RAM单元赋值,也可以人为强行修改RAM中的值。

实验2 “跑马灯”实验

一、实验目的

1、 了解发光二极管的使用方法;

2、 熟悉串行、并行输出扩展接口的方法;

3、 学习常用指令用法和简单程序编写技巧。

二、实验说明

利用单片机的P1口低4位,通过一片74HC595控制8位发光二极管,方法是在实验箱通用板上将P1口的低4位与74HC595的输入信号相连,将74HC595的输出分别与发光二极管相连,由此构成的实验电路原理如图3.1.1所示。

图3.1.1 发光二极管串行控制电路

在图3.1.1中,74HC595的SI(串行数据输入端)、SCLK(串行移位时钟输入端)、RCLK(输出寄存器锁存时钟端)、/OE(输出引脚使能端)分别与单片机的P1.0、P1.1、P1.2、P1.3引脚相连。74HC595输出低电平时点亮发光二极管。图3.1.1中595的输出使能引脚(/OE)已直接连接到“地”,使输出总是使能。

三、实验内容

1、 按图3.1.1连接电路,调试参考程序,单步执行部分指令,观察有关寄存器中值的变化,理解指令的功能和执行效果;

2、 自行对实验箱核心板上的发光二极管电路进行编程,采用并行接口控制的方法,实现“跑马灯”的功能,画出实验电路,记录实验程序。

四、实验程序

利用图3.1.1电路实现“跑马灯”功能的参考程序如下:

LIGHT EQU 62H ;定义指示灯数据存放地址单元

ORG 0000H

AJMP START

ORG 0030H

START: MOV SP,#30H ;初始化堆栈指针

CLR P1.0

CLR P1.1

CLR P1.2

CLR P1.3 ;初始化有关I/O口

;P1.3始终为0,输出使能恒有效

MOV LIGHT,#01H ;初始化指示灯数据

NOP

MAIN: LCALL FLY_LED ;调用指示灯循环点亮子程序

LCALL DELAY ;延时子程序同参考例程一

AJMP MAIN ;循环执行主程序

;******************************************************

;通过595循环点亮指示灯子程序

;*****************************************************

FLYLED: MOV A,LIGHT

CLR C

RLC A ;累加器A中最高位移到C

CPL C ;因低电平点亮,故取反

MOV P1.0,C ;LIGHT中数据最高位送到SER输入端

SETB P1.1

NOP

CLR P1.1 ;产生一个输入锁存脉冲

SETB P1.2

NOP

CLR P1.2 ;产生一个寄存器锁存脉冲

CJNE A,#0,FLYCON ;A中不为0则继续

MOV A,#01H ;A中为0,循环完一轮

;重新赋初值

FLYCON: MOV LIGHT ,A

RET

;延时子程序

DELAY: MOV R7,#20 ;将R7赋值20

DELAY1: MOV R6,#0 ;将R6赋值0,相当于赋值256

DELAY2: DJNZ R6,$ ;R6中的值减1不为0则循环执行当前行

DJNZ R7,DELAY1 ;R7中的值减1不为0则循环

RET

五、实验现象

LED灯从L1到L8依次循环点亮,实现了“跑马灯”的功能

六、思考题

1、什么是LED?LED的工作电流一般为多大?为什么在LED电路上要串联一个电阻?串联电阻的取值应为多少?

答: LED(Light Emitting Diode)是发光二极管的英文缩写。单个LED在各种仪器、仪表中常用作各种指示灯,根据外形直径的大小,常用的有Φ3、Φ5(mm)等型号,每一种直径下,还有普通亮度、高亮度、超高亮度等种类。普通亮度发光二极管工作电流一般为十几个毫安,高亮和超亮发光二极管在同样工作电流下,亮度更高。在LED电路上要串联一个电阻,称为限流电阻,起到了限流的作用,其阻值约为500欧,实际使用中,选择330到510欧的限流电阻,都是可行的。

2、串行接口器件和并行接口器件各有什么优缺点?

答:串行接口需要的CPU口线要少一些,但是占用CPU的时间要长一些;并行接口需要的CPU口线要多一些,但是占用CPU的时间要少一些。

3、单片机的晶振为12MHz,参考程序中的延时子程序的延时时间约为多少?如何修改延时时间?

答:=1μs,如下列出了延时子程序中各条指令的机器周期数:

延时子程序

DELAY: MOV R7,#20 ;1

DELAY1: MOV R6,#0 ;1

DELAY2: DJNZ R6,$ ;2

DJNZ R7,DELAY1 ;2

RET ;2

整个程序执行所用的机器周期数为:

1+(1+2256+2)20+2=10303

因此延时时间约为10.3ms

可以通过修改R6或R7的值来改变程序循环次数,从而修改延时时间。

实验3 数码管显示功能的实现

一、实验目的

1、 了解数码管显示器的特性和使用方法;

2、 进一步熟悉常用指令和编程技巧;

3、 熟悉单片机I/O口的使用方法。

二、实验说明

1、数码管电路结构

内部8个LED处于不同的位置,每个LED显示一个笔画,称为一段;通过外接电路控制点亮不同的LED组合,显示一位相应的数字(符号)。

对于单个数码管来说,一般有十个引脚。8个发光二极管的阳极连接在一起称为共阳极数码管显示器。实验箱上通用版上的数码管即为共阳极的。若将所有发光二级管的极性调换一下,所有的阴极连接到一起则称为共阴极数码管。

2、数码管显示器的动态控制电路

实验箱的核心板上,有6个共阴极数码管显示器,被设计成既可为并行接口动态控制,又可为串行接口动态控制。

三、实验内容

1、 读懂串行接口和并行接口的LED显示参考示例程序;

2、 分别运行并验证参考示例程序

3、 要让次低位LED数码管显示中总是带有小数点,即显示的6位数值中包括一位小数,修改参考程序实现;

四、实验程序

1、并行接口LED显示

D_DAT0 EQU 6AH

D_DAT1 EQU 6BH

D_DAT2 EQU 6CH

D_DAT3 EQU 6DH

D_DAT4 EQU 6EH

D_DAT5 EQU 6FH ;定义显示数据单元

ORG 0000H

AJMP START

ORG 0030H

START: MOV SP, #30H ;初始化堆栈指针

MOV D_DAT0, #0

MOV D_DAT1, #1

MOV D_DAT2, #2

MOV D_DAT3, #3

MOV D_DAT4, #4

MOV D_DAT5, #5 ;初始化显示数据

MOV P0, #0 ;

CLR P1.1 ;初始化有关I/O口

CLR P1.2

MOV R0, # D_DAT0 ;初始化显示数据指针寄存器R0

;指向第一位需显示数字

MOV R1, #01H ;初始化需点亮数码管位置代码

NOP

MAIN: LCALL DISP ;调用数码管循环点亮子程序

LCALL DELAY ;延时子程序同前,应修改延时时间

AJMP MAIN ;循环执行主程序

;****************************************************

;通过574显示6位数字子程序

;****************************************************

DISP: MOV A, R1 ;取位代码

MOV P0, A ;位代码送P0抠(用于产生位选信号)

SETB P1.2

NOP

CLR P1.2

MOV A, @R0 ;取需显示的数字值

MOV DPTR, #DISPD ;装载笔画编码表首地址

MOVC A, @A+DPTR ;取需显示数字笔画代码

MOV P0, A ;笔画代码送到P0口(勇于产生段选信号)

SETB P1.1

NOP

CLR P1.1 ;产生一个锁存脉冲,锁存输出笔画代码

INC R0 ;R0增1指向下一个需显示数字

MOV A, R1

CLR C

RLC A

MOV R1, A ;R1中的值左移一位,指向下一位数码管

CJNE R1, #40H, DISP1 ; R1中不为40H(未显示完6位)继续

MOV R0, #D_DAT0 ;R1中为40H,循环完一轮

;重新赋初值

MOV R1, #1 ;位置代码初值

DISP1: NOP

RET

;数字笔画代码表

; 0 1 2 3 4 5 6 7 8 9 熄

DISPD: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH, 0

;延时子程序

DELAY: MOV R7,#20 ;将R7赋值20

DELAY1: MOV R6,#0 ;将R6赋值0,相当于赋值256

DELAY2: DJNZ R6,$ ;R6中的值减1不为0则循环执行当前行

DJNZ R7,DELAY1 ;R7中的值减1不为0则循环

RET

2、串行LED显示程序

D_DAT0 EQU 6AH

D_DAT1 EQU 6BH

D_DAT2 EQU 6CH

D_DAT3 EQU 6DH

D_DAT4 EQU 6EH

D_DAT5 EQU 6FH ;定义显示数据单元

ORG 0000H

AJMP START

ORG 0030H

START: MOV SP, #30H ;初始化堆栈指针

MOV D_DAT0, #0

MOV D_DAT1, #1

MOV D_DAT2, #2

MOV D_DAT3, #3

MOV D_DAT4, #4

MOV D_DAT5, #5 ;初始化显示数据

MOV P0, #0 ;

CLR P1.1 ;初始化有关I/O口

;以上内容与前面相同

CLR P1.3

CLR P1.1

CLR P1.2 ; 初始化有关I/O口

MOV R0, #D_DAT0 ; 初始化数据指针

; R0指向第一位显示数字

MOV R1, #01H ;初始化需点亮数码管位置代码

NOP

MAIN: LCALL DISP ;调用数码管循环点亮子程序

LCALL DELAY ;延时子程序同前

AJMP MAIN ;死循环

;*********************************************

;通过595显示4位数字子程序

;*********************************************

DISP: MOV A, R1 ;取位代码数据

MOV R2, #8 ;R2中为循环次数

DISP1: CLR C

RLC A

MOV P1.3, C ;一个位选信号送到SER的输入端

SETB P1.1

NOP

CLR P1.1 ;产生一个串行移位时钟脉冲

DJNZ R2, DISP1 ;一次将8个位选信号移入

;实际只有6位有用

MOV A,@R0 ;取需显示的数字

MOV DPTR,#DISPD ;笔画编码表同前

MOVC A,@A+DPTR ;去需显示数字笔画代码(段选信号)

MOV R2,#8

DISP2: CLR C

RLC A

MOV P1.3, C ;段选信号送到SI引脚

SETB P1.1

NOP

CLR P1.1 ;产生一个移位时钟脉冲

DJNZ R2, DISP2 ;依次将8个笔画信号(段选信号)移入

SETB P1.2

NOP

CLR P1.2 ;产生一个输出锁存脉冲

INC R0 ;R0中不为40H则继续

MOV A,R1

CLR C

RLC A

MOV R1, A ;R1中的值左移1位,指向下一位数码管

CJNE R1, #40, DISP3 ;R1中不为40H则继续

MOV R0, #D_DAT0 ;R1中为40H,循环完一轮

;重新赋初值

MOV R1, #01H ;位选数据重新赋初值

DISP3: RET

;延时子程序

DELAY: MOV R7,#20 ;将R7赋值20

DELAY1: MOV R6,#0 ;将R6赋值0,相当于赋值256

DELAY2: DJNZ R6,$ ;R6中的值减1不为0则循环执行当前行

DJNZ R7,DELAY1 ;R7中的值减1不为0则循环

RET

3、带小数点LED显示:将代码表中4对应的66H改为0E6H即可。

五、实验现象

1并行LED显示程序实验:六个数码管依次显示0 1 2 3 4 5

2串行LED显示程序实验:六个数码管依次显示0 1 2 3 4 5

3带小数点LED显示实验:六个数码管依次显示0 1 2 3 4. 5

六、思考题

1要让LED数码管显示A、b、C、d、E、F六个字母,请列写笔画代码表。

;数字笔画代码表

; A b C d E F

DISPD: DB 77H 7CH 39H 5EH 79H 71H

2LED数码管动态显示和静态显示各有什么优缺点?

动态:需要器件数量少,功率低,印刷电路面积少,但占用CPU时间多

静态:需要器件数量多,功率大,印刷电路面积多,但占用CPU时间少

实验5 按键功能的实现

一、实验目的

1、 理解按键电路的作用;

2、 学习按键功能的编程方法;

3、 熟悉单片机I/O口连接独立式按键的编程应用方法。

二、实验说明

实验箱核心板上有4个按键,其一端全部与地线相连,另一端顺次与P1.4~P1.7相连,本实验需要用到核心板上的3个按键,3个指示灯和6个数码管,所用到的实验电路原理如图所示。

本实验中3个按键设计的功能,是一个使用的简单温度控制系统的按键功能,要求通过按键设定一个温度上限值和一个温度下限值。本实验只涉及按键和显示功能,在今后的试验中,将进一步增加硬件和软件功能,利用单片机实现实际的温度控制系统,是温度维持在上、下限值之间。

①“功能”键:在内存数据区定义一个名称为“KRM”的字节,存放功能编号,共有3种功能,分别对应编号为0,1,2。每按一次“功能”键,“KRM”中的值在这三个数字中循环改变一次。与三种功能对应,设计三个LED(发光二极管)指示灯,有单片机P3口控制,当处于某种功能状态时,相应的指示灯亮。本实验的内容,实际上是后面进一步做温度测量控制系统的一部分。三种功能的含义如下:

功能号0:显示测量的温度值;

功能号1:对温度上限值进行修改;

功能号2:对温度下限值进行修改。

②“↑”键:每按一次“↑”键,内存数据区中指定变量单元的值增1,持续按住则连续增1。

③“↓”键:与“↑”键对应,每按一次“↓”,内存数据区中指定变量单元的值减1,持续按住则连续减1。

功能号为0时,数码管显示被测温度值,此时按另外两个按键不起作用。功能号为1时,数码管显示设定温度的上限值,按两外两个按键可以修改温度上限值,功能号为2时,数码管显示设定温度的下限值,此时按另外连个按键可以修改温度上限值。

三、实验任务

1、 理解单片机I/O口与按键,指示灯和LED数码管的综合使用方法;

2、 理解如图所示电路,读懂参考程序;

3、 自行设计按键显示功能(比如将6位数码管分成三组,分别显示上限、下限、测量值),并编程实现所设计的功能。

四、实验程序

实现按键和显示参考程序如下:

D_DAT0 EQU 60H

D_DAT1 EQU D_DAT0+1

D_DAT2 EQU D_DAT1+1

D_DAT3 EQU D_DAT2+1

D_DAT4 EQU D_DAT3+1

D_DAT5 EQU D_DAT4+1 ;定义显示数据单元

LIGHT EQU D_DAT5+1

H_DAT0 EQU LIGHT+1

H_DAT1 EQU H_DAT0+1

KBM EQU H_DAT1+1 ;定义按键功能号存放单元

D_MAX EQU KBM+1 ;定义上限值存放单元

D_MIN EQU D_MAX+1 ;定义下限值存放单元

T_DAT0 EQU D_MIN+1

T_DAT1 EQU T_DAT0+1 ;定义测量值存放单元

ORG 0000H

AJMP START

ORG 0030H

START: MOV SP,#30H ;初始化堆栈指针

MOV D_DAT0, #0

MOV D_DAT1, #0

MOV D_DAT2, #0

MOV D_DAT3, #0

MOV D_DAT4, #0

MOV D_DAT5,#0 ;初始化显示数据

MOV LIGHT, #80H

CLR P1.0

CLR P1.1

CLR P1.2

CLR P1.3 ;初始化有关I/O口

MOV R0,#D_DAT0 ;初始化数据指针,R0指向第一位显示数字

MOV R1,#01H ;初始化需点亮数码管位置代码

MOV KBM,#0 ;初始化功能号

MOV D_MAX, #80

MOV D_MIN, #70 ;初始化上、下限值

MOV T_DAT0, #66

MOV T_DAT1,#0 ;目前人为赋给测量值一个值,将来有实际测量值就存放在此

MOV H_DAT0, T_DAT0

MOV H_DAT1, T_DAT1

LCALL HTD ;将测量值二进制数转换为十进制数

MAIN: LCALL DISP ;刷新显示

LCALL DELAY ;显示、延时子程序同前

;******************************************************

;按键处理程序

;*****************************************************

JB P1.7,KEY1 ;查询K0,若K0未按下则跳转

LCALL DISP

LCALL DELAY ;延时去抖动,顺便刷新显示

JB P1.7,KEY1 ;若K0未真正按下则跳转

INC KBM ;K0真正按下,功能号增1

MOV A,KBM

CJNE A,#3,KEY01

MOV KBM,#0 ;若功能号为3,则清0

KEY01: NOP

AJMP KEND ;跳转至按键结束处理程序

KEY1: JB P1.6,KEY2 ;查询K1

LCALL DISP

LCALL DELAY

JB P1.6,KEY2

MOV A,KBM

CJNE A,#1,KEY11 ;功能号不为1则跳转

INC D_MAX ;功能号1,上限值加1

AJMP KEND

KEY11: CJNE A,#2,KEY12 ;功能号不为2则跳转

INC D_MIN ;功能号2,下限值加1

KEY12: AJMP KEND ;跳转至按键结束处理程序

KEY2: JB P1.5,KEND ;查询K2

LCALL DISP

LCALL DELAY

JB P1.5,KEND

MOV A,KBM

CJNE A,#1,KEY21

DEC D_MAX ;功能号1,上限值减1

AJMP KEND

KEY21: CJNE A,#2,KEND

DEC D_MIN ;功能号2,下限值减1

KEND: NOP ;以下程序根据功能号显示不同内容

MOV A, KBM

CJNE A, #0, KEND1

MOV H_DAT0, T_DAT0

MOV H_DAT1,T_DAT1 ;功能号0,准备显示测量数据

MOV LIGHT,#0BFH ;点亮相应指示灯

AJMP KEND3 ;跳转到刷新显示处

KEND1: NOP

CJNE A, #1, KEND2

MOV H_DAT0, D_MAX

MOV H_DAT1,#0 ;功能号1,准备显示上限值

MOV LIGHT,#7FH ;点亮相应指示灯

AJMP KEND3 ;跳转到刷新显示处

KEND2: NOP

CJNE A, #2,KEND3

MOV H_DAT0, D_MIN

MOV H_DAT1,#0 ;功能号2,准备显示下限值

MOV LIGHT,#0DFH ;点亮相应指示灯

KEND3: MOV P0, LIGHT

SETB P1.0

NOP

CLR P1.0 ;产生一个指示灯输出锁存脉冲

LCALL HTD ;将需显示数据转换成4个十进制数

MOV R4, #80H

KEND4: LCALL DISP

LCALL DELAY ;刷新显示,延时

DJNZ R4,KEND4 ;此处循环延时是为了避免按键多次重入

LJMP MAIN ;跳转到主程序开始处循环执行

;******************************************************

;通过595显示4位数字子程序

;*****************************************************

DISP: MOV A,R1 ;取位代码数据

MOV R2,#8

DISP1: CLR C

RLC A

MOV P1.3,C ; 位代码送到SER的输入端

SETB P1.1

NOP

CLR P1.1 ;产生一个输入锁存脉冲

DJNZ R2,DISP1 ;依次将8位位代码移入,实际只有6位有用

MOV A,@R0 ;取需显示的数字

MOV DPTR,#DISPD ;笔画编码表同前

MOVC A,@A+DPTR ;取需显示数字笔画代码

MOV R2, #8

DISP2: CLR C

RLC A

MOV P1.3,C ;笔画代码送到SER的输入端

SETB P1.1

NOP

CLR P1.1 ;产生一个输入锁存脉冲

DJNZ R2,DISP2 ;依次将8位笔画代码(段代码)移入

INC R0 ;R0增1指向下一个需显示数字

MOV A,R1

RL A

MOV R1,A ;R1中的值左移1位,指向下一位数码管

CJNE R1,#40H,DISP3 ;R0中不为70H则继续

MOV R0, #D_DAT0

MOV R1,#01H ;R0中为70H,循环完一轮

;重新赋初值

DISP3: SETB P1.2

CLR P1.2

RET

;数字笔画代码表

; 0 1 2 3 4 5 6 7 8 9 熄

DISPD: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,0

;**********************************************

;延时子程序

;**********************************************

DELAY: MOV R7,#2

DELY1: MOV R6,#0FFH

DELY2: DJNZ R6,$ ;$代表当前行(与DJNZ R6,DELY2相同)

DJNZ R7, DELY1

RET

;二进制转换十进制子程序

HTD: MOV D_DAT5,#00H ;将结果千位清0

MOV D_DAT4, #00H

MOV D_DAT3, #00H

MOV D_DAT2, #00H

H1000: CLR C ;进位位C清0

MOV A,H_DAT0 ;源数据低位装载到累加器A中

MOV R6,A ;备份源数值低位到寄存器R6中

SUBB A,#0E8H ;源数值低位减去1000的低位0E8H

MOV H_DAT0,A ;余数存回到源数值低位存储单元

MOV A,H_DAT1 ;源数值高位装载到累加器A中

MOV R7,A ;备份源数值高位到寄存器R7中

SUBB A,#03H ;源数值高位带借位减1000的高位03H

MOV H_DAT1,A ;余数存回到源数值低位存储单元

INC D_DAT2 ;千位增1

JNC H1000 ;如果没有借位则利用余数循环再减

;有借位表明为最后一次无效减

;程序顺序执行,应还原最后一次修改值

MOV H_DAT0,R6

MOV H_DAT1,R7 ;用备份值作为新的源数值(余数)

DEC D_DAT2 ;千位数减1,去掉最后一次无效减的影响

H100: MOV A,H_DAT0 ;源数值低位装载到累加器A中

MOV R6,A ;备份源数值低位到寄存器R6中

CLR C ;清0进位位C

SUBB A,#100 ;减去100

MOV H_DAT0,A ;存回余数低位

MOV A,H_DAT1 ;取源数值高位

SUBB A,#00H ;减100的高位0,实际上是减去借位位

MOV H_DAT1,A ;存回余数高位

JC H10 ;有借位则跳到下一步继续运算

INC D_DAT3 ;没有借位,百位增1

AJMP H100 ;没有借位继续减

;注意本轮循环中最后一次减时百位未增1

;所以不存在还原的问题

;进入下一轮时,源数值(余数)都在R6中

H10: CLR C

MOV A,R6 ;源数值(低位)装载到累加器A中

;到此源数值高位已经为0,不用再参加计算

MOV D_DAT5,A ;存回源数值低位

;如果是最后一次减,则此值即为个位

SUBB A,#10 ;减去10

MOV R6,A ;保存余数

JC H1 ;有借位,运算结束

INC D_DAT4 ;没有借位,十位增1

LJMP H10 ;没有借位继续减

H1: RET ;子程序返回

END

五、实验现象

功能号为0时,数码管显示被测温度值66,此时按另外两个按键不起作用。

功能号为1时,数码管显示设定温度的上限值80,按两外两个按键可以修改温度上限值

功能号为2时,数码管显示设定温度的下限值60,此时按另外连个按键可以修改温度上限值。

每按一次“↑”键,内存数据区中指定变量单元的值增1,持续按住则连续增1。

每按一次“↓”,内存数据区中指定变量单元的值减1,持续按住则连续减1。

六、思考题

1、 要求单片机P0口连接8个LED指示灯,每个指示灯代表一位二进制数值,利用核心板上的4个按键,实现下述功能:K1按下时指示灯所代表的数值增1,K2减1,K3指示灯左移一位,K4右移一位。画出电路图,并编写实现程序。

单片机实验报告1

LIGHT EQU 64H ;定义LED显示数值存放单元

ORG 0000H

AJMP START

ORG 0030H

START: MOV SP,#30H ;初始化堆栈指针

MOV LIGHT,#0H ;初始化显示数据

ORL P1,#0F0H ;准备读入P1.7,P1.6,P1.5,P1.4的引脚信号

JNB P1.4,KEY1 ;判断K1是否按下,若按下,则P1.4为0,跳转到KEY1

JNB P1.5,KEY1 ;判断K2是否按下,若按下,则P1.5为0,跳转到KEY2

JNB P1.6,KEY1 ;判断K3是否按下,若按下,则P1.6为0,跳转到KEY3

JNB P1.7,KEY1 ;判断K4是否按下,若按下,则P1.7为0,跳转到KEY4

KEY1: INC LIGHT ;K1按下,指示灯所代表值增1

LCALL FLYLED

KEY2: DEC LIGHT ;K2按下,指示灯所代表值减1

LCALL FLYLED

KEY3: MOV A,LIGHT ;K3按下,指示灯所代表值左移1位

RLC A

MOV LIGHT,A

LCALL FLYLED

KEY4: MOV A,LIGHT ;K4按下,指示灯所代表值右移1位

RRC A

MOV LIGHT,A

LCALL FLYLED

;**********************************************

;指示灯点亮程序

;**********************************************

FLYLED: MOV A, LIGHT

CJNE A,#0,FLYCON ;A中不为0则继续

MOV A,#01H ;A中为0,循环完一轮

FLYCON: MOV LIGHT, A

RET

;**********************************************

;延时子程序

;**********************************************

DELAY: MOV R7, #2

DELY1: MOV R6, #0FFH

DELY2: DJNZ R6,$ ;$代表当前行

;与DJNZ R6,DELY2相同

DJNZ R7, DELY1

RET

END

2、 结合程序实例,说明按键防重入,应该如何把握?

如下程序所示

KEND4: LCALL DISP

LCALL DELAY ;刷新显示,延时

DJNZ R4,KEND4 ;此处循环延时是为了避免按键多次重入

LJMP MAIN ;跳转到主程序开始处循环执行

更多相关推荐:
单片机实验报告

单片机实验报告学生姓名学号专业指导教师学院信息与电气工程学院20xx年11月单片机实验报告实验一MCS51指令系统实验数据排序1实验目的熟悉MCS51指令系统掌握程序设计方法加深对内部存储器读写的认识熟悉仿真开...

单片机实验报告

通信与信息工程学院20xx20xx学年第二学期实验报告课程名称单片机原理及应用专业班级学号学生姓名指导教师日期20xx年4月15日1实验一单片机汇编语言程序设计一实验目的1学习MedWin或Keilc51仿真软...

单片机实验报告

题目单片机组成原理实验报告学院计算机科学与工程学院专业信息安全姓名学号20xx年12月8日实验一输入输出接口编程一实验目的1掌握Keil软件的基本使用12掌握单片机汇编语言基本编程二实验内容1学习用Keil软件...

51单片机课程设计实验报告

51单片机课程设计报告学院:专业班级:姓名:指导教师:设计时间:51单片机课程设计一、设计任务与要求1.任务:制作并调试51单片机学习板2.要求:(1)了解并能识别学习板上的各种元器件,会读元器件标示;(2)会…

单片机实验报告

海南大学届单片机实验报告4份论文题目学生姓名学号所在院系专业班级授课教师完成时间蜂鸣器实验实验目的1熟悉实验板中蜂鸣器工作原理掌握汇编编程控制蜂鸣器播放音乐2掌握单片机编程控制蜂鸣器发出不同频率声音的方法3了解...

单片机实验报告

单片机课程设计报告实验五系别物理与电子工程学院年级专业班级学号学生姓名指导教师设计时间常熟理工学院课程设计报告目录1题目22实验要求221实验目的222实验内容23总体设计231硬件设计232软件设计44运行结...

51单片机实验报告

08424020xx单片微型计算机原理学院班级学号姓名指导教师成绩120xx年6月08424020xx硬件实验实验一定时器中断实验实验内容fosc110592MHzT0方式2产生定时中断实现秒表功能数码管后两位...

短学期单片机实验报告

宁波大学信息与工程学院课程名称姓名学号专指导老师班级完成时间单片机应用系统设计自动化09120xx7121目录一实验内容及设计要求311实验内容312设计要求3二概述课题意义及背景介绍3三硬件电路图设计及说明4...

单片机学习实验报告

嵌入式系统实验报告实验1KeilC51的使用汇编语言实验目的初步掌握KeilC51汇编语言和ZY15MCU12BD型综合单片机实验箱的操作和使用能够输入和运行简单的程序实验设备ZY15MCU12BD型综合单片机...

单片机秒表实验报告

单片机课程设计说明书题目电子秒表学生姓名任闯徐金超张飞俞军蒲敏谢长安陈琛曾超刘强强专业农业机械化与自动化班级08级1班指导教师吴敏日期20xx年12月12日目录第一章单片机课程设计任务书1一目的意义1二设计时间...

北京交通大学单片机实验程序报告

单片机实验程序实验二8155并行IO口扩展和动态扫描程序编制1实验目的1掌握8155并行IO芯片扩展和使用方法2掌握数码管动态扫描汇编语言的编制方法2预习要点18155芯片基础知识251单片机的总线时序地址译码...

南昌大学单片机实验报告及程序

实验一IO口的应用一实验要求单片机P10口外接8个LED灯P30口接开关电路图如下当开关断开时流水灯从L1到L7依次间隔02秒循环点亮在任意位置当开关合上时流水灯便从L7灯开始按照L7到L6的顺序点亮晶振选用1...

单片机实验报告(42篇)