实验名称:实验6:中断技术
姓名:袁鹏 学号:2013011780 实验班号:33 机器号:42
一.实验目的
1. 了解中断原理,包括对中断源、中断向量、中断类型号、中断程序以及中断响应过程的 理解;
2. 掌握单片机 C 语言中断程序设计方法 二.实验任务
1. 中断响应过程的理解 代码: #include \#include \ void delay( ) //延时函数 { unsigned int j; for (j=0;j<0xffff;j++); } void Blink( ) //LED闪 { P2OUT &=~BIT3; delay(); P2OUT |= BIT3; delay(); } void Buzz( ) //蜂鸣响 { unsigned int i; for (i=0;i<3;i++) { P2OUT &=~BIT4; delay(); P2OUT|= BIT4; delay(); }; } void main ( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 //设置引脚P2.4、P2.3输出,P2.3连接LED,P2.4连接蜂鸣器 P2SEL &=~(BIT3+BIT4); P2SEL2 &=~(BIT3+BIT4); P2OUT|=(BIT3+BIT4); P2DIR|=(BIT3+BIT4); //设置端口P1.1允许中断 P1SEL &= BIT1; P1SEL2 &= BIT1; P1OUT |=BIT1;; P1REN |=BIT1; P1DIR &=~BIT1; P1IES |= BIT1; P1IFG &=~BIT1; P1IE |= BIT1; _EINT(); //总中断允许 for (;;) //主循环 { Blink(); }; } #pragma vector=PORT1_VECTOR __interrupt void port_ISR( ) { Buzz(); P1IFG &=~BIT1; } 该程序的功能是让P2.3控制的LED灯不断闪烁,当P1.1控制的开关发出中断申请时,控制P2.4控制的蜂鸣器响三声,然后继续让LED灯闪烁。
1) 从程序如何判断用的是哪个中断源?其中断类型号是多少?将实验板上某一按键与 该中断源对应的引脚相连,运行程序,操作按键,观察现象。
程序是通过判断中断标志位来确定是哪个中断源,P1.1的中断类型号是2。运程序时P2.3控制的LED4灯不断闪烁,当P1.1控制的开关发出中断申请时,控制P2.4控制的蜂鸣器响三声,然后继续让LED4灯闪烁。
2)main 函数中无调用函数Buzz 的语句,函数Buzz 如何能被执行?何时会被执行? 据 此描述中断响应过程。
函数Buzz是在函数名为port_ISR的中断程序中,因此当P1.1发出中断申请时,函数port_ISR就会被执行,执行完毕后再返回main函数中继续执行main函数。 3) 如果port_int 函数中不清分中断标志P1IFG 的后果是什么?
如果不清分中断标志P1IFG的话就会一直相应中断,然后port_ISR函数就会一直被执行,蜂鸣器不断的响。
4) 如果L6_int.c 中的PORT1_VECTOR 改为PORT2_VECTOR, 其他不变,程序执行
的后果是什么?为什么?(可在主程序入口处加一断点,运行程序,看现象,分析原因) 将PORT1_VECTOR 改为PORT2_VECTOR后当按下K2键给P1.1发出中断申请后蜂鸣器不会鸣叫,因为没有正确的设置中断向量,未能将中断程序的入口地址放入FFE0+偏址的中断向量表中,因此程序不能正确的进行中断响应。
思考:当在主程序入口处加一断点时可以发现,由于已经设置了中断的端口,因此当有中断信号发出时,程序仍然会去执行中断子程,但由于中断向量没有正确设置,PC指针会跑飞,然后机器会自动复位,重新执行程序。
5)如果中断源采用的是P1.5, 按键用K7,请设计连线,修改L6_int.c 程序完成以中断
方式响应K7 的操作。
只需要将P1.1允许中断改为P1.5允许中断即可,同时将P1.5用跳线块与K7相连,具体代码如下: #include \#include \void delay( ) //延时函数 { unsigned int j; for (j=0;j<0xffff;j++); } void Blink( ) //LED闪 { P2OUT &=~BIT3; delay(); P2OUT |= BIT3; delay(); } void Buzz( ) //蜂鸣响 { unsigned int i; for (i=0;i<3;i++) { P2OUT &=~BIT4; delay(); P2OUT|= BIT4; delay(); }; } void main ( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 //设置引脚P2.4、P2.3输出,P2.3连接LED,P2.4连接蜂鸣器 P2SEL &=~(BIT3+BIT4); P2SEL2 &=~(BIT3+BIT4); P2OUT|=(BIT3+BIT4); P2DIR|=(BIT3+BIT4); //设置端口P1.5允许中断 P1SEL &= BIT5; P1SEL2 &= BIT5; P1OUT |=BIT5;; P1REN |=BIT5; P1DIR &=~BIT5; P1IES |= BIT5; P1IFG &=~BIT5; P1IE |= BIT5; _EINT(); //总中断允许 for (;;) //主循环 { Blink(); }; } #pragma vector=PORT1_VECTOR __interrupt void port_ISR( ) { Buzz(); P1IFG &=~BIT5; } 6)(选做)去掉L6_int.c 程序最后的那条无限循环语句,看看有什么现象?可以去掉吗? 去掉程序最后的无限循环语句后LED4灯不在闪烁,但当P1.1发出中断申请后蜂鸣器还是会响三下,因此如果仅仅实现中断功能,则可以去掉无限循环语句。 2. 中断程序编程练习
将P1.4、P1.5与K5、K6相连,作为中断源,将P1.7、P2.0、P2.6与BUZZ、LED1、LED7相连,每当K5键按下,使蜂鸣器鸣叫,每当K6键按下,控制二极管闪烁,实现功能。具体代码如下:
#include \#include \ void delay( ) //延时函数 { unsigned int j; for (j=0;j<0xffff;j++); } void Blink( ) //LED闪 { P2OUT &=~BIT6; delay(); P2OUT |= BIT6; delay(); } void Blink2( ) //LED闪 { unsigned int i; for(i=0;i<3;i++) { P2OUT &=~BIT0; delay(); P2OUT |= BIT0; delay(); } } void Buzz( ) //蜂鸣响 { P1OUT &=~BIT7; delay(); P1OUT|= BIT7; delay(); } void main ( void ) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 _DINT(); //关闭总中断允许 P1IE &=~(BIT4+BIT5); //关闭分中断允许 //设置引脚P2.0、P2.6、P1.7输出,P2.0连接LED1,P2.6连接LED7,P1.7连接蜂鸣器 P2SEL &=~(BIT0+BIT6); P2SEL2 &=~(BIT0+BIT6); P1SEL &=~BIT7; P2SEL2 &=~BIT7; P2OUT|=(BIT0+BIT6); P2DIR|=(BIT0+BIT6); P1OUT|=BIT7; P1DIR|=BIT7; //设置端口P1.4、P1.5允许中断 P1SEL &=~(BIT4+BIT5); P1SEL2 &=~(BIT4+BIT5); P1OUT |=(BIT4+BIT5);; P1REN |=(BIT4+BIT5); P1DIR &=~(BIT4+BIT5); P1IES |=(BIT4+BIT5); P1IFG &=~(BIT4+BIT5); P1IE |=(BIT4+BIT5); _EINT(); //总中断允许 for (;;) //主循环 { Blink(); }; } #pragma vector=PORT1_VECTOR __interrupt void port_ISR( ) { if((P1IFG&BIT4)!=0) {
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库清华大学计算机硬件技术基础实验报告在线全文阅读。
相关推荐: