微机原理实验7实验8清华大学微机原理讲义

上传人:今*** 文档编号:105845492 上传时间:2019-10-13 格式:DOCX 页数:25 大小:4.13MB
返回 下载 相关 举报
微机原理实验7实验8清华大学微机原理讲义_第1页
第1页 / 共25页
微机原理实验7实验8清华大学微机原理讲义_第2页
第2页 / 共25页
微机原理实验7实验8清华大学微机原理讲义_第3页
第3页 / 共25页
微机原理实验7实验8清华大学微机原理讲义_第4页
第4页 / 共25页
微机原理实验7实验8清华大学微机原理讲义_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《微机原理实验7实验8清华大学微机原理讲义》由会员分享,可在线阅读,更多相关《微机原理实验7实验8清华大学微机原理讲义(25页珍藏版)》请在金锄头文库上搜索。

1、微机原理实验7实验8合辑 洪玉希 2011012706前言:本报告记录了实验7实验8的任务实现和知识理解,详细介绍了如何实现任务7任务8的各项任务。实验原理图在本实验报告最后附上,本文档跟源程序一起打包上传,请过目。实验7.中断技术一、 实验目的1. 了解中断原理,包括对中断源,中断向量,中断类型号,中断程序,以及中断过程的理解。2. 掌握汇编语言中断程序设计方法。3. 掌握C语言项目上机过程和了解C语言程序结构。4. (选作)掌握C语言中断程序设计方法。二、 实验任务1. 中断过程的理解阅读下面汇编语言中断程序L7_P1_int.s43,说明程序执行的流程和实现功能。上机实践,回答下面问题。

2、了解汇编语言编写中断程序的方法。1) 阅读程序L7_P1_int.s43,从程序中判断用的是哪个中断源?其中断类型号是多少?答:程序中有如下句子从以上两个图可以知道,此程序打开了p1.0p1.7的中断源,中断类型号是4。在此基础上打开了p1.1的中断使能所以系统接受p1.1的中断请求。2) 在L7_P1_int.s43,无call调用语句,中断程序如何能被执行?何时会被执行?答:因为系统打开了p1.1的中断使能,中断总控位,所以当CPU接收到有效的中断请求后,将暂停正在运行的程序,并自动转去执行相应实现中断源(p1.1)请求功能的程序即,中断子程。当CPU执行完中断子程中的返回指令后,CPU又

3、返回到被中断的程序继续运行。3) 在L7_P1_int.s43,如果中断子程中不清分中断标志P1IFG的后果会是什么?答:如果中断子程不清分中断标志P1IFG系统将一直接受到中断请求,总控位是开的,所以CPU将一直执行中断子程。4) 如果L7_P1_int.s43中的port1_vector改为port2_vector,其他不变,程序执行的后果是什么?为什么?答:按下key1无反应。因为程序只打开了port2的中断源,按下key1当然没有反应。并且即使此时port2上有高电平也不能发生中断,因为程序中port2的中断使能没有打开。5) 如果去掉L7_P1_int.s43程序最后的那条无限循环语

4、句,程序执行的流程是怎样的?为什么?程序执行完所有语句后会从0x0000开始执行,俗称“跑飞”。如下因为执行完所有语句后程序没有指定PC去哪儿执行指令,所以自动选择了0x0执行。6) 如果中断源采用的是p2.2按键用key7,请设计连线,修改L7_P1_int.s43程序完成以中断方式响应key7的操作。答:将key7与p2.2的端口相连。由于p2端口本来是用于输出led灯的,所以为了避免混淆,如果条件允许可以将LED端口全部连接到PORT1端口。这时在程序上做如下修改注意:1) 查看msp430x14x.h文件末尾处有关中断向量偏址的符号定义。 2) 为了便于了解程序执行流程,可以在中断子程

5、入口处(即标号intP1处)设置一个断电,然后运行程序F5,观察按下键和不按下键时程序执行的流程。答:不按下键时,程序不经过断点,一直在跑,按下键后程序停在断点处,表示程序进入中断程序。3) 观察是否有按键抖动现象,思考有的话,如何消除?答: 有按键抖动现象。可以采用软件防抖来消除。具体做法是当p2.22. 用汇编语言编写中断程序在实验板上用跳线将按键key5,key6分别与单片机的p1.4,p1.5相连,编程以中断方式处理按键key5和key6的请求,当key5上有一个下降沿信号时,实验板上的蜂鸣器发出一警报声;当key6上有一个上升沿信号时,实验板上的发光二极管L1闪3次。任务实现:本题在

6、L7_P1_int.s43上稍加修改即可。对主程序修改如下。程序名:asm.s43将p2,p6的16个端口均设为输出,同时打开p1.4,p1.5的中断功能。 上两张截图为中断子程。可以看到,当程序进入中断子程先判断是哪一个键按下,利用P1IFG来判断,如果是key5进入key5,如果是key6进入key6。Key5的功能是LED灯L1闪三次,key6的功能是蜂鸣器发出一声警报。在程序执行的最后要清零相对应的IFG标志信号,然后返回主程序。思考:如果用长导线将按键key5,key6分别连接在p2.2和p2.3上,如何修改程序以实现上述中断响应?可否将按键key5,key6分别连接在p5.1和p5

7、.2上,用中断方式来完成任务2?为什么?答:可以将按键key5,key6分别连接在p2.2和p2.3上。用跳线将key5,key6分别连接在p2.2和p2.3。并修改程序如下:程序:asmxiugai.s43至此就是可完成任务目标。不能将按键key5,key6分别连接在p5.1和p5.2上。因为在中断向量表里没有安排p5.1和p5.2的中断向量,系统不支持,所以不能。3. C语言项目上机过程和C语言程序的结构学习1) 建立C语言程序项目的方法:2) 读懂LC_testc.c,掌握C语言下对I/O口的寄存器进行操作。如上图。对端口的赋值用“=”,for(;)表示无限循环。3) 在debug状态下

8、,用view/disassembly查看程序LC_TEST_C的反汇编代码,了解MCU的C程序语句与汇编语句的对应关系。 这是截图。可以看到C语言和汇编语言的对应关系。C语言中的赋值就是寄存器操作mov指令等。4) 打开io430.h文件和io430x14x.h文件该文件由#include语句包含在LC_test_c.c文件中,了解io430xlxx.h文件中与MCU有关的IO寄存器以及这些IO寄存器中各有效位的位域符号定义,以编程使用。Io430.h文件通常在EW430安装目录的子目录下。如图。此为LC_test_c.c的io430xlxx.h文件。由于关于IO口的定义的篇幅非常大。在此只截

9、取一个完整的片段进行解读。_no_init volatile union unsigned char P1OUT; /* Port 1 Output */ struct unsigned char P0 : 1; /* */ unsigned char P1 : 1; /* */ unsigned char P2 : 1; /* */ unsigned char P3 : 1; /* */ unsigned char P4 : 1; /* */ unsigned char P5 : 1; /* */ unsigned char P6 : 1; /* */ unsigned char P7 :

10、1; /* */ P1OUT_bit; 0x0021;端口寄存器的定义: C语言重要的特点之一,是具有构造数据类型的能力,它可在字符型(char),整型(int)等简单数据类型的基础上,按层次产生各种构造数据类型,方便编程操作如数组,指针,结构和共同体类型。 为方便操作MCU的外围功能模块中的IO寄存器在io430x14x.h等头文件中采用union共同体,struct结构等对各IO端口及其各位按照名称进行定义。端口寄存器中的数据,1.可以按字节操作:P1SEL=0;P1OUT=0;P1IFG=0;2.也可以按位域操作:P1SEL_BIT.P1=0;P1OUT_BIT.P1=0;P1IFG_B

11、IT.P1=0; (5) C语言中程序中断程序设计 参看“补充讲义C语言的中断程序设计”,阅读下面C语言中断程序L8_P1_int。1) 如果程序中没有#pragma vector=port1_vector的后果?这就相当于汇编语言中没有ORG 0FFE0h+PORT1_VECTOR 显然,没有给出中断向量,系统是不会执行中断程序的。2) 在C语言中操作符“=”和“=”有什么不同?“=”是判断符号,如if (P1IFG_bit.P4=1) key5(); P1IFG_bit.P4=0; If语句后面的括号内,就是一个判断语句,P1IFG_bit.P4是否等于1。如果是,执行接下来的语句。而“=

12、”是赋值的意思,如for(;) /无限循环 P2OUT=P2OUT; /将端口2的值取反后输出 for (i=0;i0xffff;i+); /延时;中,P2OUT=P2OUT指将P2OUT取反赋值给P2OUT。(6) 完成本次实验任务2的同样功能。 对实验任务2 的汇编语言进行修改即可。下面给出程序和注释。这里着重注意几点1 所有子程序要在开头声明。2 书写要按照C语言的方式书写。#include io430.h#include intrinsics.hvoid key5();void key6();void delay();int main( void ) / Stop watchdog t

13、imer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; _disable_interrupt();/_DINT(); P2SEL=0;/置P2为基本I/O功能 P2OUT=0xFF;/置P2输出初值 P2DIR=0xFF;/置P2为输出 P6SEL=0;/置P2为基本I/O功能 P6OUT=0xFF;/置P2输出初值 P6DIR=0xFF;/置P2为输出 P1SEL_bit.P4=0;/设置p1.4为基本I/O功能 P1DIR_bit.P4=0; /设置P1.4为输入 P1IES_bit.P4=1; /设置p1.4为上升沿输入 P1IFG_bit.P4=0; /清零标志位 P1IE_bit.P4=1; /打开p1.4中断使能 P1SEL_bit.P5=0;/设置p1.5为基本I/O功能 P1DIR_bit.P5=0; /设置P1.5为输入 P1IES_bit.P5=1; /设置p1.5为下升沿输入 P1IFG_bit.P5=0; /清零标志位 P1IE_bit.P5=1; /打开p1.5中断使能 _enable_interrupt();/_EINT(); while(1) ;/#pragma vector=4*2

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号