您的当前位置:首页正文

单片机中断技术实验报告

来源:个人技术集锦
实验名称:中断技术、基本时钟和定时功能(实验4、5)

姓名_ 学号_ 实验班号_ 21_ 机器号_

一、实验目的

1.了解中断原理,包括对中断源、中断向量、中断类型号、中断程序以及中断响应过程的理解;

2.掌握单片机C语言中断程序设计方法;

3.了解MSP430G2553基本时钟模块的工作原理,掌握其控制方法; 4.掌握利用时钟信号和中断技术实现定时功能的方法

二、实验基本任务 1. 中断响应过程的理解

阅读下面 C 语言中断程序,说明程序 L4_int.c执行的流程和实现功能。上机实践,回答下面问题,掌握用 C 语言编写中断程序的方法。

1) 从程序如何判断用的是哪个中断源?其中断类型号是多少?将实验板上某一按键与该中断源对应的引脚相连,运行程序,操作按键,观察现象。

答:(注:源程序主函数中第7、8行有误,应为P1SEL &=~ BIT5; P1SEL2 &=~ BIT5; )

① P1.1为中断源,中断类型号为2;

② 现象:LED灯一直在闪烁,按下按键后闪烁暂停,蜂鸣器响三声,然后LED灯继续闪烁;

2) main 函数中无调用函数 Buzz 的语句, 函数 Buzz 如何能被执行?何时会被执行? 据此描述中断响应过程。

答:

① 当按下按键时函数Buzz被执行;

② 中断响应的过程:P1.1处发出中断请求→判断是否满足响应条件→若满足,则CPU在执行完当前指令后,硬件自动完成保护现场的操作→从中断向量表中取中断向量至PC→转去执行中断服务子程;

3) 如果port_int 函数中不清分中断标志 P1IFG的后果是什么? 答:中断将一直重复进行下去;

4) 如果 L4_int.c中的 PORT1_VECTOR 改为 PORT2_VECTOR, 其他不变,程序执行的后果是什么?为什么?(可在中断处加一断点,运行程序,看现象,分析原因)

答:PORT1_VECTOR改为PORT2_VECTOR,其他不变,程序将会无法进入中断。因为程序中的中断属于P1引脚的中断,中断向量与P2引脚的中断向量不同,所进行的的改动则是把中断程序写入到了P2引脚的中断向量对应的地址中,而P1引脚的中断向量对应的地址上没有程序,因此无法执行原先的中断子程。 5) 如果中断源采用的是P1.5, 按键用K7,请设计连线,修改程序完成以中断方式响应K7的操作。

答:

① 只需将程序中对P1.1的操作改为对P1.5的操作即可,程序见附录程序1; ② 连线:将引脚与K6相连,其他连线不变; 2.中断程序编程练习

在实验板上用跳线将按键K5、K6分别与单片机的P1.4、P1.5相连,编程以中断方式响应按键K5和K6的请求:当按一次K5键,实验板上的蜂鸣器发出一声警报声;当按下一次K6键,实验板上的发光二极管L1闪3次。主循环中控制L7循环闪亮。

思考:如果用长导线将按键 K5、K6 分别连接在 P2.2 和 P2.5 上,如何修改程序以实现任务 2 功能?

答:经过分析,

① 本程序需要有四个函数,分别是延时函数、L1闪烁3次的函数、L7循环闪烁、以及蜂鸣器响一声的函数;

② 其次P2端口为输出端口,分别控制L1、L7和蜂鸣器,本程序中选用P2.1、P2.3、P2.4引脚;P1.4与P1.5作为中断源;

③ 应注意到本程序有两个中断源,须利用P1IFG判断产生中断的中断源引脚。 ④ 程序见附录程序2。 思考题:

如果用长导线将按键 K5、K6 分别连接在 P2.2 和 P2.5 上,则应设置P2.2、P2.5为中断源,设置中断向量时也应注意将对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频率值是多少? 答:经分析

① 本程序需要置引脚P1.0、P1.4分别输出ACLK、SMCLK; ② 需要确认外部晶振连上;

③ 具体程序见附录程序5测试程序。

④ 测得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 输出,用示波器测量实际值。 答:经分析知

① P1.4输出的是SMCLK;

