微机原理与应用第四次实验报告.docx

上传人:jian****018 文档编号:8081023 上传时间:2020-03-27 格式:DOCX 页数:13 大小:49.68KB
返回 下载 相关 举报
微机原理与应用第四次实验报告.docx_第1页
第1页 / 共13页
微机原理与应用第四次实验报告.docx_第2页
第2页 / 共13页
微机原理与应用第四次实验报告.docx_第3页
第3页 / 共13页
点击查看更多>>
资源描述
微机原理与应用第四次实验报告实验6 汇编语言程序结构一、实验目的1.掌握汇编语言项目上机过程2.掌握汇编语言程序结构和常用伪操作3.掌握汇编语言程序设计和调试方法4.掌握MSP430F1xx基本I/O控制方法二、实验任务1 学习汇编指示性语句(可在simulator下完成) 在EWH8下新建项目Lab_6,编写下面程序L6_directives.s43(程序清单见后页,该程序只是为了学习指示性语句,程序本身并没有实现什么特定功能),利用project/remove移出模板文件test_asm.s43,点击project/add/files将L6_directives.s43添加到项目中。 1) 利用EW430下的view/memory查看DATA16_C段中定义的存储单元内容和地址,在memory/go的窗口内输入存储单元的符号(如number1)即可查看到该符号对应的存储单元地址和内容,注意在L6_directives.s43程序中使用这些存储单元的内容和地址的方法;利用view/disassembly反汇编程序,对比源程序,利用每条指令后的注释,学习其中用到的指示性操作,如:#define、SFB、SFE、SIZEOF、$等,并能在今后的程序设计中使用。 2) 在L6_directives.s43中,number4和number1分别被定义成了什么?二者有何不同?#number4和#number1这两个操作有何不同?MOV #number4, R7和MOV number4, R7执行的结果会相同吗?为什么? 3) 如图6-1所示,点击项目中的msp430x14x.h文件,了解该文件中用到的指示性语句,今后的实验中会用到该文件中的定义。 答2.编程控制实验板上发光二级管按下面4种规律循环显示1) 8个LED灯顺时针一个一个单独点亮,每次只有一个灯亮,其他灯灭; 2) 4个奇数号LED灯和4个偶数号LED灯交替点亮各一次; 3) 8个LED灯两两点亮, 顺序为LED1和8,LED2和7,LED3和6,LED4和5,每次只有两个灯亮,其他灯灭; 4) 8个LED灯全亮,全灭 注意:在灯的状态变化中,需留一定延时,以便视觉能感受到灯的亮灭,要求编写一延时子程,需要延时的地方,用CALL指令调用该子程。答对于4种亮灯模式,分别编写四个汇编程序来实现。基本思想是每隔一段时间对输出端口的寄存器赋值,要注意发光二极管是共阳接法,低电平能使其亮而高电平将其熄灭。延时功能通过延时子程实现,每次向输出端口赋新值之前先调用一次延时子程。程序如下:程序一Lab6_1.s43:#include msp430.h ;此句不能删除 ORG 0FFFEh;此句不能删除 DW main ;此句不能删除 ORG 1100H;此句不能删除main: MOV #0A00h, SP ;此句不能删除,初始化SP, MOV.W #5A80h, &0120h ;此句不能删除,关闭看门狗,避免定时自动复位 MOV.B #0xFF, &02Ah ;设置端口2为输出端口 next: MOV #0xFE,R12 MOV.B R12,&029h CALL #delay MOV #0xFD,R12 MOV.B #R12,&029h CALL #delay MOV #0xFB,R12 MOV.B #R12,&029h CALL #delay MOV #0xF7,R12 MOV.B #R12,&029h CALL #delay MOV #0xEF,R12 MOV.B #R12,&029h CALL #delay MOV #0xDF,R12 MOV.B #R12,&029h CALL #delay MOV #0xBF,R12 MOV.B #R12,&029h CALL #delay MOV #0x7F,R12 MOV.B #R12,&029h CALL #delay JMP nextdelay: ;延时子程 MOV #0xFFFF, R14ww: DEC R14 JNZ ww RETEND;此句不能删除程序向寄存器R12依次赋值使数码管显示相应的二进制数,然后再向端口2的端口寄存器赋相应的值。每次执行完赋值之后都调用一次延时子程delay,最后跳回第一个赋值语句。延时子程的原理是给一个寄存器赋值0xFFFF,然后再将它每次减1,并与0比较,不等于0则再次减1,直到等于0为止,才回到子程调用处执行下一条语句,利用MSP430执行每一条指令时的时钟周期,这样就实现了延时。通过改变给R14赋的初值可以改变延时长度,从而改变二极管闪烁的频率。程序二Lab6_2.s43:#include msp430.h ;此句不能删除 ORG 0FFFEh;此句不能删除 DW main ;此句不能删除 ORG 1100H;此句不能删除main: MOV #0A00h, SP ;此句不能删除,初始化SP, MOV.W #5A80h, &0120h ;此句不能删除,关闭看门狗,避免定时自动复位 MOV.B #0xFF, &02Ah ;设置端口2为输出端口next: MOV #0xAA, R12 MOV.B R12, &029h CALL #delay MOV #0x55, R12 MOV.B R12, &029h CALL #delay JMP nextdelay: ;延时子程 MOV #0xFFFF, R14ww: DEC R14 JNZ ww RETEND;此句不能删除程序二要求实现奇数二极管与偶数二极管的交替亮灭,实质就是分别给奇数二极管赋0和给偶数二极管赋0,实现方法与程序一相同。程序三Lab6_3.s43:#include msp430.h ;此句不能删除 ORG 0FFFEh;此句不能删除 DW main ;此句不能删除 ORG 1100H;此句不能删除main: MOV #0A00h, SP ;此句不能删除,初始化SP, MOV.W #5A80h, &0120h ;此句不能删除,关闭看门狗,避免定时自动复位 MOV.B #0xFF, &02Ah ;设置端口2为输出端口next: MOV #0x7E,R12 MOV.B R12, &029h CALL #delay MOV #0xBD,R12 MOV.B R12, &029h CALL #delay MOV #0xDB,R12 MOV.B R12, &029h CALL #delay MOV #0xE7,R12 MOV.B R12, &029h CALL #delay JMP nextdelay: ;延时子程 MOV #0xFFFF, R14ww: DEC R14 JNZ ww RETEND;此句不能删除程序三要求二极管两头从外向内亮起,实现方法与前两个程序相同,对于每种亮灭情况,分别向输出寄存器赋相应的值,每次赋值之后都调用延时子程。程序四Lab6_4:#include msp430.h ;此句不能删除 ORG 0FFFEh;此句不能删除 DW main ;此句不能删除 ORG 1100H;此句不能删除main: MOV #0A00h, SP ;此句不能删除,初始化SP, MOV.W #5A80h, &0120h ;此句不能删除,关闭看门狗,避免定时自动复位 MOV.B #0xFF, &02Ah ;设置端口2为输出端口 MOV #0, R12 ;赋R12初值为0 next: MOV.B R12, &029h ;将R12的数据通过端口2输出 CALL #delay ;调用延时子程 XOR #0xFF,R12 ;对R12求反,改变R12的值 JMP next delay: ;延时子程 MOV #0xFF, R14ww: DEC R14 JNZ ww RETEND;此句不能删除程序四要求二极管交替全亮全灭,实现方法与之前相同,由于只有两种亮灭模式,因此程序最为简短。3. 编程用实验板上的按键控制发光二极管的显示变化: 当分别按下实验板上的K1K4键时,LED灯对应按任务2中的4种LED亮灭规律变化。 答程序五Lab6_5:#include msp430.h ;此句不能删除 ORG 0FFFEh;此句不能删除 DW main ;此句不能删除 ORG 1100H;此句不能删除main: MOV #0A00h, SP ;此句不能删除,初始化SP, MOV.W #5A80h, &0120h ;此句不能删除,关闭看门狗,避免定时自动复位 MOV.B #0x00, &P1SEl MOV.B #0x00, &P1DIR ;设置端口1为输入端口 MOV.B #0x00, &P2SEL MOV.B #0xFF, &P2DIRnext: MOV.B &P1IN, R11 INV.B R11 BIT.B #0x01, R11 JNZ model1 BIT.B #0x02, R11 JNZ model2 BIT.B #0x04, R11 JNZ model3 BIT.B #0x08, R11 JNZ model4 JMP nextmodel1: MOV #0xFE,R12 MOV.B R12,&029h CALL #delay MOV #0xFD,R12 MOV.B #R12,&029h CALL #delay MOV #0xFB,R12 MOV.B #R12,&029h CALL #delay MOV #0xF7,R12 MOV.B #R12,&029h CALL #delay MOV #0xEF,R12 MOV.B #R12,&029h CALL #delay MOV #0xDF,R12 MOV.B #R12,&029h CALL #delay MOV #0xBF,R12 MOV.B #R12,&029h CALL #delay MOV #0x7F,R12 MOV.B #R12,&029h CALL #delay MOV.B &P1IN, R11 INV.B R11 BIT.B #0x0F, R11 JNZ next JMP model1model2: MOV #0xAA, R12 MOV.B R12, &029h CALL #delay MOV #0x55, R12 MOV.B R12, &029h CALL #delay MOV.B &P1IN, R11 INV.B R11 BIT.B #0x0F, R11 JNZ next JMP model2model3: MOV #0x7E,R12 MOV.B R12, &029h CALL #delay MOV #0xBD,R12 MOV.B R12, &029h CALL #delay MOV #0xDB,R12 MOV.B R12, &029h CALL #delay MOV #0xE7,R12 MOV.B R12, &029h CALL #delay MOV.B &P1IN, R11 INV.B R11 BIT.B #0x0F, R11 JNZ next JMP model3model4: MOV #0x00, R12 ;赋R12初值为0 MOV.B R12, &P2OUT ;将R12的数据通过端口2输出 CALL #delay ;调用延时子程 MOV #0xFF,R12 ;对R12求反,改变R12的值 MOV.B R12, &P2OUT CALL #delay MOV.B &P1IN, R11 INV.B R11 BIT.B #0x0F, R11 JNZ next JMP model4delay: ;延时子程 MOV #0xFFFF, R14ww: DEC R14 JNZ ww RETEND;此句不能删除程序五要求实现按键对发光二级管亮灭模式的控制。这就必须在程序中有一个对按键进行检测的部分,需要指定输入端口,并对输入端口输入的按键信息进行判断,然后再进入相应的二极管控制语句。此外,为了实现即时控制,应该随时都能对按键信息作出反应,而不是只能在系统最初运行时由按键控制,此后变得不可控。因此,程序可分为下面几个部分。next后语句标为next的那一行开始,是按键检测语句,从输入端口P1IN读入数据储存在寄存器R11中。然后将它取反,并用位测试命令BIT.B进行检测。取反的原因是BIT命令会按源操作数中所有值为1的位进行检测,只有当目的操作数中与源操作数中值为1的位对应的位的值全为0,才会给出0信号,否则只要对应的位中有一个为1,就会给出1信号。因此,由于按键按下给出0,不按下给出1。在有按键按下时只有一位是0。这样使用BIT命令就会总是给出1信号。因此需要将输入数值取反,这样,如果有键按下,那么相应的位就是1,会被BIT命令检测到。next之后的语句通过检测输入值确定亮灯模式,并跳转到相应的控制语句中去。此外,如果没有按键按下,则跳转回next继续对案件进行检测。因此,程序在运行时,如果不按下任何按键,发光二极管将不会亮灭,因为程序没有跳转到相应的二极管控制部分。model1-model4这四部分语句分别是四种亮灯模式的二极管控制语句,与前面四个程序中的基本相同,不同之处是为了在亮灯过程中仍能够对案件作出反应,在每种模式的最后有这样几行语句:MOV.B &P1IN, R11INV.B R11BIT.B #0x0F, R11JNZ nextJMP model1 ;以model1为例,其他模式类推这里再次读取P1IN的数值,取反后进行检测,只要K1-K4中有按键按下,就跳转到next进行按键检测。如果没有检测到按键按下,则跳回此显示模式的第一行,重复进行二极管的循环点亮。这就实现了在程序运行中进行按键检测并给出反应。不足之处是,按键检测语句在每种显示模式的最后一行,因此必须当显示进行一次循环后才能对按键起反应,最不利的情况下,按键要持续按住好几秒才能有反应,不满足即时性的要求。改进的方法,可以将按键检测语句写在延时模块中,每对寄存器R14进行一次减法,都检测一次按键,只要有按键按下,马上跳出延时模块回到next按键识别模块。这样对按键的反应就非常即时,实现起来也很容易。延时部分delay这一部分与之前几个程序基本相同,按上文所说,如果将按键检测语句放在这一部分,将可以实现按键的即时反应,不足之处是这样的延时模块可重用性不强。思考:程序开头的ORG 0xFFFE和DC16 init这两条语句的作用是什么?在这两条语句的行首加注释符“;”(相当于删除了这两条语句),即这两条语句不起作用,操作EW430左上角的reset,重新执行程序,出现什么后果,为什么?#include msp430.h NAME main ; module name PUBLIC main ; make the main label vissible ORG 0FFFEh DC16 init ; set reset vector to init label#define number4 0x90 RSEG DATA16_C ;常量数据段number1 DB 0x0a,0x0b,a,b;DB字节类型定义number2 DW 0x3412,0x7856,0xBC9A,0x0FDE ;DW字类型定义string DB One World, One Dream ;DB字符串定义stringend DB E RSEG DATA16_N ;未初始化数据段buffer DS8 stringend-string;字节型缓冲区定义 RSEG CSTACK ;堆栈段 RSEG CODE ;代码段init: MOV #SFE(CSTACK), SP ;SFE取段尾,初始化SP,此句不能删除main: MOV.W #5A80h,&WDTCTL ;关闭看门狗,此句不能删除 MOV #SIZEOF(CSTACK), R4 ;SIZEOF取段长度 MOV #SFB(DATA16_N),R6 ;SFB取段起始地址 MOV #number4, R7 ;define 定义的符号常量 MOV.B number1, R9 ;传送存储单元内容到寄存器中 MOV.w number2, R12 ;传送字变量内容到寄存器中 MOV.B R9, buffer ;将寄存器内容存到存储单元中 MOV #buffer, R11 ;取存储单元buffer地址 MOV.B R10, 0(R11) ;存储单元内容传送 MOV.B number1, 0(R11) ;存储单元内容传送 MOV #stringend-string,R13 ;利用两地址差值计算串长度 JMP $ ;汇编程序地址计算器$ END 答4. (选做,可在simulator下完成)在任务1的基础上,如图6-1打开lnk430F149.xcl文件(该文件是连接用扩展命令文件,通常在EW430安装目录D:Program FilesIAR SystemsEmbedded Workbench Evaluation 4.0的子目录430config下),了解EW430系统设置的DATA16_I,DATA16_Z,DATA16_N, CSTACK,DATA16_ID,DATA16_C,CODE等段的定义及其属性,请记录各符号段对应的存储器地址。其中-Z命令可参看讲义的介绍,或参看安装目录下子目录commomxlink.pdf第5154页介绍,该pdf文件可用EW430菜单栏上的/ help/Link and Library Tools Reference Guide打开。 回答:在任务1的L6_directives.s3中,DATA16_C、DATA16_N、CSTACK、CODE各段的首、末地址分别是多少?5. (选做,可在simulator下完成)了解汇编程序、连接程序功能 在任务1的基础上,重新设置项目属性,如图6-2,在Assembler/list中点击output list的选择框,使系统在汇编之后形成.lst文件,通过该文件了解汇编程序工作;如图6-3,在linker/list中点击generate linker listing的选择框,使系统在汇编之后形成.map文件, 通过该文件了解连接程序工作,并能了解程序中各段、各符号在存储器中的分配情况。按图6-1方式找到.lst和.map文件, 点击其中的.lst或.map文件即可打开。实验7 汇编语言程序设计一、实验目的1.掌握编写和调试汇编语言程序的方法2.学习使用子程序进行模块化编程3.了解简单电路的控制方法二、实验任务 1. 简单电子表的设计:用8个发光二极管以秒为单位显示时间值。 按下面步骤完成: 1) 编写一个延时子程, 延时时间长度1秒。 延时子程的时间可以通过1个I/O引脚输出方波,示波器测量该方波周期得到。 2)计数秒值,用8个发光二极管以二进制将时间显示出来,如图7-1,其中高两位显示分钟值,低6位显示秒值,每60秒,分钟值加1,例如图7-1 , 黑色表示灯亮,则显示的时间表示表示3分27秒。每计数到4分钟时,控制蜂鸣器发出一报警声。然后又从0开始重新计数。 图7-1 用发光二级管显示时间 3)增加按键控制功能:当按下KEY2键时清零;按下KEY3键时开始(或称继续)计时;按下KEY4键时暂停计时。答对于电子表的设计,基本思想是通过延时子程来确定二极管显示发生变化的时间间隔,整个单片机系统的工作基于晶体振荡器给出的时钟信号,因此凡是涉及到时间的数字系统设计,都不可避免要与时钟源打交道。基于晶振的时钟源保证了足够的精度,因此只需确定每秒对应的时钟周期个数即可。首先是延时子程,在实验6的多项任务中曾多次用到,直接照搬即可,但在第三个要求“增加按键控制功能”中,为了实现对按键的即时反应,必须在延时子程中增加按键检测语句,称为“延时按键检测子程”,下文中将会提及。在第二个要求“计数秒值”中,要求二极管的低六位以二进制数显示秒数,高两位也以二进制数显示分钟数。秒数可以通过直接对相应的值加1实现,每次加1都与59进行比较,到了59,下次就清零,同时给分钟数+1,由于分钟的情况只有0分钟、1分钟、2分钟、3分钟四种,因此可以仿照状态机的原理,设置minute0,minute1,minute2,minute3四种状态,每当秒数满了59,就跳转到下一个分钟数状态。以下是程序代码:#include msp430.h ORG 0FFFEh DW main ORG 1100Hmain: MOV #0A00h, SP MOV.W #5A80h, &WDTCTL MOV.B #0x00, &P1SEL MOV.B #0x00, &P1DIR MOV.B #0x00, &P2SEL MOV.B #0xFF, &P2DIR MOV.B #0x00, &P6SEL MOV.B #0xFF, &P6DIR MOV #0x0000, R12 MOV #0x0000, R13 MOV #0x0000, R14minute0: MOV.B #0xFF, &P6OUT INV.B R12 MOV.B R12, &P2OUT INV.B R12 ADD #0x01, R12 CALL #delay CMP.B #0x3B, R12 JNZ minute0 CALL #delay MOV #0x0040, R12 JMP minute1minute1: INV.B R12 MOV.B R12, &P2OUT INV.B R12 ADD #0x01, R12 CALL #delay CMP.B #0x7B, R12 JNZ minute1 CALL #delay MOV #0x0080, R12 JMP minute2minute2: INV.B R12 MOV.B R12, &P2OUT INV.B R12 ADD #0x01, R12 CALL #delay CMP.B #0xBB, R12 JNZ minute2 CALL #delay MOV #0x00C0, R12 JMP minute3minute3: INV.B R12 MOV.B R12, &P2OUT INV.B R12 ADD #0x01, R12 CALL #delay CMP.B #0xFB, R12 JNZ minute3 MOV.B #0xDF, &P6OUT CALL #delay MOV #0x0000, R12 JMP minute0 delay: MOV #0xFFFF,R14testkey2: MOV.B &P1IN, R4 INV.B R4 BIT.B #0x02, R4 JNZ clrtime JMP testkey4testkey4: MOV.B &P1IN, R4 INV.B R4 BIT.B #0x08, R4 JNZ testkey3 JMP gotestkey3: MOV.B &P1IN, R4 INV.B R4 BIT.B #0x04, R4 JNZ go JMP testkey3clrtime: MOV #0x0000, R12 RETgo: DEC R14 JNZ testkey2 RET END下面对代码进行解释,main程序段中对状态寄存器赋了初值,关闭了看门狗,并设置P1,P2,P6为基本IO端口,P1为输入端,P2,P6为输出端。并将寄存器R12,R13,R14清零。minute0- minute3程序段是主要的控制二极管亮灭的语句,minute0指此段程序运行时分钟数是0,开头对P6OUT赋了0xFF,是为了关闭蜂鸣器,因为在minute3的最后在进位时给蜂鸣器一个低电平信号,让它响了一秒钟,因此在回到minute0状态时要将其关闭。寄存器R12储存的是要显示的数值,先将其反相,然后再赋值给P2的输出寄存器P2OUT。反相的原因是二极管是低电平点亮的,而对R12的各种算术操作都是从0到1的,因此传给输出寄存器之前要进行反相。赋值完毕之后,同理应该再次反相以进行+1操作。注意反相操作应该使用指令INV.B。执行完+1操作后,调用延时子程delay。然后用CMP指令将R12与0x3B比较,若前者小于后者,则跳回minute0程序段开头,重复赋值加1的操作。若前者不小于后者,则再调用一个延时子程,然后给输出赋下一个状态的初值,再跳入下一条状态。Minute1-minute3状态与minute0基本相同,不同之处是minute3最后有向P6OUT赋值的语句,目的是给蜂鸣器一个低电平,并让它维持一秒钟,这样蜂鸣器就会在到达3分59秒时响1秒钟。之后回到minute0状态。delay程序段。这个程序段在本次实验中担负着程序的主要控制作用,并且负责响应按键信号。这个子程序又分为testkey2,testkey4,testkey3,clrtime,go这样几个程序段。首先,将一个立即数0xFFFF赋给寄存器R14,作为延时的基准。然后进入testkey2程序段,检测key2是否按下,由于key2按下代表着计数器清零,因此享有最高的优先级,必须优先进行检测和响应。(1)testkey2程序段中,首先将输入端口P1IN(接按键)的值赋给寄存器R4,然后将其反相,用位测试命令BIT.B与0x02(对应key2按下时的情况)进行测试,如果给出1,则跳转到clrtime程序段,若否,则跳转到testkey程序段。(2)testkey4程序段用来检测key4是否按下,key4的按下意味着计数的暂停,但不意味着程序的暂停,事实上,程序仍在运行,只不过进入了一个循环中,没有外界输入让程序跳出循环而已。仍然是将输入端口P1IN的值赋给寄存器R4,然后反相并用BIT.B进行检测,若发现key4按下,则跳转入程序段testkey3,若否,则跳转入程序段go。(3)testkey3用来检验在key4按下之后,key3是否按下,key3按下将解除技计数暂停状态,继续进行计数。因此,这个程序段发挥作用的前提条件是key4在之前按下过,跳转入本程序段的唯一入口是从testkey4程序段检测到key4按下后。在本程序段中,仍然是读入P1IN的值入寄存器R4中,然后进行检测,若发现key3按下了,则转入go程序段,若没有按下,则回到testkey3的第一行重复进行检验,直到key3按下为止。(4)clrtime用来清零储存时间的R12寄存器,进入这个程序段的唯一入口是在程序段testkey2中检测到了key2的按下。本程序段只需将0赋给R12,并用RET命令回到程序调用处就行了。(5)go是延时子程正常执行程序段,在一般条件下,即没有按键按下的情况下,先后经过testkey2,testkey4程序段,跳过testkey3,clrtime,就会到达go程序段。这一程序段中将R14减1,若不为0则跳转到testkey2,继续执行一系列的检测语句,最后又会到达go程序段。若减1后结果为0,则使用RET命令返回子程调用处,就实现了延时以及对按键的响应。优点和缺点:delay延时子程的上述编写的特点是反应快,任何时候按下按键都能马上得到响应,因为每执行一次减法都会进行一次按键检测,而时钟的频率是32768Hz,可以保证在人手按键的持续时间里,按键动作肯定能被检测到。缺点是代码重用度不高,这样的delay延时子程针对的是本次实验中对控制的要求设计的,不但复杂,而且不能用于别的场合。但是这也有一个优点,避免将比较复杂的按键检测部分放到控制亮灯的程序主体中,从而使得主程序清晰易读。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!