分支实验.docx
《分支实验.docx》由会员分享,可在线阅读,更多相关《分支实验.docx(15页珍藏版)》请在冰豆网上搜索。
分支实验
《微机实验》报告
实验名称分支程序设计实验
专业班级姓名学号序号
联系方式
一、任务要求
1.设有8bits符号数X存于外部RAM单元,按以下方式计算后的结果Y也存于外部RAM单元,请按要求编写程序。
2.利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。
P3.0为低电平时开始计时,为高电平时停止计时。
a.实现4位十进制加、减1计数,千位、百位由P1口输出;十位、个位由P2口输出。
利用P3.7状态选择加、减计数方式。
b.利用P3口低四位状态控制开始和停止计数,控制方式自定。
二、设计思路
1.分段函数程序:
将R1设置为标志位。
从外部RAM取出X,先判断X与40的大小,再判断X与20的大小。
当X大于等于40时,标志位设置为11H;X小于等于20时,标志位设置为01H;20再对标志位进行判断,当标志位等于10H时,跳转至分支语句执行X/2的操作;当标志位大于10H时,跳转至分支语句执行求X非的操作;当标志位小于10H时,跳转至分支语句执行求X平方的操作。
最后将X计算结果赋给片外RAM。
2.时钟程序:
编写延时子程序,延时为1S。
每调用一次延时程序,秒加一,调整为BCD码后由P2口输出。
累加到60秒时,秒清0,分加一,调整为BCD码后由P1口输出。
累加到60分时,分清0,小时加一,调整为BCD码后由P0口输出。
到达24小时以后,程序重新初始化。
3.实现4位十进制加、减1计数程序:
利用P3.7状态判断加一还是减一。
若P3.7为1,则加一,否则减一。
在加法程序中,每次完成加一后对当前位进行BCD码调整,并判断是否进位。
若进位则高位加一,低位置零,同时对高位进行BCD码调整。
当最高位溢出时,重置四位数。
在减法程序中,每次完成减一后先判断是否借位,借位则高位减一,低位置99。
再对低位进行BCD码调整。
若减到0,则对四位数重置。
最后将四位数由P1,P2输出。
4.P3口低四位控制计数:
当P3口低四位中D3,D2位为0,而D1,D0不全为0时,做加一运算,当P3口低四位中D1,D0位为0,而D3,D2不全为0时,做减一运算,其他情况不加也不减。
在加法程序中,每次完成加一后对当前位进行BCD码调整,并判断是否进位。
若进位则高位加一,低位置零,同时对高位进行BCD码调整。
当最高位溢出时,重置四位数。
在减法程序中,每次完成减一后先判断是否借位,借位则高位减一,低位置99。
再对低位进行BCD码调整。
若减到0,则对四位数重置。
最后将四位数由P1,P2输出。
三、资源分配
1.分段函数程序:
1000H:
x
1001H:
Y高位,余数,取非结果
1002H:
Y低位,商
R1:
标志位
2.时钟程序:
R0:
时
R1:
分
R2:
秒
R3至R7:
计时循环
3.实现4位十进制加、减1计数程序:
R1:
千位,百位
R2:
十位,个位
30H:
暂存R2
R4:
暂存A
P3.7=0,减,P3.7=1,加
4.P3口低四位控制计数:
R1:
千位,百位
R2:
十位,个位
30H:
暂存R2
R4:
暂存A
R5:
标志位
四、流程图
1.分段函数程序:
开始
取出X值
Y
FLAG=11HH
X=40?
N
Y
X>40?
FLAG=11H
N
Y
FLAG=01H
X=20?
Y
FLAG=01H
N
X<20?
N
FLAG=10H
FLAG=10H?
X/2
Y
N
N
Y
X取非
X取平方
CY=0?
结果存入1001H,1002H
结束
2.时钟程序:
开始
N
P3.0=0?
Y
调用延时子程序
R2加一(秒)
P2口输出
N
R2=3CH?
R1加一(分),R2=0
Y
N
P1口输出
R1=3CH?
P0口输出
Y
R0加一(时),R1=0
N
Y
R0=0
R0=18H?
3.实现4位十进制加、减1计数程序:
开始
P3.7=1?
Y
N
N
R2减一
R2加一
是否出现借位?
对R2做BCD码调整
Y
R2是否有进位?
N
R2=99H,R1减一
Y
调整R2
Y
R1=0?
R1加一
对R1做BCD码调整
Y
N
R1是否溢出?
N
P1,P2输出四位数
结束
开始
4.P3口低四位控制计数:
屏蔽P3口高四位
Y
P3口低四位是否等于3
FLAG=01H
N
N
FLAG=01H
CY=0?
Y
Y
FLAG=11H
P3口低四位是否等于12
N
Y
P3口低四位是否等于8
FLAG=11H
N
Y
P3口低四位是否等于4
FLAG=11H
N
FLAG=10H
FLAG=10H?
N
CY=1?
Y
N
R2加一
R2减一
R1加一
R2是否有进位?
对R2做BCD码调整
R1是否溢出?
对R1做BCD码调整
R1=0?
调整R2
R2=99H,R1减一
是否出现借位?
N
Y
Y
Y
Y
N
N
N
P1,P2口输出四位数
结束
五、源代码(含文件头说明、资源使用说明、语句行注释)
1.分段函数程序:
;1000H:
x
;1001H:
Y高位,余数,取非结果
;1002H:
Y低位,商
;R1:
标志位
FLAGEQUR1
ORG0000H
LJMPMAIN
ORG0200H
MAIN:
MOVDPTR,#1000H;X存于1000H
MOVA,#25H
MOVX@DPTR,A;给X赋值
MOVXA,@DPTR;获取X
CJNEA,#40H,NOFORT;判断X是否为40
MOVFLAG,#11H;若X=40,标志位置11H
SJMPCALCULAT;跳转至计算步骤
NOFORT:
JCJUDGETW;X不为40,判断是否大于40
MOVFLAG,#11H;若X>40,标志位置11H
SJMPCALCULAT;跳转至计算步骤
JUDGETW:
CJNEA,#20H,LESSTW;若X小于40,判断是否等于20
MOVFLAG,#01H;若X=20,标志位置01H
SJMPCALCULAT;跳转至计算步骤
LESSTW:
JNCMID;若X不为20,判断是否小于20
MOVFLAG,#01H;若小于20,标志位置01H
SJMPCALCULAT;跳转至计算步骤
MID:
MOVFLAG,#10H;若20CALCULAT:
CJNEFLAG,#10H,CASE1;标志位与10H比较
MOVB,#2
DIVAB;若为10H,X/2
SJMPSTORE1;跳转至存储步骤
CASE1:
JNCCASE2;判断标志位是否小于10H
CPLA;若小于10H,A取非
SJMPSTORE2;跳转至存储步骤
CASE2:
MOVB,A;若标志位大于10H,X取平方
MULAB
STORE1:
MOVR2,A;对乘除法存储
MOVA,B
INCDPTR
MOVX@DPTR,A;计算结果Y高位,余数存于1001H
MOVA,R2
STORE2:
INCDPTR
MOVX@DPTR,A;取非,低位,商存于1002H
SJMP$;踏步
END
2.时钟程序:
;R0:
时
;R1:
分
;R2:
秒
;R3-R7:
计时循环
ORG0000H
LJMPMAIN
ORG0200H
MAIN:
MOVR0,#0;初始化R0
MOVR1,#0;初始化R1
MOVR2,#0;初始化R2
MOVP0,#0;初始化P0
MOVP1,#0;初始化P1
MOVP2,#0;初始化P2
STAY:
JBP3.0,STAY;判断P3.0电平
SEC:
LCALLDELAY;调用计时函数
INCR2;秒加1
MOVP2,R2;P2口输出秒
CJNER2,#3CH,STAY;判断是否到60秒
MOVR2,#0;秒清0
INCR1;分加1
MOVP1,R1;P1口输出分
CJNER1,#3CH,STAY;判断是否到60分
MOVR2,#0;分清0
INCR0;小时加1
MOVP0,R0;P0口输出小时
CJNER0,#18H,STAY;判断是否到24小时
MOVR0,#0;小时清0
AJMPSTAY
DELAY:
MOVR7,#28H;延时5us
LOOP5:
MOVR6,#05H
NOP
NOP
LOOP4:
MOVR5,#05H
NOP
LOOP3:
MOVR4,#05H
NOP
LOOP2:
MOVR3,#41H
NOP
LOOP1:
NOP
DJNZR3,LOOP1
DJNZR4,LOOP2
DJNZR5,LOOP3
DJNZR6,LOOP4
DJNZR7,LOOP5
RET
END
3.实现4位十进制加、减1计数程序:
;R1:
千位,百位
;R2:
十位,个位
;30H:
暂存R2
;R4:
暂存A
;P3.7=0,减,P3.7=1,加
ORG0000H
LJMPMAIN
ORG0200H
MAIN:
MOVA,#99H;四位数赋值
MOVR1,A
MOVA,#79H
MOVR2,A
JUDGE:
JBP3.7,ADDUP;若p3.7=1,加1;否则减1
DEDUCE:
DECR2;R2减1
CJNER2,#0FFH,ADJUST;判断R2是否借位
MOVR2,#99H;借位则置99
DECR1;R1减1
ADJUST:
MOV30H,R2;R2存于30H
MOVA,#0H;调整R2低位
ADDA,R2
DAA
MOVR4,A
CLRC
SUBBA,30H;判断是否调整
JZNADJ
MOVA,R4
SUBBA,#10H;若调整,则对R2高位减1,低位补4
ADDA,#04H
MOVR4,A
NADJ:
MOVA,R4
MOVR2,A
CJNER1,#0,CONTNUE;R1为0重置
SJMPMAIN
ADDUP:
INCR2;R2加1
MOVA,#0;调整R2
ADDA,R2
DAA
MOVR2,A
CJNER2,#00H,CONTNUE;判断是否进位
INCR1;进位则R1加1
MOVA,#0;调整R1
ADDA,R1
DAA
MOVR1,A
CJNER1,#00H,CONTNUE;若R1溢出
SJMPMAIN;重置
CONTNUE:
MOVP1,R1
MOVP2,R2
SJMPJUDGE
END
4.P3口低四位控制计数:
;R1:
千位,百位
;R2:
十位,个位
;30H:
暂存R2
;R4:
暂存A
;R5:
标志位
;若p3.0低二位不全为0且3,4位为0,则加1;低二位为0且3,4位不全为0,则减1;否则不改变
FLAGEQUR5
ORG0000H
LJMPMAIN
ORG0200H
MAIN:
MOVA,#99H;四位数赋值
MOVR1,A
MOVA,#09H
MOVR2,A
JUDGE1:
MOVA,P3
ANLA,#0FH;屏蔽P3高四位
CJNEA,#03H,COMP1;判断P3口值与3的关系
MOVFLAG,#01H;若等于3,则标志位置#01H
SJMPJUDGE2;跳转至标志位判断
COMP1:
JNCCOMP2;若小于3,标志位置#01H
MOVFLAG,#01H
SJMPJUDGE2;跳转至标志位判断
COMP2:
CJNEA,#0CH,COMP3;判断P3口值是否等于12
MOVFLAG,#11H;若相等,则标志位置11H
SJMPJUDGE2;跳转至标志位判断
COMP3:
CJNEA,#08H,COMP4;判断P3口值是否等于8
MOVFLAG,#11H;若相等,则标志位置11H
SJMPJUDGE2;跳转至标志位判断
COMP4:
CJNEA,#04H,REST;判断P3口值是否等于4
MOVFLAG,#11H;若相等,则标志位置11H
SJMPJUDGE2;跳转至标志位判断
REST:
MOVFLAG,#10H;其他情况则标志位置10H
JUDGE2:
CJNEFLAG,#10H,COMP5;判断标志位与10H关系,相等则不加也不减
SJMPCONTNUE
COMP5:
JCADDUP;若为01H,则进入加法,否则进入减法
DEDUCE:
DECR2;R2减1
CJNER2,#0FFH,ADJUST;判断R2是否借位
MOVR2,#99H;借位则置99
DECR1;R1减1
ADJUST:
MOV30H,R2;R2存于30H
MOVA,#0H;调整R2低位
ADDA,R2
DAA
MOVR4,A
CLRC
SUBBA,30H;判断是否调整
JZNADJ
MOVA,R4
SUBBA,#10H;若调整,则对R2高位减1,低位补4
ADDA,#04H
MOVR4,A
NADJ:
MOVA,R4
MOVR2,A
CJNER1,#0,CONTNUE;R1为0重置
SJMPMAIN
ADDUP:
INCR2;R2加1
MOVA,#0;调整R2
ADDA,R2
DAA
MOVR2,A
CJNER2,#00H,CONTNUE;判断是否进位
INCR1;进位则R1加1
MOVA,#0;调整R1
ADDA,R1
DAA
MOVR1,A
CJNER1,#00H,CONTNUE;若R1溢出
SJMPMAIN;重置
CONTNUE:
MOVP1,R1
MOVP2,R2
SJMPJUDGE1
END
六、程序测试方法与结果、软件性能分析
利用KeilC的单步调试与断点调试观察程序运行结果。
程序能够完成预期功能。
七、心得与体会
1)思考题:
1.实现多分支结构程序的主要方法有哪些?
举例说明。
答:
分支较少时,可以利用条件转移指令判断与临界值关系实现多分支结构。
如本实验内容1。
分支较多时,采用分支表实现多向分支。
例如:
根据R3的值控制8个分支程序。
可利用如下程序:
MOVDPTR,#JMPTAB
MOVA,R3
ADDA,R3
JNCNADD
INCDPH
NADD:
JMP@A+DPTR
JMPTAB:
AJMPSUBR0
AJMPSUBR1
…
AJMPSUBR7
2.在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?
怎样用十进制加法指令实现减1计数?
答:
十进制加一计数器在运算后需要调用BCD码调整程序对结果进行调整,而十六进制加一计数器则不用。
利用十进制加法指令实现减一计数:
设减数存放于R2中
MOVA,R2
ADDA,#0FFH
DAA
MOVR2,A
2)实验体会: