华中科技大学单片机实验二报告.docx
《华中科技大学单片机实验二报告.docx》由会员分享,可在线阅读,更多相关《华中科技大学单片机实验二报告.docx(20页珍藏版)》请在冰豆网上搜索。
华中科技大学单片机实验二报告
《单片机实验》报告
实验名称分支程序设计
指导教师刘冬牛
专业班级
学号
联系方式
任务要求
熟练掌握KeilC环境下汇编语言程序的调试方法,加深对汇编语言指令、机器码、寻址
方式等基本内容的理解,掌握分支程序和简单程序的设计与调试方法,了解并行10口的使
用。
1.设有8bits符号数X存于外部RAM单元,按以下方式计算后的结果Y也存于外部RAM元,请按要求编写程序。
X2当X40
YX/2当20X40
X当X20
2•利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过PO、P1、P2端口输出(以压缩BCD码的形式)。
为低电平时开始计时,为高电平时停止计时。
提高部分(选做):
a.实现4位十进制加、减1计数,千位、百位由P1口输出;十位、个位由P2口输出。
利用状态选择加、减计数方式。
b.利用P3口低四位状态控制开始和停止计数,控制方式自定。
2.设计思路
1•分段函数设计
对于第一个任务,根据变量X的值的不同进行相应的计算。
所以我们首先要判断X的
值属于那个范围。
我们可利用比较转移指令CJNE来判断X是否等于临界值20,40,若不等,
再根据执行CJNE指令后的进位位CY的值来判断X与临界值的的大小关系,如:
CY=0则X
大于临界值,CY=1则X小于临界值;然后根据X的值所在的区间进行相应的计算。
应该注意的是,除法计算中可能产生余数,商和余数应该分开存储,若乘方运算结果大于255,高
八位与低八位应分开存储
2.24进制时钟
本程序须可以构建两部分循环。
首先构建一个三重循环实现“一秒延时”,循环体利用
NOP指令(单字节指令,1卩s)经多次循环达到延时一秒的效果。
再利用已经构建好的“一秒延时”部分,设计计时系统的三重循环,秒(0-59)、分(0-59)、时(0-23)。
秒和分计
60次,小时计24次,但,是从0开始计,所以在分、秒达到59,小时达到23时,下一次应该为零。
程序运行时修改的值可以实现暂停和继续的功能
3.资源分配
1.分段函数
根据题目的条件,首先,设该8位无符号数为30H,把片外地址4000H分配给它,把
片外地址4001H和4002H分配给经分段函数计算得到的结果Y。
按位取反计算结果存于
4001H单元,而除法计算结果的商与余数和乘方计算中结果的高、低八位分开存储于4001H-4002H单元。
用寄存器A,B来存放在乘除运算中所得的中间结果。
2.二十四进制时钟
工作寄存器R0R1、R2分别用于秒、分、时循环次数的设定,R3R4分别用于分与时
的循环计数,R5-R7用于“一秒延时”中三重循环的循环次数设定。
秒、分、时数值分别由P2、P1、P0端口输出。
4.流程图
c仔1
1.分段函数
ORG0000H
LJMPMAIN
ORG0100H
;将8位无符号数赋给A
;定义数据指针
;将X存于片外RAM
MAIN:
MOVA,#29H
MOVDPTR,#4000H
MOVX@DPTR,A
KIND1:
CJNEA,#14H,KIND2
;将A与14H比较,若不等于14H,跳转至KIND2
OUT1:
CPLA
;对A中内容取反
;将进位位清零
CLRC
MOVDPTR,#4001H
;定义数据指针
MOVX@DPTR,A
;将计算结果存于片外地址4001H
SJMPDONE
KIND2:
JNCKIND3
;判断进位位CY是否为0,若为0,跳转至KIND3
SJMPOUT1
;否则跳转至OUT1
KIND3:
CLRC
;将进位位清零
CJNEA,#28H,KIND4
;将A中内容与28H比较,若不等于28H,跳转至KIND4
OUT2:
MOVB,A
;将A中内容赋给B
MULAB
;计算X的平方,将结果高八位存于B,低八位存于A
MOVDPTR,#4001H
;定义数据指针
MOVX@DPTR,A
;将结果低八位存于片外地址4001H
INCDPTR
;数据指针加一
MOVA,B
;将B中内容赋给A
MOVX@DPTR,A
;将结果高八位存于片外地址4002H
SJMPDONE
KIND4:
JNCOUT2
;判断进位位是否为0,若为0,跳转至OUT2
SJMPOUT3
;否则跳转至OUT3
OUT3:
MOVB,#02H
DIVAB
;计算X/2,将商存于A,余数存于B
MOVDPTR,#4001H
;定义数据指针
MOVX@DPTR,A
;将商存于片外地址4001H
INCDPTR
;数据指针加1
MOVA,B
MOVX@DPTR,A
;将余数存于片外地址4002H
SJMPDONE
DONE:
SJMP$
END
2.24小时时钟
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVR0,#00H
MOVP0,#00H;时钟位清零
MOVP1,#00H;分钟位清零
MOVP2,#00H;秒钟位清零
START:
JB,START;为低电平开始计数,高电平停止计数
MOVR2,P2;P2的值存入R2
CJNER2,#60H,DEL;秒钟达到60继续,不足60跳转
MOVP2,#00H;秒钟清零
MOVA,P1
ADDA,#01H;分钟位加1
DAA;分钟位改为BCD码
MOVP1,A
MOVR1,P1;P1的值存入寄存器R1
CJNER1,#60H,DE;分钟达到60继续,不足60跳转
MOVP1,#00H;分钟清零
MOVA,R0
ADDA,#01H;时钟位加1
DAA;时钟位改为BCD码
MOVR0,A
MOVP0,A
CJNER0,#24H,DE;时钟达到24继续,不足24跳转
MOVP0,#00H;时钟位清零
MOVR0,#00H
DEL:
LOOP1:
LOOP2:
MOVR7,#24;延时程序
MOVR6,#61
MOVR5,#170
LOOP3:
NOP
NOP
DJNZR5,LOOP3
DJNZR6,LOOP2
DJNZR7,LOOP1
MOVA,P2
ADDA,#01H;秒钟位加1
DAA
MOVP2,A
SJMPSTART
END
六.程序测试方法与结果、软件性能分析
1.分段函数
改变X的值,分别在不同的X值时运行程序,结果如下截图
(1)X=29H
Ptojeet^Jarkspace▼
K*gisMr
ViLllt
rO
OkOO
:
““”rl
OmOO
r2
OkOO
「3
OkOD
r4
OkOO
『5
OkOO
r6
OmOO
rT
0x00
-Sys
呂
0s06
b
OhOB
s>
OnOT
£p_mo
OkOT
dptr
Ok4002
FC$
cm.,.
stales
62
sec
0.00.
田-…1D£呼
0^04
T
g|K(Q)
*0|零
X-gxQ^gwi:
W
gg
OD
og
QD
DQ
g
QQ
□Q
QQ
QQ
QQ
OQ
go
ao
QD
皿
go
00
QQ
g
QQ
QO
口暫
0Q
00Q\
J46gg饲鸽
00
OQ
OQ
OQ
OQ
00
00
OQ
90
00
CO
QO
QO
OQ
oa
00
00
OQ
00
00
00
00
QQ
00
CD
OQ
00
0
X;0x0^067;
DO
3C
03
OD
00
00
阴
□0
□0
00
CO
DO
・「
00
oa
ao
OD
O0
00
oo
00
□0
00
□0
DO
CO
30
00
r
xm萱QCMds
DO
00
00
oo
re
GO
00
GO
00
00
CO
DO
DO
00
aa
ao
00
00
CIO
00
00
00
00
00
CO
QG
ao
a
ert
nn
iftiM
*、j-
AA
H"iA
KR
mA
眄H%
j*%m
■"■HR
ain
K耳
i"*ih
f
KsK
■na
.■hH
•n
#1匚沪Memory=4
如*注|初训D02
X^Ok口匚耳
g€
DO
00
口。
go
gg
□o
DO
□a
■O'3
OD
03
oo
CD
30
□q
D3
QO
OU
DO
00
口口
30
00
go
oo
30
DO
口亡
£:
0x004059:
05
co
no
50
CIO
00
02
DO
00
00
A
0-:
30
OC
1:
53
00
0:
&0
no
00
03
■3
00
DC
K9OaDDDQ
CQ
口。
g
00
00
QG
00
OD
OD
oc
90
oa
g
g
OD
□0
oa
ao
DQ
CQ
00
as
QO
00
QG
KaQaDOiOWi
aa
DQ
OQ
DO
00
g□0
00
QD
ao
00
皿
QO
口D
□Q
m
□a
DD
K
OD
□D
QQ
QO
DO
OQ
DO
00
as
DO
□Q
oa
nm
m
nFk
nn
run
nr
m
i~■rt
m
rtin
rnn
nn
nn-fc
jn^i
rsn
fi
'L、i~\
nn
JTii~1
rm
cn
iTfcm
nr"i
nn
MpnOfV*AMlw章吟
*wv*]
(2)X=21H
Rm理istar
|"aly|A
-Re养
rO
OjcOO
rl
QxOD
r2
OkOO
r3
OkED
r4
0x00
r5
DM
rG
0x00
■"S'■
OkCO
-Sys
'j
OkOI
.b
0x01
OjcOT
汕“…邓」血
0x0T
dptr
0x4002
PC$
C:
OKx..
69
0.00.