② 1MHz、8MHz、12MHz、16MHz的情况类似,此处仅以1MHz为例,具体程序见附录程序6

③ 测得真实值分别为1.002MHz、7.752MHz、12.08MHz、15.94MHz。 7. 利用输出的时钟信号做中断源,实现定时功能

将任务 3 中P1.0 输出的3KHz ACLK 时钟信号,作为 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) 查看 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的编程。 答:

不同之处:

① 采用事件标志处理中断时,按键之后机器做出的反应相对较慢,这是因为它需要现在中断子程中设置flag,再回到主程序根据flag做相应改动,耗费时间较长。

② 但是采用事件标志中断的一个好处就是,由于它在中断子程中只是进行了一个标记,你可以在标记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\" #include \"in430.h\"

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; }

2.必做第2题

#include \"io430.h\" #include \"in430.h\"

void delay( ) //延时函数 { unsigned int j;

for (j=0;j<0xffff;j++); }

void L1Blink( ) //L1闪3次 { unsigned int i; for (i=0;i<3;i++)

{ P2OUT &=~BIT1; delay();

P2OUT|= BIT1; delay(); }; }

void L7Blink( ) //L7闪 { P2OUT &=~BIT3; delay();

P2OUT |= BIT3; delay(); }

void Buzz( ) //蜂鸣响 { P2OUT &=~BIT4; delay();

P2OUT|= BIT4; delay(); }

void main ( void )

{ WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

//设置引脚 P2.1、P2.3 、P2.4输出,P2.1、P2.3分别连接 L1和L7,P2.4 连接蜂鸣器

P2SEL &=~(BIT1+BIT3+BIT4); P2SEL2 &=~(BIT1+BIT3+BIT4);

P2OUT|=(BIT1+BIT3+BIT4); P2DIR|=(BIT1+BIT3+BIT4); //设置端口 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 (;;) //主循环

{ L7Blink(); }; }

#pragma vector=PORT1_VECTOR __interrupt void port_ISR( ) {

if ((P1IFG&BIT4)!=0) {Buzz();

P1IFG &=~BIT4; }; if ((P1IFG&BIT5)!=0) {

L1Blink();

P1IFG&=~BIT5;}; }

2.思考题

#include \"io430.h\" #include \"in430.h\"

void delay( ) //延时函数 { unsigned int j;

for (j=0;j<0xffff;j++); }

void L1Blink( ) //L1闪3次 { unsigned int i; for (i=0;i<3;i++)

{ P2OUT &=~BIT1; delay();

P2OUT|= BIT1; delay(); }; }

void L7Blink( ) //L7闪 { P2OUT &=~BIT3; delay();

P2OUT |= BIT3; delay(); }

void Buzz( ) //蜂鸣响 { P2OUT &=~BIT4; delay();

P2OUT|= BIT4; delay(); }

void main ( void )

{ WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

//设置引脚 P2.1、P2.3 、P2.4输出,P2.1、P2.3分别连接 L1和L7,P2.4 连接蜂鸣器

P2SEL &=~(BIT1+BIT3+BIT4); P2SEL2 &=~(BIT1+BIT3+BIT4); P2OUT|=(BIT1+BIT3+BIT4); P2DIR|=(BIT1+BIT3+BIT4); //设置端口 P2.2、P2.5 允许中断 P2SEL &=~ (BIT2+BIT5); P2SEL2 &=~ (BIT2+BIT5); P2OUT |=(BIT2+BIT5); P2REN |=(BIT2+BIT5); P2DIR &=~(BIT2+BIT5); P2IES |= (BIT2+BIT5); P2IFG &=~(BIT2+BIT5); P2IE |= (BIT2+BIT5); _EINT(); //总中断允许 for (;;) //主循环

{ L7Blink(); }; }

#pragma vector=PORT2_VECTOR __interrupt void port_ISR( ) {

if ((P2IFG&BIT2)!=0) {Buzz();

P2IFG &=~BIT2; }; if ((P2IFG&BIT5)!=0) {

L1Blink();

P2IFG&=~BIT5;};

}

4. 测试上电复位系统的ACLK、和SMCLK时钟频率 #include \"io430.h\" int main( 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; P1SEL2&=~BIT4; P1DIR|=BIT4; while(1); }

