华科 微机实验报告2.docx
- 文档编号:6538435
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:15
- 大小:348.98KB
华科 微机实验报告2.docx
《华科 微机实验报告2.docx》由会员分享,可在线阅读,更多相关《华科 微机实验报告2.docx(15页珍藏版)》请在冰豆网上搜索。
华科微机实验报告2
实验名称
分支与循环程序设计实验
指导教师
专业班级姓名学号
联系电话
1、任务要求
1.设有8bits符号数X存于外部RAM单元,按以下方式计算后的结果Y也存于外部RAM单元,请按要求编写程序。
2.利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过P0、P1、P2端口输出(以压缩BCD码的形式)。
P3.0为低电平时开始计时,为高电平时停止计时。
设计1s延时子程序(延时误差小于10us,晶振频率12MHz)。
2、设计思路
1.分段函数设计
首先利用比较转移指令CJNE来判断X是否等于临界值20,40,若不等,再根据执行CJNE指令后的进位位CY的值来判断X与临界值的的大小关系,CY=0则X大于临界值,CY=1则X小于临界值;然后根据X的值所在的区间进行相应的计算。
除法计算中可能产生余数,商和余数应该分开存储,若乘方运算结果大于255,高八位与低八位应分开存储。
2.24进制时钟
首先构建一个三重循环实现“一秒延时”,再设计计时系统的三重循环,秒(0-59)、分(0-59)、时(0-23)。
秒和分计60次,小时计24次,分、秒达到59,小时达到23时,下一次应该为零。
程序运行时修改P3.0的值可以实现暂停和继续的功能。
3、资源分配
1.分段函数
外部寄存器DPTR用作数据指针,变量X的值存于片外RAM的3000H单元,计算结果存于片外RAM的3001H~3002H单元,按位取反计算结果存于3001H单元,而除法计算结果的商与余数和乘方计算中结果的高、低八位分别存储于3001H~3002H单元。
2.二十四小时制电子时钟
工作寄存器R0,R1,R2分别用于秒、分、时的循环计数,R3,R4,R5用作一秒延时的循环计数,秒、分、时数值分别由P0、P1、P2端口输出。
4、流程图
1.分段函数
2.二十四小时制电子时钟
5、源代码(含文件头说明、语句行注释)
1.分段函数
ORG0000H
LJMPMAIN
ORG0100H
MAIN:
MOVA,#29H;取数X
MOVDPTR,#3000H;设置数据指针
MOVX@DPTR,A;X存于片外RAM
CLRC;进位位清零
STEP1:
CJNEA,#14H,STEP2;将A与20比较,若不等于20,跳转至STEP2
Y1:
CPLA;A取反
MOVDPTR,#3001H;设置数据指针
MOVX@DPTR,A;将计算结果存于片外地址3001H
SJMPDONE
STEP2:
JNCSTEP3;判断CY是否为0,若为0,跳转至STEP3
SJMPY1;CY不为0则跳转至Y1
STEP3:
CLRC;进位位清零
CJNEA,#28H,STEP4;A中内容与40比较,若不等于40,跳转至STEP4
Y2:
MOVB,A;复制A
MULAB;X平方
MOVDPTR,#3001H;设置数据指针
MOVX@DPTR,A;结果低八位存于片外地址3001H
INCDPTR;数据指针加一
MOVA,B;将B中内容赋给A
MOVX@DPTR,A;结果高八位存于片外地址3002H
SJMPDONE
STEP4:
JNCY2;判断CY是否为0,若为0,跳转至Y2
SJMPY3;否则跳转至Y3
Y3:
MOVB,#02H
DIVAB;计算X/2
MOVDPTR,#3001H;设置数据指针
MOVX@DPTR,A;结果商存于片外地址3001H
INCDPTR;数据指针加1
MOVA,B;将B中内容赋给A
MOVX@DPTR,A;结果余数存于片外地址3002H
SJMPDONE
DONE:
SJMP$
END
2.二十四小时制电子时钟
ORG0000H
LJMPSTART
ORG0010H
START:
MOVSP,#40H;设置堆栈
MOVR0,#00H;R0,R1,R2清零
MOVR1,#00H
MOVR2,#00H
MOVP0,#00H;P0,P1,P2清零
MOVP1,#00H
MOVP2,#00H
PAUSE:
JBP3.0,PAUSE;设置暂停功能
SEC:
MOVA,R0;A←R0
MOVP0,A;秒数传至P0端口
ADDA,#01H;秒进位
DAA;A转BCD码
MOVR0,A;R0←A
ACALLOSEC;一秒延时
CJNEA,#60H,PAUSE;进位
MIN:
MOVR0,#00H;R0,P0清零
MOVP0,#00H
MOVA,R1;A←R1
ADDA,#01H;分进位
DAA;A转BCD码
MOVP1,A;分数传至P1端口
MOVR1,A;R1←A
CJNEA,#60H,PAUSE;进位
HOUR:
MOVP0,#00H;R1,P0,P1清零
MOVP1,#00H
MOVR1,#00H
MOVA,R2;A←R2
ADDA,#01H;时进位
DAA;A转BCD码
MOVP2,A;小时数传至P2端口
MOVR2,A;R2←A
CJNEA,#24H,PAUSE;判断0点
SJMPSTART;到0点重复
OSEC:
MOVR4,#46;一秒延时子程序
L3:
MOVR5,#152
L2:
MOVR3,#70
L1:
DJNZR3,L1
DJNZR5,L2
DJNZR4,L3
RET
END
6、程序测试方法与结果
1.分段函数
X取不同的值进行运算
(1)X=50
(2)X=30
(3)X=16
结果正确。
2.二十四小时制电子时钟
(1)运行一秒
误差25微秒
(2)运行一分钟
误差0.5毫秒
(3)运行一小时
误差0.03秒
(4)运行一天
误差0.7秒
综合来看程序正常。
七.思考题
一.实现多分支结构程序的主要方法有哪些?
举例说明。
1.转移地址表
JMPTAB:
AJMPTO1
AJMPTO2
AJMPTO3
1.分支地址表
BRATAB:
DWTO1
DWTO2
DWT03
2.地址偏移量表
DISTAB:
DBTO1-DISTAB
DBTO2-DISTAB
DBTO3-DISTAB
4.利用条件转移指令实现,如DJNZ,JNC等等
二.在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?
怎样用十进制加法指令实现减1计数?
答:
十进制加1计数器需要先判断该为上是否为9,是9则加一变0进位,否则直接加一;十六进制加1计数器可以直接用INC加一。
用十进制加法指令实现减1计数可以用ADD语句加99H,再用DA语句进行十进制修正。
8.提高部分
双向计数
资源分配:
P3.7为1时加计数,为0时减计数,P3的底四位全为1时开始计数
P1口输出千位、百位,P2口输出十位、个位
R5,R6,R7用作一秒延时的循环计数
ORG0000H
LJMPMAIN
ORG0010H
MAIN:
MOVP3,#00H;P1,P2,P3清零
MOVP2,#00H
MOVP1,#00H
WAIT:
ACALLOSEC;延时1s
MOVA,P3
ANLA,#0FH
CJNEA,#0FH,WAIT;P3低四位全为1则开始计数
JBP3.7,PLUS;P3.7为1进行加1计数
LJMPMINUS;P3.7为0进行减1计数
PLUS:
CLRC;清进位
MOVA,P2
ADDA,#01H;加1
DAA;转BCD码
MOVP2,A
MOVA,P1
ADDCA,#00H;P1加上P2的进位
DAA;转BCD码
MOVP1,A
AJMPWAIT
MINUS:
MOVA,P2
CJNEA,#0,MINUS1;P2不为0时,P2减1
MOVP2,#99H;P2为0时,向百位借位,减一为99H
MOVA,P1
CJNEA,#0,MINUS2;发生借位,P1不为0时,P1减一
MOVP1,#99H;P1为0时,减一为99H
AJMPWAIT
MINUS1:
;十位个位减一
ADDA,#99H
DAA;转BCD码
MOVP2,A
AJMPWAIT
MINUS2:
;千位百位减一
ADDA,#99H
DAA;转BCD码
MOVP1,A
AJMPWAIT
OSEC:
MOVR5,#46;延时一秒子程序
L3:
MOVR6,#152
L2:
MOVR7,#70
L1:
DJNZR7,L1
DJNZR6,L2
DJNZR5,L3
RET
END
程序测试
加1
进位正常
减1
借位正常
程序运行正常
9.实验感想
通过编写分段函数程序,基本上掌握了实现分支与循环结构的基本方法,时钟程序编写困难很大,尤其单片机型号选择错误导致浪费了大量时间,一秒延时程序精度调试十分困难,结构也复杂了许多,做起来错误成堆,令人沮丧,不过最后好歹完成了。
本人承诺:
本报告内容真实,无伪造数据,无抄袭他人成果。
本人完全了解学校相关规定,如若违反,愿意承担其后果。
签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 华科 微机实验报告2 微机 实验 报告