单片机中断技术实验报告Word下载.docx
《单片机中断技术实验报告Word下载.docx》由会员分享,可在线阅读,更多相关《单片机中断技术实验报告Word下载.docx(36页珍藏版)》请在冰点文库上搜索。
3)如果port_int函数中不清分中断标志P1IFG的后果是什么?
中断将一直重复进行下去;
4)如果L4_int.c中的PORT1_VECTOR改为PORT2_VECTOR,其他
5)
6)
7)
P1端口的操作改为对P2端口操作。
具体程序见附录程序2之思考题。
3.数字示波器的使用
1)将信号源的波形在示波器上显示出来,掌握测量周期、频率、峰峰值的方法;
2)用孔孔导线将实验板的地信号与示波器的地信号相连,测量实验板上的Vcc电源信
号是否正常。
1)
a.信号源的峰峰值为3.20V;
b.周期为1.000ms;
c.频率为1.000kHz.
2)经测量,Vcc=3.64V,正常
4.测试上电复位系统的ACLK、和SMCLK时钟频率
编程输出单片机上电复位后的ACLK、和SMCLK时钟,用示波器测量其频率,并记录下来。
思考:
上电复位后,CPU工作的时钟信号MCLK频率值是多少?
经分析
1 本程序需要置引脚P1.0、P1.4分别输出ACLK、SMCLK;
2 需要确认外部晶振连上;
3 具体程序见附录程序5测试程序。
4 测得f(ACLK)=32.79kHz,f(SMCLK)=1.044MHz.
思考题
上电复位后,通过观察寄存器,发现BCSCTL2寄存器上SELM位为00,SELS位为则0,说明MCLK与SMCLK均由DCO振荡器控制,所以MCLK的频率与SMCLK相同,也为1.044MHz。
5.掌握基本时钟模块的编程控制
参看附录A实验板原理图,用跳线将JP8中的插针信号接到晶振32.768Khz侧,使晶振
与单片机的P2.6和P2.7相连。
编程控制基本时钟模块,设置ACLK分别为下面时钟频
率,并通过P1.0输出ACLK,用示波器观察:
1)ACLK=4096Hz;
(时钟源外部晶振,32768Hz/8)
2)ACLK=3KHz;
(时钟源VLOCLK,12KHz/4)
可否编程在引脚P2.0上输出ACLK?
为什么?
a.1)中,应使单片机接外部晶振,并使ACLK的输出为8分频;
具体程序见附录程序5之1)
b.2)中,应通过BCSCTL3寄存器选择时钟源VLOCLK,并使其输出为4分频,具体程序见附录程序5之2)
不能在引脚P2.0上输出ACLK,因为,各引脚的特殊功能是由单片机结构所决定的,P2.0引脚不具有输出辅助时钟的功能.
6.DCO出厂校验值的频率检测
1)利用出厂校验值,编程使DCO分别为1MHz、8MHz、12MHz、16MHz,通过P1.4
输出,用示波器测量实际值。
答:
经分析知
1 P1.4输出的是SMCLK;
2 1MHz、8MHz、12MHz、16MHz的情况类似,此处仅以1MHz为例,具体程序见附录程序6
3 测得真实值分别为1.002MHz、7.752MHz、12.08MHz、15.94MHz。
7.利用输出的时钟信号做中断源,实现定时功能
将任务3中P1.0输出的3KHzACLK时钟信号,作为P1.5的中断申请信号,用导线将
P1.5与P1.0相连即可,在中断子程中设置一个计数变量,计数中断子程被执行的次数,
中断子程每被执行3000次表示一秒时间到。
利用该定时功能,将8个发光二级管设计
成一个秒表,显示秒值,每秒改变一次8个发光二级管的显示。
根据分析可知
a.需要在实验5之2)的基础上进行编程;
b.须用跳线板将P2的引脚与LED灯相连;
c.具体程序见附录程序7
如果要每隔10秒蜂鸣器响一声,如何在任务5的基础上编程实现?
将P1.7与蜂鸣器相连,增加一个延时函数以及每10秒操作一次P1.7上电位;
具体程序见附录程序7之思考题
三、实验选做任务
1.中断响应的理解
6)(选做)去掉L4_int.c程序最后的那条无限循环语句,看看有什么现象?
可以去掉吗?
1 现象:
程序很快运行结束,无法响应中断;
2 不可去掉无限循环语句
注意:
1)查看io430G2553.h文件末尾处有关中断向量偏址的符号定义。
2)为便于了解程序执行流程,可在中断子程入口处设置一断点,然后连续运行
程序(F5),观察操作按键和不操作按键两种情况下程序执行的现象有何不同。
2.(选做)采用事件标志处理中断
阅读程序L4_intA.c和L4_intB.c(见后页),描述其实现功能。
在实验板上将P1.0与
一个按键的控制端相连,P1.7与蜂鸣器的控制端相连。
比较L4_intA.c和L4_intB.c
二者在编程实现上有何不同。
注意各自中断子程执行时间的长短。
用L4_intB.c的方
法,改写任务2的编程。
不同之处:
1 采用事件标志处理中断时,按键之后机器做出的反应相对较慢,这是因为它需要现在中断子程中设置flag,再回到主程序根据flag做相应改动,耗费时间较长。
2 但是采用事件标志中断的一个好处就是,由于它在中断子程中只是进行了一个标记,你可以在标记flag在主程序中发挥作用之前再次进行中断,将flag改为其它值。
它相当于解决了一般中断过程中“中断执行时,屏蔽其他中断”的问题。
任务2改写后的程序程序3
3.(选做)按键抖动处理
程序L4_Key.C见后页,其功能是用中断方式相应与P1.2连接的按键,计数按键的次
数,并将所计的次数用8个发光二极管显示出来。
运行该程序,并操作按键,观察实际
操作的次数与显示值之间的关系。
编程改进L4_Key.C程序,用软件方式去除按键抖动
的影响。
根据分析,需要在响应了第一次下降沿后,加入一定的延时,躲过其它电压毛刺的产生时间。
具体程序见附录程序4
通过实验观察可以发现,改进之前,二进制显示的数值明显大于实际按键数,而改进之后,两者数值大致相等。
4.DCO出厂校验值的频率检测
2)(选做)控制发光二级管通过延时闪亮,编程分别使主系统时钟工作在
(1)MCLK=复位频率/8约100KHz;
(2)MCLK=DCO=16MHz;
两种不同频率下,观察灯的亮灭速度有何不同,掌握主系统时钟的变化对程
序执行速度的影响
根据分析
a.
(1)须选择8分频;
b.
(1)须具备延时函数与LED灯亮函数;
c.
(2)须选择DCO时钟源,并使用出厂校验值16MHz;
d.
(2)须具备延时函数与LED灯亮函数;
e.具体程序见附录选作4之1)和选作4之2)
f.实验观察到两种不同频率下,第一种情形下灯的亮灭速度非常慢,而第二种情形下灯的亮灭速度非常快,则说明:
主系统时钟频率的加快会加速执行速度。
5.(选做)改用4个数码管显示秒值,重新完成必做任务7
本题需要用到数码管的知识,需要标志值,具体程序见附录选作5程序
四、小结
总的来说,我觉得这次的实验内容很多,但是收获也是很大的;
并且在这个过程中重温了课本,加深了对课本上抽象的内容的理解,比如说实验前对于时钟,我的理解一直很模糊,似是而非,经过实验,发现其实它不过是三个寄存器,三个时钟信号,四个时钟源之间的问题,虽然过程比较繁琐,脉络却是清晰的;
而且关于中断,我也有了进一步的理解,特别是最后几个选作实验和必做实验是对这两节知识的综合应用,难度有点大,但是写出来之后还是很有成就感的。
【附录】
一、基本任务程序
1.必做第1题
5)
#include"
io430.h"
in430.h"
voiddelay()//延时函数
{unsignedintj;
for(j=0;
j<
0xffff;
j++);
}
voidBlink()//LED闪
{P2OUT&
=~BIT3;
delay();
P2OUT|=BIT3;
voidBuzz()//蜂鸣响
{unsignedinti;
for(i=0;
i<
3;
i++)
{P2OUT&
=~BIT4;
P2OUT|=BIT4;
};
voidmain(void)
{WDTCTL=WDTPW+WDTHOLD;
//关闭看门狗
//设置引脚P2.4、P2.3输出,P2.3连接LED,P2.4连接蜂鸣器
P2SEL&
=~(BIT3+BIT4);
P2SEL2&
P2OUT|=(BIT3+BIT4);
P2DIR|=(BIT3+BIT4);
//设置端口P1.5允许中断
P1SEL&
P1OUT|=BIT5;
P1REN|=BIT5;
P1DIR&
=~BIT5;
P1IES|=BIT5;
P1IFG&
P1IE|=BIT5;
_EINT();
//总中断允许
for(;
;
)//主循环
{Blink();
#pragmavector=PORT1_VECTOR
__interruptvoidport_ISR()
{Buzz();
2.必做第2题
voidL1Blink()//L1闪3次
=~BIT1;
P2OUT|=BIT1;
voidL7Blink()//L7闪
}
//设置引脚P2.1、P2.3、P2.4输出,P2.1、P2.3分别连接L1和L7,P2.4连接蜂鸣器
=~(BIT1+BIT3+BIT4);
P2OUT|=(BIT1+BIT3+BIT4);
P2DIR|=(BIT1+BIT3+BIT4);
//设置端口P1.4、P1.5允许中断
=~(BIT4+BIT5);
P1OUT|=(BIT4+BIT5);
P1REN|=(BIT4+BIT5);
=~(BIT4+BIT5);
P1IES|=(BIT4+BIT5);
P1IE|=(BIT4+BIT5);
{L7Blink();
{
if((P1IFG&
BIT4)!
=0)
{Buzz();
P1IFG&
BIT5)!
{
L1Blink();
P1IFG&
};
2.思考题
//设置端口P2.2、P2.5允许中断
=~(BIT2+BIT5);
P2OUT|=(BIT2+BIT5);
P2REN|=(BIT2+BIT5);
P2DIR&
=~(BIT2+BIT5);
P2IES|=(BIT2+BIT5);
P2IFG&
P2IE|=(BIT2+BIT5);
#pragmavector=PORT2_VECTOR
if((P2IFG&
BIT2)!
P2IFG&
=~BIT2;
P2IFG&
4.测试上电复位系统的ACLK、和SMCLK时钟频率
intmain(void)
//关闭看门狗
WDTCTL=WDTPW+WDTHOLD;
//设置P2.6、P2.7连接外部晶振
P2SEL|=(BIT6+BIT7);
P2SEL2&
=~(BIT6+BIT7);
P2DIR&
=~BIT6;
P2DIR|=BIT7;
//设置P1.0、P1.4输出ACLK、SMCLK
P1SEL|=BIT0;
P1SEL2&
=~BIT0;
P1DIR|=BIT0;
P1SEL|=BIT4;
P1DIR|=BIT4;
while
(1);
}
1)ACLK=4096Hz;
(时钟源外部晶振,32768HZ/8)
//设置P1.0输出ACLK
BCSCTL3&
=~(LFXT1S0+LFXT1S1);
//选择外部晶振
BCSCTL1|=(DIVA0+DIVA1);
//选择8分频
2)ACLK=3KHz;
(时钟源VLOCLK,12KHz/4)
=~LFXT1S0;
//选择时钟源VLOCLK
BCSCTL3|=LFXT1S1;
BCSCTL1&
=~DIVA0;
//选择4分频
BCSCTL1|=DIVA1;
第6题必做之DCO出厂校验值的频率检测
//设置P1.4输出SMCLK
BCSCTL2&
=~SELS;
//选择DCO时钟源
BCSCTL1=CALBC1_1MHZ;
//其他情况改变1MHz就可以了
DCOCTL=CALDCO_1MHZ;
必做第7题之利用输出的时钟信号做中断源,实现定时功能
unsignedchartime=0;
unsignedinti=0;
//关闭看门狗
//设置端口P1.0输出3KHzACLK时钟信号
//设置P2.0~P2.7为输出状态
P2SEL&
=0;
P2DIR|=0Xff;
P2OUT|=0Xff;
//设置端口P1.5允许中断
P1SEL&
P1REN|=BIT5;
P1OUT&
P1DIR&
P1IES&
P1IFG&
P1IE|=BIT5;
while
(1){
if(i>
=3000){
time+=1;
i=0;
P2OUT=~time;
//LED灯显示输出秒表的值
}
#pragmavector=PORT1_VECTOR
__interruptvoidport_ISR(){
i++;
=~(BIT5);
//清中断标志
2)必做7之思考题
voiddelay();
=~0;
//设置P1.7为输出状态
=~BIT7;
P1OUT|=BIT7;
P1DIR|=BIT7;
if((time%10)==0)
voiddelay(){//延时函数
unsignedintj;