5. 掌握基本时钟模块的编程控制

1)ACLK=4096Hz; (时钟源外部晶振,32768HZ/8) #include \"io430.h\" int main( void ) {

//关闭看门狗

WDTCTL = WDTPW + WDTHOLD; //设置P2.6、P2.7连接外部晶振 P2SEL|=(BIT6+BIT7); P2SEL2&=~(BIT6+BIT7); P2DIR&=~BIT6; P2DIR|=BIT7;

//设置P1.0输出ACLK P1SEL|=BIT0; P1SEL2&=~BIT0; P1DIR|=BIT0;

BCSCTL3&=~(LFXT1S0+LFXT1S1);//选择外部晶振 BCSCTL1|=(DIVA0+DIVA1);//选择8分频 while(1); }

2)ACLK=3KHz;(时钟源VLOCLK,12KHz/4) #include \"io430.h\" int main( void )

{

//关闭看门狗

WDTCTL = WDTPW + WDTHOLD; //设置P1.0输出ACLK P1SEL|=BIT0; P1SEL2&=~BIT0; P1DIR|=BIT0;

BCSCTL3&=~LFXT1S0;//选择时钟源VLOCLK BCSCTL3|=LFXT1S1;

BCSCTL1&=~DIVA0;//选择4分频 BCSCTL1|=DIVA1; while(1); }

第6题必做之DCO出厂校验值的频率检测 #include \"io430.h\" int main( void ) {

//关闭看门狗

WDTCTL = WDTPW + WDTHOLD;

P1SEL|=BIT4;//设置P1.4输出SMCLK P1SEL2&=~BIT4; P1DIR|=BIT4;

BCSCTL2&=~SELS;//选择DCO时钟源

BCSCTL1=CALBC1_1MHZ; //其他情况改变1MHz就可以了 DCOCTL=CALDCO_1MHZ; while(1); }

必做第7题之利用输出的时钟信号做中断源,实现定时功能 1)

#include \"io430.h\" #include \"in430.h\" unsigned char time=0; unsigned int i=0; int main( void ) {

//关闭看门狗

WDTCTL = WDTPW + WDTHOLD;

//设置端口P1.0输出3KHzACLK时钟信号 P1SEL|=BIT0; P1SEL2&=~BIT0; P1DIR|=BIT0;

BCSCTL3&=~LFXT1S0; BCSCTL3|=LFXT1S1;

BCSCTL1&=~DIVA0; BCSCTL1|=DIVA1;

//设置P2.0~P2.7为输出状态 P2SEL&=0; P2SEL2&=0; P2DIR|=0Xff; P2OUT|=0Xff;

//设置端口P1.5允许中断 P1SEL&=~BIT5; P1SEL2&=~BIT5; P1REN|=BIT5; P1OUT&=~BIT5; P1DIR&=~BIT5; P1IES&=~BIT5; P1IFG&=~BIT5; P1IE|=BIT5; _EINT();

while(1){

if (i>=3000) { time+=1; i=0;}

P2OUT=~time; //LED灯显示输出秒表的值 } }

#pragma vector=PORT1_VECTOR __interrupt void port_ISR(){ i++;

P1IFG&=~(BIT5); //清中断标志 }

2)必做7之思考题 #include \"io430.h\" #include \"in430.h\" unsigned char time=0; unsigned int i=0; void delay(); int main( void ) {

//关闭看门狗

WDTCTL = WDTPW + WDTHOLD;

//设置端口P1.0输出3KHzACLK时钟信号 P1SEL|=BIT0; P1SEL2&=~BIT0; P1DIR|=BIT0;

BCSCTL3&=~LFXT1S0; BCSCTL3|=LFXT1S1; BCSCTL1&=~DIVA0; BCSCTL1|=DIVA1;

//设置P2.0~P2.7为输出状态 P2SEL&=~0; P2SEL2&=~0; P2DIR|=0Xff; P2OUT|=0Xff;

//设置P1.7为输出状态 P1SEL&=~BIT7; P1SEL2&=~BIT7; P1OUT|=BIT7; P1DIR|=BIT7;

