实验具体内容

本实验联系静态按键识别,发光二极管驱动,以及外部中断的使用方法,实验原理图如下图 4.1.1 所示(注:图中元件编号中括号里面的内容表示该元件所在的板子名称,如CPU 表示该元器件位于 CPU 板,以下类同)。

要求利用外部硬件中断,按键按下一次产生一次外部中断,在中断服务程序中计数器加 1,同时,通过发光二极管的闪烁和蜂鸣器响的次数,指示计数器的当前值。当计数到10 时,再次按键将重新从 1 开始计。

img

连线关系:

实验中端子连接关系如下:

img

流程图

img

实验过程

  1. 关掉实验箱电源。将 MCU 板插接在母板上,按照前面连接关系表将硬件连接好。
  2. 在仿真器断电情况下将仿真器的仿真头插在 MCU 板的 MCU 插座上。将仿真器与开发 PC 机的通信口连接好,打开实验箱及仿真器的电源。
  3. 运行 Keil uVision2 开发环境,建立工程 int0_c.uV2,MCU 为 AT89S51,包含启动文件 STARTUP.A51。
  4. 按照实验功能要求创建源程序 int0.c 并加入到工程 int0_c.uV2,并设置工程int0_c.uV2 属性,将其晶振频率设置为 11.0592MHz,选择输出可执行文件,DEBUG方式选择硬件 DEBUG,并选择其中的“WAVE V series MCS51 Driver”仿真器。
  5. 构造(Build)工程 int0_c.uV2。如果编程有误进行修改,直至构造正确为止。
  6. 运行程序,按下 MCU 板上的 KEY0 按键,观察每次按键按下时主板上的发光二极管的闪烁和蜂鸣器响的次数,是否符合程序要求,若不符合要求,分析出错原因,继续重复第 4、5 步的步骤,直至结果正确。

实验验证结果正确。

总结C语言实现中断控制及中断服务的方法:

首先要对中断进行初始化配置(例如中断开关、中断触发方式等)。

编写中断服务函数,将中断源与AT89C51的中断端口连接,当中断源产生中断信号时,AT89C51会执行一次中断服务函数。

实验源程序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <reg51.h>
#include <intrins.h> //包含_nop_()函数
#define uint unsigned int
#define uchar unsigned char
uchar Count_int;
sbit LED = P3^0;
sbit BELL = P3^1;
sbit int0_var = P3^2;
void delay_ms(uint xms)
{
   uint i,j;
   for(i=xms;i>0;i--)
   for(j=110;j>0;j--);
}

void int0() interrupt 0
{
   Count_int++;
   if(Count_int==11)   Count_int = 1;
}

void sysinit()
{
   LED = 1;        //初始化led不亮
   BELL = 1;       //初始化蜂鸣器不响
   Count_int = 0;
   EA = 1;         //开启中断总开关
   EX0 = 1;        //允许外部中断0中断
   IT0 = 1;        //设置外部中断0为下降沿触发
}

void main()
{
uchar i;
   delay_ms(10);   //延时10ms,等待电源稳定
   sysinit();        //初始化
   while(1)
  {
 int0_var = 1;
       if(int0_var == 0)
      {
           while(!int0_var);
           for(i=0;i<Count_int;i++)
          {
               LED = 0;    //led亮
               BELL = 0;   //蜂鸣器响
               delay_ms(100);      //延时100ms
               LED = 1;    //led灭
               BELL = 1;   //蜂鸣器静音
delay_ms(100);
          }
      }
  }
}