2024年5月30日发(作者:)

实验三 定时器及中断实验

一、实验目的

1) 熟悉VC5402的定时器工作原理。

2) 掌握VC5402定时器的编程控制方法。

3) 学会使用定时器的中断方式来控制程序执行方法。

4) 掌握外部中断的控制方法,理解DSP对于中断的响应的过程。

5)

学习并掌握混合编程的方法

二、实验设备

1)

微机一台、DSP硬件仿真器一台、DSP实验箱一台。

2)程序及链接命令文件见:D: EXPEREXP3目录下的.asm 、.cmd、.C 和.lib文件。

三、开关设置

将开关K9拨到右边,即仿真器选择连接右边的CPU2。然后将实验箱上的SW2(不是

CPU板上的)设置为ON ON OFF ON ,即单脉冲按钮产生的中断给CPU2的中断INT2。

拨码开关SW2设置表

SW2

1

ON

ON

2 3 4

备 注

码位

单脉冲产生的中断给CPU2的中断INT2

单脉冲产生的中断给CPU2的中断INT0

ON OFF ON

ON OFF OFF

四、实验内容

1) 创建新的项目,添加源程序和链接命令文件,编译链接后载入执行程序。

2) 连续运行程序,观察由发光管LED5~8所指示的变化,读懂程序理解为何每秒变化1次。

在中断向量表中定时器中断向量入口地址处设置断点,然后连续执行程序,从断点处再

单步执行程序,理解中断向量程序的挂接方法,同时学会中断向量地址的计算方法。

3) 按几下单脉冲按钮,观察发光管LED1~4所发生的相应变化。与定时中断类似设置断点

进行程序跟踪调试。

4)分别在中断向量表中定时器和外中断2的向量入口地址处设置断点,然后连续执行程序,

从断点处再单步执行程序,理解中断向量程序的设置方法。同时还要根据实验书后附录3(中

断向量表)理解并掌握中断向量的入口地址的计算方法。

五、实验报告

1)发光管LED5~8每秒钟闪烁一次是如何算得的?

2)查实验书后中断屏蔽寄存器,说明中断初始化的方法。

3)若将定时周期改为2秒,应如何修改程序?都有哪些方法?给出程序段

4) 若将外部中断2(INT2)改为外部中断0时(INT0), 要求执行按下单脉冲按键时led1~4

发生变化,应如何修改程序?注意:电路方面要调节SW2为 ON ON OFF OFF 。

5) 思考题:如何用c语言调用汇编子程序?如何实现不同汇编程序之间相互调用?怎样在

c程序中嵌入汇编语句?

五、源程序及链接命令文件

1、主程序EXP03.C

/************************************************

* FileName: EXP03.C *

* Description: 定时器中断实验 *

* Write by: lanrunze *

* Date: 2004-2-10 *

* Update: 2006-3-10 *

*************************************************/

//因为使用了混合编程,所以必须添加 到项目文件中

//观察程序时使用DEBUG--GO MAIN来使程序跳转到程序的执行入口

//使用外中断2时 SW2= on on off on

//使用外中断0时 SW2= on on off off

//本实验使用单按钮产生外部中断

#include

interrupt void timer(); //定义定时器中断服务子程序

interrupt void int2c(); //定义外部中断服务子程序

extern void initial(); //定义外部初始化子程序

extern void porta(); //定义外部端口操作子程序

extern void portb();

extern void portc();

extern void portd();

int flag1=0; //端口输出标志,用于端口输出控制

int flag2=0; //端口输出标志,用于端口输出控制

unsigned int Out_flag = 0;

interrupt void timer() //定时器中断子程序,数存单元作计数器例子

{

*(int *)0x300=*(int *)0x300+1; //时钟中断计数,使用绝对寻址方式

if(*(int *)0x300 >= 1000) //计数超过 1000次

{

*(int *)0x300=0;

if(flag1==0)

{

flag1=1;

porta(); //调用PORTC汇编子程序

}

else

{

flag1=0;

portb(); //调用PORTB汇编子程序

}

//asm(" intr 18");//用于软件仿真时,产生软件中断,中断序号18,中断入口为外中断2

}

return;

}

interrupt void int2c() //外部中断服务子程序,变量作计数器例子

{

static int INT2_INT_NUM = 0; //定义整形计数器

INT2_INT_NUM++; //每次中断则计数器加1

if(INT2_INT_NUM % 2 == 0 ) //每两次按键XF闪烁一次