//设置端口P1.5允许中断 P1SEL&=~BIT5; P1SEL2&=~BIT5; P1REN|=BIT5; P1OUT&=~BIT5; P1DIR&=~BIT5; P1IES&=~BIT5; P1IFG&=~BIT5; P1IE|=BIT5; _EINT();

while(1){

if (i>=3000) { time+=1;

if((time%10)==0) P1OUT&=~BIT7; delay();

P1OUT|=BIT7; i=0;}

P2OUT=~time; //LED灯显示输出秒表的值 } }

void delay(){//延时函数

unsigned int j;

for (j=0;j<0xffff;j++); }

#pragma vector=PORT1_VECTOR __interrupt void port_ISR(){ i++;

P1IFG&=~(BIT5); //清中断标志 }

二、选做任务程序 2.采用事件标志处理中断 #include \"io430.h\" #include \"in430.h\" int flag=0;

void delay( ) //延时函数 { unsigned int j;

for (j=0;j<0xffff;j++); }

void L1Blink( ) //L1闪3次 { unsigned int i; for (i=0;i<3;i++)

{ P2OUT &=~BIT1; delay();

P2OUT|= BIT1; delay(); }; }

void L7Blink( ) //L7闪 { P2OUT &=~BIT3; delay();

P2OUT |= BIT3; delay(); }

void Buzz( ) //蜂鸣响 { P2OUT &=~BIT4; delay();

P2OUT|= BIT4; delay(); }

void main ( void )

{ WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

//设置引脚 P2.1、P2.3 、P2.4输出,P2.1、P2.3分别连接 L1和L7,P2.4 连接蜂鸣器

P2SEL &=~(BIT1+BIT3+BIT4); P2SEL2 &=~(BIT1+BIT3+BIT4); P2OUT|=(BIT1+BIT3+BIT4); P2DIR|=(BIT1+BIT3+BIT4); //设置端口 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 (;;) //主循环

{ L7Blink(); if (flag==1) {

Buzz(); flag=0; } if (flag==2)

{

L1Blink(); flag=0; } }; }

#pragma vector=PORT1_VECTOR __interrupt void port_ISR( ) {

if ((P1IFG&BIT4)!=0) {flag=1;

P1IFG &=~BIT4; }; if ((P1IFG&BIT5)!=0) {

flag=2;

P1IFG&=~BIT5;}; }

3.(选做) 按键抖动处理 #include \"io430.h\"

#include \"in430.h\"

unsigned int number=0; //记录响应按键次数 void delay( ) //延时函数 { unsigned int j;

for (j=0; j<0xffff; j++); }

int main( void )

{ WDTCTL = WDTPW + WDTHOLD; //关闭看门狗 __disable_interrupt(); //_DINT(); 禁止总中断 P2SEL=0; //置 P2 为基本 I/O功能 P2SEL2=0; //

P2OUT=0xFF; //置 P2 输出的初值 P2DIR=0xFF; //置 P2 为输出方向 P1SEL &= BIT2;

P1SEL2 &= BIT2; P1OUT |=BIT2;; P1REN |=BIT2; P1DIR &=~BIT2; P1IES |= BIT2; P1IFG &=~BIT2; P1IE |= BIT2;

__enable_interrupt(); //_EINT(); 总中断运行 while(1){ }; }

#pragma vector=PORT1_VECTOR __interrupt void port_int(void) { if( (P1IFG&BIT2)!=0 ) {

delay(); //增加延时函数,避开毛刺 if ( (P1IFG&BIT2)!=0 ) { number++; P2OUT=~number; }

P1IFG &=~BIT2; } }

选做第4题之DCO出厂校验值的频率检测 1)MCLK=复位频率/8 约100KHz; 将P2.0与L1相连,程序如下: #include \"io430.h\" void LED(); void delay(); int main( void ) {

//关闭看门狗

WDTCTL = WDTPW + WDTHOLD; //设置P2.0为输出状态 P2SEL&=~BIT0; P2SEL2&=~BIT0; P2OUT|=BIT0; P2DIR|=BIT0; //复位8分频

BCSCTL2|=(DIVM0+DIVM1); while(1){ LED(); } }

void LED(){ //LED灯延时亮灭 P2OUT&=~BIT0; delay();

P2OUT|=BIT0; delay(); }

