微机实验报告实验二.doc_第1页
微机实验报告实验二.doc_第2页
微机实验报告实验二.doc_第3页
微机实验报告实验二.doc_第4页
微机实验报告实验二.doc_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微机实验报告 实验名称 实验二 分支与循环程序设计实验 指导教师 专业班级 姓名 学号 联系电话 1、 任务要求1. 设有8bits符号数x存于外部ram单元,按以下方式计算后的结果y也存于外部ram单元,请按要求编写程序。 2. 利用51系列单片机设计一个24小时制电子时钟,电子时钟的时、分、秒数值分别通过p0、p1、p2端口输出(以压缩bcd码的形式)。p3.0为低电平时开始计时,为高电平时停止计时。设计1s延时子程序(延时误差小于10us,晶振频率12mhz)。提高部分(选做): a. 实现4位十进制加、减1计数,千位、百位由p1口输出;十位、个位由p2口输出。利用p3.7状态选择加、减计数方式。b. 利用p3口低四位状态控制开始和停止计数,控制方式自定。 二、设计思路1.任务一:先判断输入自变量的正负性。如果是负数则直接归到取反区间;如果是正数,则与20,40进行大小比较,即和20,40分别做减法,然后根据比较结果归到各个区间。2. 任务二:先设置好进位计数器数值,再将r3、r4和p0、p1、p2、p3清零。开始先判断控制位p3.0是否为0,当p3.0=1时原地踏步重复判断,当p3.0=0时开始计时。计时开始,进行秒钟b计数,计数后r0减一,每次计数完成用bcd码子程序转换,然后由p2输出秒钟,判断计数后r0值是否为0,若r0的值不为0,就跳转回秒钟继续计数,若r0的值为0,就把r0和p2进行清零后,开始分钟计数部分。同理,每次分钟计数完之后用bcd码子程序转换,然后由p1输出分钟,判断计数后r1值是否为0,若r1的值不为0,就跳转回秒钟继续计数,若r1的值为0,就把r1和p1清零后开始时钟计数部分。时钟计数完后同样用bcd码子程序转换,然后判断计数后的r2的值是否为0,若不为0,就跳转回秒钟计数,若r2为0,就吧r2和p0清零后直接跳出计数部分,从判断p3.0部分再开始.每两次计数输出之间穿插一个1s的延时程序。就可以达到时钟的功能。3. 加、减1计数程序:将十进制数的千位数和百位数存于p1,将十进制数的十位数和个位数存放于p2,p3.0至p3.3全为低电平则开始计数,否则停止计数。p3.7为选择加一或减一的计数方式的控制位,p3.7为0时加1计数,p3.7为1时减1计数;r3,r4,r5为计数中的延时程序指定循环次数。 三、资源分配1.任务一: 2000h: 输入的自变量 2001h:若x20,则为取反结果 若20x40,则为x除以二的整数部分 若x40,则为平方后的低八位 2002h:若20x40,则为x除以二的余数部分 若x40,则为平方后的高八位 dptr:数据指针2. 任务二: r0、r1、r2:秒、分、时进位计数器b:秒钟计数r3:分钟计数r4:时钟计数p0:时钟输出p1:分钟输出p2:秒钟输出p3:电子钟开关控制 3.加、减1计数程序:p1:十进制数的千位数和百位数p2:十进制数的十位数和个位数p3.0-p3.3:是否进行计数的4个控制位p3.7:选择加一或减一的计数方式的控制位r3,r4,r5:计数中的延时程序指定循环次数。 四、流程图 1.任务一:2. 任务二:3.加、减1计数程序:5、 源代码 1.任务一:file name: 1.asmdescription: 多分支程序设计date: 2014/10/8designed by: lxqsource used: 2000h: 输入的自变量 2001h:若x20,则为取反结果 若20x40,则为x除以二的整数部分 若x40,则为平方后的低八位 2002h:若20x40,则为x除以二的余数部分 若x40,则为平方后的高八位 dptr:数据指针 org 0000h ljmp main org 0100hmain:mov a,#25 ;输入自变量 mov b,#00h ;b清零 mov dptr,#2000h ;设置数据指针movx dptr,a ;存入片外ramjnb acc.7,comp1 ;判断符号位sjmp loop1 ;负数则取反comp1: cjne a,#20,comp2 ;a20h时跳转到comp2sjmp loop1 ;a=20h时取反comp2: jc loop1 ;cy=1时取反cjne a,#40,comp3 ;a40h时跳转到comp3sjmp loop3 ;a=40h时平方comp3: jc loop2 ;cy=1时除以二 sjmp loop3 ;cy=0时平方loop1: cpl a ;取反操作 sjmp store ;跳转存储指令loop2: mov b,#02hdiv ab ;除以二 sjmp store ;跳转存储指令loop3: mov b,a mul ab ;平方 sjmp store ;跳转存储指令store: inc dptr ;设置数据指针 movx dptr,a inc dptr mov a,b movx dptr,a ;高位和低位依次存入片外ram sjmp $ ;原地踏步end2.任务二: org 0000h ljmp main org 0100hmain: mov r0,#60 mov r1,#60 mov r2,#24 ;时针、分针、秒针计数器赋初值 mov r3,#0h mov r4,#0h ;时钟、分钟赋初值 mov p0,#0h mov p1,#0h mov p2,#0h mov p3,#0hstart: jb p3.0,stop ;若p3.0为高电平则停止计时 acall dly mov a,b add a,#01h da a mov b,a ;秒钟计时 mov p2,a ;输出秒钟 djnz r0,start ;r0-1,不等于零则跳到start继续循环 mov b,#0h mov p2,#0h mov a,r3 add a,#01h da a mov r3,a ;分钟计时 mov p1,a ;输出分钟 mov r0,#60 ;计数器归位 djnz r1,start ;r1-1,不等于零则跳到start继续循环 mov b,#0h mov r3,#0h mov p1,#0h mov a,r4 add a,#01h da a mov r4,a ;时钟计时 mov p0,a ;输出时钟 mov r1,#60 ;计数器归位 djnz r2,start ;r2-1,不等于零则跳到start继续循环 sjmp mainstop: sjmp $ ;原地踏步dly: mov r5,#46 ;延时1s,误差1us ;延时1s,误差1usdly:delay: mov 72h,#100loop3: mov 71h,#100loop1: mov 70h,#47loop0: djnz 70h,loop0 nop djnz 71h,loop1 mov 70h,#46loop2: djnz 70h,loop2 nop djnz 72h,loop3 mov 70h,#48loop4: djnz 70h,loop4retend 3.加、减1计数程序: org 0000h ljmp main org 0100hmain:mov p1,#00h ;p1端口置零mov p2,#00h;p2端口置零mov p3,#7fh ;p3端口置#7fhstart:jb p3.0,startjb p3.1,startjb p3.2,startjb p3.3,start;判断是否开始计时ljmp delay;跳转到延时子程序delay:mov r7,#24del1: mov r6,#61del2: mov r5,#170del3: nop nop djnz r5,del3 djnz r6,del2 djnz r7,del1;延时1秒jb p3.7 ,down;p3.7为0时,加1计数;p3.7为1时,减1计数ljmp updown:clr c mov a,p2subb a,#01hmov r1,aanl a,#0fhmov r7,amov a,r1anl a,#0f0hmov r1,amova,p1subb a,#00hmov r0,aanla,#0fhmov r6,amov a,r0anl a,#0f0hmov r0,acjne r7,#0fh,loop1mov r7,#09hloop1:cjne r1,#0f0h,loop2mov r1,#90hloop2:cjne r6,#0fh,loop3mov r6,#09hloop3:cjne r0,#0f0h,loop4mov r0,#90hloop4:mov a,r1add a,r7da amov p2,amov a,r0add a,r6da a mov p1,a ljmp start ;减1计数子程序up: mov a,p2add a,#01hda amov p2,amov a,p1addc a,#00hda amov p1,aljmp start ;加1计数子程序end6、 程序测试方法与结果1.任务一:取x=10,则结果应为f5h,即(2000h)=0ah,(2001h)=f5h,(2002h)=00h。编译结果如下:取x=25,则结果应为0ch,即(2000h)=19h,(2001h)=0ch,(2002h)=01h。编译结果如下:取x=60,则结果应为3600,即(2000h)=3ch,(2001h)=10h,(2002h)=0eh。编译结果如下:综上可得程序功能正确,运行成功。2. 任务二: p3.0设为低电平,设置断点,开始计数,秒种到60时,分钟进位,秒钟清零:重新设置断点,开始计数,分种到60时,时钟进位,分钟清零:重新设置断点,开始计数,时种到24时,全部清零,重新判断p3.0。p3.0置一则计时停止:测试完成,程序运行顺利,功能正确。3.加、减1计数程序:p3.0至p3.3全为低电平时开始计数,p3.7为0时加1计数(0加1为1):p3.7为0时减1计数(0减一则为9999):功能运行正常。七、心得与体会 通过这次的微机实验,我加深了对于分支程序设计的理解,并通过自己设计程序框图和代码,提高了我的编程和调试代码的能力。在编程过程中,由于分支众多,我常常遇到思路不清晰的情况,这就要求我们在动手写代码之前一定要先想好代码的整体架构,设计好流程图,再跟着流程图的思路一步步编写代码,才能保持思路清晰,减少错漏。总之,要学会编写复杂的程序,看书是远远不够的,还需要我们多动手,多实际操作,去解决一些实际遇到的问题,这样才能提高我们的编程水平。 思考题1 实现多分支结构程序的主要方法有哪些?举例说明。答:实现多项分支的主要方法是采用分支表法,常用的分支表法的组成有三种形式: 分支地址表:它是由各个分支程序的首地址组成的一个线性表,每个首地址占连续的两个字节。如: mov dptr,#bratab ;取表首地址 mov a,r3 add a,r3 ;ar3*2 jnc nadd inc dph ;r3*2的进位加到dph nadd: mov r4,a ;暂存a movc a,a+dptr ;取分支地址高8位 xch a,r4 inc a movc a,a+dptr ;取分支地址低8位 mov dpl,a ;分支地址低8位送dpl mov dph,r4 ;分支地址高8位送dph clr a jmp a+dptr ;转相应分支程序bratab: dw subr0 ;分支地址表 dw subr1 dw subr7 转移指令表:它是由转移指令组成的一个分支表,其各转移指令的目标地址即为各分支程序的首地址。若采用短转移指令,则每条指令占两个字节;若采用长转移指令,则每条指令占三个字节。如: mov dptr,#jmptab ;取表首地址 mov a,r3 add a,r3 ;ar32 jnc nadd inc dph ;有进位加到dph nadd: jmp a+dptr ;转相应分支程序jmptab: ajmp subr0 ;转移指令表 ajmp subr1 ajmp subr7 地址偏移量表:各分支程序首地址与地址偏移量表的标号之差(为一个字节)称为地址偏移量,有这些地址偏移量组成地址偏移量表。如: mov dptr,#diatab ;取表首地址 mov a,r3 ;表的序号数送a movc a,a+dptr ;查表 jmp a+dptr ;转相应分支程序distab: db subr0-distab ;地址偏移量表 db subr1-distab db subr7-distabsubr0: subr1: 2 在编程上,十进制加1计数器与十六进制加1计数器的区别是什么?怎样用十

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论