第二次微机实验报告详解.docx
- 文档编号:17230159
- 上传时间:2023-07-23
- 格式:DOCX
- 页数:16
- 大小:272.25KB
第二次微机实验报告详解.docx
《第二次微机实验报告详解.docx》由会员分享,可在线阅读,更多相关《第二次微机实验报告详解.docx(16页珍藏版)》请在冰点文库上搜索。
第二次微机实验报告详解
实验名称分支与循环程序设计实验成绩
一、任务要求
1.设有8bits符号数X存于外部RAM单元,按以下方式计算后的结果Y也存于外部RAM单元,请按要求编写完整程序。
2.利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。
P3.0为低电平时开始计时,为高电平时停止计时。
设计1s延时子程序(延时误差小于10us,晶振频率12MHz)。
提高部分(选做):
1)实现4位十进制加、减1计数,千位、百位由P1口输出;十位、个位由P2口输出。
利用P3.7状态选择加、减计数方式。
2)利用P3口低四位状态控制开始和停止计数,控制方式自定。
二、设计思路
1.第一题中只需通过CJNE判断x与10,64的大小关系,转向不同的分支程序,进行运算输出y。
由于本题中要进行x/2,则要考虑余数部分的处理,要将余数另存入一个单元。
2.第二题中延时1s子程序可以通过NOP指令以及几重循环嵌套实现。
当P3.0为低电平开始计时,先延时1s,秒数值+1,输出秒钟数值,判断秒是否满60s,满60s,则P2端口秒示数清零,且分钟数值加1;没满60s,则返回判断P3.0电平,再进入计时。
每次分钟数值+1后,输出分钟数值,再判断分钟是否满60min,满60min,则P1端口清零,且小时数值+1;没满60min,则返回判断P3.0电平,再计时。
每次时+1后,输出时,再判断时是否满24h,满24h,则P0端口清零,返回判断P3.0电平,再计时;若没满24h,则返回P3.0电平,再计时。
3.提高题延时1s子程序同上。
当P3.0低四位端口允许计数后,先进入延时,再判断P3.7指示进行加一还是减一计数。
若是加一计数,则先给十位个位+1,要注意考虑会不会产生进位,使千位百位+1;若是减一计数,则让十位个位减一,由于DA不能用于减法,则考虑加-1H的十进制补码99H,同样需要考虑十位个位借位的情况。
三、资源分配
程序一:
2400H存放数据
2401H,2402H存放结果
A,B用于计算
程序二:
R5,R6,R7存放循环次数
A用于计算
程序三:
R5,R6,R7存放循环次数
A用于计算
四、流程图
程序一:
程序二:
程序三:
五、源代码(含文件头说明、语句行注释)
程序一:
Description:
根据x的值计算相应y的值
Date:
2016/10/23
Designedby:
陈钰
Sourceused:
片外RAM2400H~2402H
A,B
ORG0000H
LJMPSTART
ORG0100H
START:
MOVDPTR,#2400H
MOVA,#09H
MOVX@DPTR,A;设定2400H中的数
MOVXA,@DPTR;从片外2400H中取数
JUDGE0:
JBACC.7,JS1;判断是否为负数,若是负数(小于10)则取反
CJNEA,#10,JUDGE1;比较A和10的大小,若等于10则取反,若不等于10转JUDGE1
JS1:
CPLA;取反
LJMPDONE
JUDGE1:
JCJS1;若C=1,则A小于10,转JS1,取反
CJNEA,#64,JUDGE2;A大于10,再比较A与64,不等于64转JUDGE2
JS2:
MOVB,A;令B=A
MULAB;求A平方,且积的高位存入B,低位存入A
LJMPDONE
JUDGE2:
JNCJS2;C=0,则A大于64,转JS2求平方;C=1,则A小于64,则将A除以2
MOVB,#2
DIVAB;X/2运算,A中存商,B中存余数
XCHA,B;交换A、B,即将余数存入A,商存入B
LJMPDONE
DONE:
INCDPTR
INCDPTR
MOVX@DPTR,A;将积的低位/除2后的小数部分/取反结果存入2402H
MOVDPTR,#2401H
MOVA,B
MOVX@DPTR,A;将积的高位/除2后的整数部分存入2402H
SJMP$
END
程序二:
Description:
24小时制电子时钟
Date:
2016/10/23
Designedby:
陈钰
Sourceused:
寄存器R5,R6,R7
A
I/O端口P0,P1,P2,P3
ORG0000H
LJMPSTART0
ORG0100H
START0:
MOVP0,#23H
MOVP1,#59H
MOVP2,#58H;设定电子钟初值
START:
JBP3.0,PAUSE;判断P3.0的值,为1时不计数,为0时开始计数
ACALLSECOND;进入延时1秒子程序
MOVA,P2;从P2读入秒数值
ADDA,#01H;+1s
DAA;转为BCD码
MOVP2,A;输出秒数值
CJNEA,#60H,START;判断是否满60s
MOVP2,#00H;满60s则秒清零
MINUTE:
MOVA,P1;读入分钟数值
ADDA,#01H;+1min
DAA
MOVP1,A;输出分钟数值
CJNEA,#60H,START;判断是否满60min
MOVP1,#00H;满60min则分钟清零
HOUR:
MOVA,P0;读入时数值
ADDA,#01H;+1h
DAA
MOVP0,A;输出时数值
CJNEA,#24H,START;判断是否满24h
MOVP0,#00H;满24h则时清零
LJMPSTART
PAUSE:
JBP3.0,PAUSE;判断P3.0的值,为1时则踏步
LJMPSTART
SECOND:
MOVR5,#10
D1:
MOVR6,#99
D2:
MOVR7,#251
D3:
NOP
NOP
DJNZR7,D3
NOP
NOP
NOP
DJNZR6,D2
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZR5,D1
RET;延时1s
END
程序三:
Description:
4位十进制加、减1计数
Date:
2016/10/23
Designedby:
陈钰
Sourceused:
寄存器R5,R6,R7
A,Cy
I/O端口P1,P2,P3
ORG0000H
LJMPSTART
ORG0100H
START:
JBP3.0,START
JBP3.1,START
JBP3.2,START
JBP3.3,START;判断是否开始计时
LJMPDELAY;跳转到延时子程序
DELAY:
MOVR5,#10
D1:
MOVR6,#99
D2:
MOVR7,#251
D3:
NOP
NOP
DJNZR7,D3
NOP
NOP
NOP
DJNZR6,D2
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZR5,D1;延时1秒
JBP3.7,DOWN;P3.7为0时,加1计数;P3.7为1时,减1计数
LJMPUP
DOWN:
CLRC;对C清零
MOVA,P2;将十位个位存入A
ADDA,#99H;BCD码减一相当于加99(-1补码)
DAA;将A转化为BCD码
MOVP2,A;将十位个位存入P2
JCDONE;C=1时,没有借位,高位不变;C=0时,向高位借位,高位减一
MOVA,P1;将千位百位存入A
ADDA,#99H;千位百位减一
DAA
MOVP1,A;将千位百位存入P1
DONE:
LJMPSTART;重新计数
UP:
CLRC
MOVA,P2
ADDA,#01H;十位个位加一
DAA
MOVP2,A;将十位个位存入P2
MOVA,P1
ADDCA,#00H;千位百位进位
DAA
MOVP1,A;将千位百位存入P1
LJMPSTART;重新计数
END
六、程序测试方法与结果
1.
(1)当(2400H)=8FH(负数)
(2)当(2400H)=09H(小于10)
(3)当(2400H)=3FH(大于10,小于64)
(4)当(2400H)=41H(大于64)
2.从23时59分58秒开始计时
延时1s:
计时:
3.
初值:
(1)1000减一计数
P3口状态:
减一:
(2)999加一计数
P3口状态:
加一:
思考题
1.实现多分支结构程序的主要方法有哪些?
举例说明。
(1)根据给定或计算的K值,选择相应的分支。
例:
(当x=0时,y取1;x>0时,y取1;x<0时,y取-1)
ORG1000H
VARDATA30H
FUNCDATA31H
MOVA,VAR;取x
JZCOMP;x=0,转COMP
JNBACC.7,POSI;x>0,转POSI
MOVA,#0FFH;x<0,则[-1]补=FFH→y
SJMPCOMP
POSI:
MOVA,#1;x>0,则1→y
COMP:
MOVFUNC,A
SJMP$
(2)分支地址表法:
它是由各个分支程序的首地址组成一个线性表,每个首地
址占连续的两个字节。
例:
(根据R3的值,控制转向8个分支程序)
MOVDPTR,#BRATAB;取表首地址
MOVA,R3
ADDA,R3;计算偏移量,A←R3*2
JNCNADD
INCDPH;R3*2进位加到DPH
NADD:
MOVR4,A;R4←A
MOVCA,@A+DPTR;取分支程序地址高8位
XCHA,R4
INCA;偏移量加1
MOVCA,@A+DPTR;取分支地址低8位
MOVDPL,A;分支地址低八位送DPL
MOVDPH,R4;分支地址高八位送DPL
CLRA
JMP@A+DPTR;转相应分支程序
BRATAB:
DWSUBR0;分支地址表
DWSUBR1
...
...
...
DWSUBR7
(3)转移指令表法
例:
(根据R3的值,控制转向8个分支程序)
MOVDPTR,#JMPTAB;取表首地址
MOVA,R3
ADDA,R3;A←R3*2
JNCNADD
INCDPH;进位加到DPH
NADD:
JMP@A+DPTR;转相应分支程序
JMPTAB:
AJMPSUBR0;转移指令表
AJMPSUBR1
...
...
...
AJMPSUBR7
(4)地址偏移量法
例:
(根据R3的值,控制转向8个分支程序)
MOVDPTR,#DISTAB;取表首地址
MOVA,R3;表的序号数送A
MOVCA,@A+DPTR;查表
JMP@A+DPTR;转相应分支程序
DISTAB:
DBSUBR0-DISTAB;地址偏移量表
DBSUBR1-DISTAB
...
...
...
SUBR0:
...
SUBR1:
...
2.在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?
怎样用十进制加法指令实现减1计数?
由于单片机是二进制的,十六进制加1计数器可以直接通过ADD/ADDC累加,但是无法直接进行十进制加1,只能在累加后通过指令DA将十六进制数转为十进制。
十进制加法实现减1,即加上01H的十进制补码99H,就可以实现减1。
本人承诺:
本报告内容真实,无伪造数据,无抄袭他人成果。
本人完全了解学校相关规定,如若违反,愿意承担其后果。
其它说明:
1.标题:
黑体,小四号
2.正文:
宋体,五号,1.5倍行距
3.流程图使用SmartDraw7或Visio软件绘制
4.不要加封面
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第二次 微机 实验 报告 详解
![提示](https://static.bingdoc.com/images/bang_tan.gif)