void delay(){ //延时函数 unsigned int i;

for (i=0;i<0xffff;i++); }

2)MCLK=DCO=16MHz; #include \"io430.h\" void LED(); void delay(); int main( void ) {

// 关闭看门狗

WDTCTL = WDTPW + WDTHOLD; //P2.0为输出状态 P2SEL&=~BIT0; P2SEL2&=~BIT0; P2OUT|=BIT0; P2DIR|=BIT0;

//设置MCLK时钟源为DCO振荡器 BCSCTL2&=~(SELM0+SELM1); //DCO振荡器频率设置为16MHz BCSCTL1=CALBC1_16MHZ; DCOCTL=CALDCO_16MHZ; while(1){

LED(); } }

void LED(){ //LED灯延时亮灭 P2OUT&=~BIT0; delay();

P2OUT|=BIT0; delay(); }

void delay(){ //延时函数 unsigned int i;

for (i=0;i<0xffff;i++); }

选作5之改用 4 个数码管显示秒值,重新完成必做任务 7

将P2.0~P2.7依次与Sa ~Sh相连。P1.7与BUZZ相连,P1.1~P1.4与S1~S4相连 #include \"io430.h\" #include \"in430.h\" void delay();

unsigned char time=0; unsigned int i=0; const char

LEDtab[10]={~0x3F,~0x06,~0x5B,~0x4F,~0x66,~0x6D,~0x7D,~0x07,~0x7F,~0x6F};

unsigned char a=0,b=0,c=0,d=0; unsigned char flag=0; int main( void ) {

//关闭看门狗

WDTCTL = WDTPW + WDTHOLD;

//设置端口P1.0输出3KHzACLK时钟信号 P1SEL|=BIT0; P1SEL2&~BIT0; P1DIR|=BIT0;

BCSCTL3&=~LFXT1S0; BCSCTL3|=LFXT1S1; BCSCTL1&=~DIVA0; BCSCTL1|=DIVA1;

//设置P2.0~P2.7为输出状态 P2SEL=0;

P2SEL2=0; P2DIR=0XFF; P2OUT=0XFF;

//设置P1.1~P1.4、P1.7为输出状态;

P1SEL&=~(BIT1+BIT2+BIT3+BIT4+BIT7); P1SEL2&=~(BIT1+BIT2+BIT3+BIT4+BIT7); P1DIR|=BIT1+BIT2+BIT3+BIT4+BIT7; P1OUT|=BIT7;

P1OUT&=~(BIT1+BIT2+BIT3+BIT4);

//设置端口P1.5允许中断 P1SEL&=~BIT5; P1SEL2&=~BIT5; P1REN|=BIT5; P1OUT&=~BIT5; P1DIR&=~BIT5; P1IES&=~BIT5; P1IFG&=~BIT5; P1IE|=BIT5; _EINT();

while(1){

if (i>3000) { time+=1; i=0;}

time=time%10000; d=time/1000;

c=(time%1000)/100; b=(time%100)/10; a=time%10;

if (a==0) { P1OUT&=~BIT7; delay(); P1OUT|=BIT7;}//蜂鸣器响 } }

void delay() //延时函数 {

unsigned int j;

for (j=0;j<0xffff;j++); }

#pragma vector=PORT1_VECTOR __interrupt void port_ISR(){ i++;

//显示输出数码管

if (flag==0) {P2OUT=LEDtab[a]; P1OUT&=~(BIT1+BIT2+BIT3+BIT4); P1OUT|=BIT1; flag=1;}

else if (flag==1) {P2OUT=LEDtab[b]; P1OUT&=~(BIT1+BIT2+BIT3+BIT4); P1OUT|=BIT2; flag=2;}

else if (flag==2) {P2OUT=LEDtab[c]; P1OUT&=~(BIT1+BIT2+BIT3+BIT4); P1OUT|=BIT3; flag=3;}

else if (flag==3) {P2OUT=LEDtab[d]; P1OUT&=~(BIT1+BIT2+BIT3+BIT4); P1OUT|=BIT4; flag=0;}

P1IFG&=~(BIT5); //清中断标志 }

三、课本程序 【 L4_int.c】

因篇幅问题不能全部显示,请点此查看更多更全内容