单片机实验报告分支程序设计实验Word文档下载推荐.docx
《单片机实验报告分支程序设计实验Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机实验报告分支程序设计实验Word文档下载推荐.docx(19页珍藏版)》请在冰豆网上搜索。
小于28H时,再与14H比较,大于14H时除二,否则取反。
地址存于片外0040H和0041H,低位存于0040H,高位存于0041H。
2.电子时钟
电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。
P3.0=0时开始计时。
秒满60进位,为了60秒时直接显示1分钟0秒,需先将A赋给P2,再加一,再与60H比较,看是否进位。
同理,分满60进位。
时满24重新开始,由于P0端口的位置错误,A与P0相互赋值时,需加中间变量RO。
3.双向计数
P3的底四位全为1时开始计数;
用P3.7状态控制加、减计数方式;
千位、百位由P1口输出,十位、个位由P2口输出(以压缩BCD码的形式)。
P3.7为1时加计数,需先将进位C清零,用ADD语句给P2加一,并用DA语句进行十进制修正;
再用ADDC语句给P1加一再十进制修正。
P3.7为0时减计数,需先判断P2是否为00H,不是00H则P2减一,是00H则给P2赋99H;
同理,再判断P1是否为00H,不是00H则P1减一,是00H则给P1赋99H。
延时可以用上面程序的延时1s子程序。
三、资源分配
初始数据X存于片外0010H;
取反和除二操作,结果都存于片外0040H中;
平方操作低位存于0040H中,高位存于0041H中。
2.电子时钟
P3.7为0时开始计数,为1时停止;
P2显示秒,P1显示分,P0显示时;
R3、R4、R5用于进行延时的装载循环次数。
3.双向计数
P1口显示千位、百,P2口显示十位、个位。
四、流程图
图1为分支计算程序流程图
图2为电子时钟程序流程图
图3为双向计数程序流程图
五、源代码(含文件头说明、资源使用说明、语句行注释)
1.分支计算
/*
Filename:
分支计算
Description:
8bits符号数X存于片外0010H,当X>
=40时,取平方,高位存于0040H,
低位存于片外0041H中;
当20<
X<
40时,除二,结果存于片外0040H中;
当X<
=20时,对X取反,结果存于片外0040H中。
Date:
2012.10.10
Designedby:
gxy
Sourceused:
0010H:
片外RAM存储的数X
0040H:
除二和取反结果、平方结果的平方的低八位
0041H:
平方结果的高八位
*/
ORG0000H
LJMPMAIN
ORG0010H
MAIN:
MOVDPTR,#0010H;
x存于片外0010H中
MOVXA,@DPTR
CLRC
CJNEA,#7FH,TO1;
与7FH比较,判断正负
SJMPPLACE1
TO1:
JNCPLACE3
CJNEA,#28H,TO2;
与28H比较
TO2:
JNCPLACE1
CJNEA,#14H,TO3;
与14H比较
SJMPPLACE3
TO3:
JNCPLACE2
SJMPPLACE3
PLACE1:
MOVB,A;
当x大于等于40时,取平方
MULAB
SJMPSAVE
PLACE2:
CLRC
RRCA;
当x大于20小于40时,通过右移实现X除以2
PLACE3:
CPLA;
当x小于等于20时,取反
SAVE:
MOVDPTR,#0040H
MOVX@DPTR,A;
低位存入片外0040H
MOVA,B
INCDPTR
MOVX@DPTR,A;
高位存入片外0041H
HERE:
SJMPHERE;
踏步
END
电子时钟
24小时电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。
P3.0为低电平时开始计时,为高电平时停止计时。
P2显示秒,P1显示分,P0显示时
P3.7为0时开始计数,为1时停止
R3、R4、R5:
进行延时装载循环次数
ORG0000H
LJMPSTART
START:
MOVSP,#40H
MOVP0,#00H
MOVP1,#00H
MOVP2,#00H
MOVR0,#00H
MOVR1,#00H
MOVR2,#00H
WAIT:
JBP3.0,WAIT;
P3.0为0时开始,为1时停止
SEC:
MOVA,R2;
秒
MOVP2,A;
将A值赋给P2端口
ADDA,#01H
DAA
MOVR2,A
ACALLDLY;
跳转到1s延时子程序
CJNEA,#60H,WAIT;
满60秒进位1分钟
MIN:
MOVR2,#00H;
分
MOVA,R1
ADDA,#01H
MOVP1,A;
将A值赋给P1端口
MOVR1,A
满60分钟进位1小时
HOUR:
MOVP2,#00H;
时
MOVP1,#00H
MOVA,R0
MOVP0,A;
将A值赋给P0端口
MOVR0,A
CJNEA,#24H,WAIT;
判断是否满24小时
SJMPSTART;
满24小时,重新开始计时
DLY:
MOVR4,#46;
延时1s,误差1us
L3:
MOVR5,#152
L1:
MOVR3,#70
L2:
DJNZR3,L2
DJNZR5,L1
DJNZR4,L3
RET
END
3.双向计数
/*
双向计数
4位十进制加、减1计数,千位、百位由P1口输出;
P3.7为1时加计数,为0时减计数。
P3的底四位全为1时开始计数。
P3.7为1时加计数,为0时减计数
P3的底四位全为1时开始计数
P1口输出千位、百位
P2口输出十位、个位由
*/
LJMPMAIN
MOVP3,#00H
MOVP2,#00H
MOVP1,#00H
ACALLDLY;
延时1s
MOVA,P3
ANLA,#0FH
CJNEA,#0FH,WAIT;
P3低四位全为1则开始计数
JBP3.7,INCREACE;
P3.7为1进行加计数
LJMPDECREACE;
P3.7为0进行减计数
INCREACE:
CLRC
MOVA,P2
ADDA,#01H
DAA;
P2十进制修正修正
MOVP2,A
MOVA,P1
ADDCA,#00H;
P1加上P2的进位
P1十进制修正修正
MOVP1,A
AJMPWAIT
DECREACE:
MOVA,P2
CJNEA,#0,DECREACE_1;
P2不为0时,P2减1
MOVP2,#99H;
P2为0时,向百位借位,减一为99H
MOVA,P1
CJNEA,#0,DECREACE_2;
由于借位,P1不为0时,P1减一
MOVP1,#99H;
P1为0时,减一为99H
AJMPWAIT
DECREACE_1:
;
十位个位减一
ADDA,#99H
DAA
MOVP2,A
DECREACE_2:
千位百位减一
ADDA,#99H
DAA
MOVP1,A
MOVR6,#70
DJNZR6,L2
END
六、程序测试方法与结果、软件性能分析
1.分支计算
程序运行测试:
如图所示,在片外0010H中给X赋值7FH,运行结果在片外0040H和0041中显示,为013F
7FH取平方为3F01H,所以X执行取平方操作,正确。
在Register中
A和B都为3FH,因为执行代码
MOVB,A
MULAB
DPTR最后地址为0041H
与存储地址相符
分支功能测试:
X为7FH时,取平方,预期结果3F01
X为07H时,取反,预期结果
FB
X为15H时,除二,预期结果
0A
X为27H时,除二,预期结果
13
X为28H时,取平方,预期结果0640
X为14H时,取反,预期结果
EB
X为F9H时,取反,预期结果
06
X存于片外0010H中,取反和除二操作,结果都存于片外0040H中,平方操作低位存于0040H中,高位存于0041H中。
所得结果均符合分支计算的预期结果,而且在7FH、28H、14H这三个转折点计算结果也正确。
ProgramSize:
data=8.0xdata=0code=48
所以本程序性能良好,运行正常。
总体运行测试:
端口显示的是6分21秒,实际精确运行时间为381.00312500s,相差0.003125s
1s延迟子程序测试:
断点设置如下
两断点间运行时间为0.99999900s,说明1s延迟子程序误差为1us。
60秒时直接显示1分钟0秒测试:
由图可知,由00:
00:
59直接变为00:
01:
00,符合要求。
时钟误差测试:
如上图,运行一分钟,误差为0.0005s
如上图,运行一小时,误差为0.029422s
如上图,运行24小时,误差为0.705901s
data=8.0xdata=0code=81
程序稍加改进,还可以添加计天,甚至计月的功能
加法测试:
P3.7=1
如上图所示,从4799到4800,两端口间进位正常
如上图所示,从9999到0000再到0001,加法进位正常
减法测试:
P3.7=0
如上图,从0000到9999,减一借位正常
如上图,从9600到9599,减一,两端口间借位正常
data=8.0xdata=0code=86
七、思考题
1.实现多分支结构程序的主要方法有哪些?
举例说明。