目录

  • 一、实验要求
  • 二、知识要点
    • (一)数码管
    • (二)八段数码管的字形编码
    • (三)C51变量定义的四要素
    • (四)中断源
    • (五)相关的特殊功能寄存器
      • 1、定时器/计数器控制寄存器TCON
      • 2、中断允许控制寄存器IE
    • (六)中断程序
      • 1、中断初始化步骤
      • 2、中断服务程序函数
  • 三、Proteus仿真软件画原理图
  • 四、Keil编程软件编写程序
  • 五、实验结果
    • (一)仿真结果
    • (二)连接电路
    • (三)烧录并观察实验现象

一、实验要求

【实验目的】
1、熟悉51单片机的5个中断源;
2、掌握外部中断的中断初始化和中断服务函数的程序编写方法,编程实现实现数码管上显示外部中断计数。
【实验内容】
1、用Proteus绘制硬件原理图,并设置元件参数;
2、用KeilC51软件编程实现数码管上显示外部中断计数。

【硬件要求】
连接方法:P2.0-P2.7连接一只共阳型7段LED数码管,按键K1连接至单片机P3.2(INT0)引脚。

二、知识要点

(一)数码管

数码管是一种半导体发光器件,基本单元是发光二极管,玻璃管中包括一个金属丝网制成的阳极和多个阴极,它可以显示数字和其他信息。

按其内部结构即发光二极管单元连接方式不同可分为共阳极共阳极两种数码管,共阳级数码管是指将数码管内部的发光二极管的阳极接到一起形成一个公共阳极(COM),当某一字段的发光二极管的阴极为低电平时,相对应的字段点亮,而当某一字段的阴极为高电平时,相对应的字段就不亮;共阴极数据管与共阳极数码管相反。

共阳的LED数码管在应用时应将公共极COM接到+5V;共阴的LED数码管在应用时应将公共极COM接到地线GND上。

(二)八段数码管的字形编码

以下是八段数码管的字形编码表,在使用时方便查阅:

字符 共阳极 共阴极
0 C0H 3FH
1 F9H 06H
2 A4H 5BH
3 B0H 4FH
4 99H 66H
5 92H 6DH
6 82H 7DH
7 F8H 07H
8 80H 7FH
9 90H 6FH

(三)C51变量定义的四要素

C51变量定义的四要素如下:

1、存储种类(重点!)
存储种类分为四类:auto(自动型)、extern(外部型)、static(静态型)、register(寄存器型),默认的存储种类为自动型变量(auto),一般情况下不用写出来。
自动型变量的作用范围在定义它的函数体或语句块内,执行结束后,变量所占用的内存会被释放;
外部型的变量在其源文件中定义之后,在其它源文件中需要通过extern说明后才能使用该变量;
静态型与自动型相反,在执行结束后其占用的内存单元继续保留;
寄存器型变量是指将变量对应的存储单元指定为通用寄存器,从而可提高程序的运行速度。
2、数据类型
数据类型分为整型、长整型、字符型、浮点型和指针型五种数据类型。
3、存储类型(重点!)
C51编译器三种编译方式对应三种默认的存储类型:SMALL对应data类型、COMPACT对应pdata类型、LARGE对应xdata类型,一般情况下若无特殊声明,为SMALL编译模式
data类型变量的存储区域位于直接寻址区(片内低128B RAM),其访问数据的速度最快且容量较小,作为常用变量或临时性变量存储器;
idata类型变量的存储区域位于间接寻址区(片内高128B RAM);
xdata类型变量的存储区域位于外部寄存器(片外64KB RAM),常用于存放不常用的变量或者待处理的数据;
pdata类型变量的存储区域位于分页寻址区(片外低256B RAM),常用于外部设备访问;
code类型变量的存储区域位于程序存储区(ROM),常用于存放数据表格等固定信息;
bdata类型变量的存储区域位于位寻址区(片内可位寻址区),其允许位与字节混合访问。

(四)中断源

C51单片机的中断系统有五个中断源,分为2个外部中断源3个内部中断源,它们是两个外部中断INT0(P3.2)和INT1(P3.3)、两个片内定时器/计数器T0和T1和一个片内串行口的发送或接收中断请求源T1或R1。
另外具有两级中断优先级,由中断优先级控制寄存器IP控制,每个中断源的优先级高低都可以通过编程控制,中断允许受到CPU开中断和中断源开中断的两级控制。

(五)相关的特殊功能寄存器

1、定时器/计数器控制寄存器TCON

定时器/计数器控制寄存器TCON控制定时器/计数器的启动与停止以及标志定时器的溢出和中断情况,对TCON既可以采用字节寻址也可以采用位寻址,当51单片机系统复位时,TCON的所有位都会清零。
TCON的格式如下,高4位用于控制定时器/计数器的启动和中断请求,低4位控制外部中断:

(1)TR1和TR0为运行控制位,等于0时停止定时器工作,等于1时启动定时器工作(例启动定时器T1工作:TR1=1);
(2)TF1和TF0为溢出中断标志位,定时器溢出由硬件自动置为1,CPU响应中断后,硬件自动清零(例TF1=0无溢出,TF1=1时溢出);
(3)IT1和IT0为外部中断INT0、INT1的触发方式控制位,由软件来置1或清0,以控制外部中断的触发方式。(例IT1=1时,外部中断INT1为下降沿触发,IT1=0时,外部中断INT1为低电平触发);
(4)IE1和IE0为外部中断的请求标志位,当引脚上出现中断请求信号(低电平或脉冲下降沿)时,硬件自动将IEX置1,从而产生中断请求标志,而当CPU响应中断时,由硬件消除(例外部中断INT0P3.2引脚有中断请求信号时,IE0置1,即IE0=1)。

2、中断允许控制寄存器IE

在中断系统中,中断源向CPU发出中断请求后,由中断允许控制寄存器IE和中断优先级控制寄存器IP(本次实验未使用)来管理CPU。
中断允许控制寄存器IE控制中断源的开放或屏蔽,它共6位,字节地址为A8H,如下:

(1)EA为中断允许总控位,控制CPU的开放中断,当EA=0时,CPU屏蔽所有中断请求;EA=1时,CPU开放中断(5个中断源的中断请求是否允许,要根据其中断请求允许控制位来决定)。
(2)EX0、EX1分别为外部中断0允许位和外部中断1允许位,EX0=0时,禁止外部中断0中断,EX0=1时,允许外部中断0中断;EX1=0时,禁止外部中断1中断,EX1=1时,允许外部中断1中断。
(3)ET0、ET1分别为定时器/计数器Tx(x=0,1)溢出中断允许位,等于0时禁止Tx(x=0,1)中断,等于1时允许Tx(x=0,1中断。
(4)ES为串行口中断允许位,ES=0时禁止串行口中断,ES=1时允许串行口中断。

(六)中断程序

中断程序分为中断初始化和中断服务两个部分组成。

1、中断初始化步骤

中断初始化是指用户对特殊功能寄存器中的各控制位进行赋值,其步骤如下:
第一步,开相应中断源的中断,经中断允许控制寄存器IE;
第二步*(两个以上中断需设定优先级),设定所用中断源的中断优先级,经中断优先级控制寄存器IP;
第三步,若为外部中断,则应规定采取的触发方式,即采取的触发方式是电平触发方式或脉冲触发方式,经定时器控制寄存器TCON。

当外部中断采用电平触发方式时,CPU在每个机器周期的S5P2时刻都检测INT0和INT1引脚的输入电平,若检测到低电平,则认为由中断信号,且在中断服务结束前低电平必须清楚,否则中断返回之前将再次产生中断。
当外部中断采用脉冲触发方式时,CPU在每个机器周期的S5P2时刻都检测INT0和INT1引脚的输入电平,需连续检测两次(第一次检测为高电平,第二次检测为低电平),即检测一个下降沿才被认为是一个有效的中断请求信号。

2、中断服务程序函数

中断服务是指单片机检测到中断后响应中断事件,中断服务的步骤如下:
第一步,在中断向量入口放置一条跳转指令,让程序从该入口跳转到实际代码的起始位置;
第二步,保存当前寄存器的内容;
第三步,清除中断标志位,处理中断事件;
第四步,恢复寄存器的内容,返回到原来主程序的执行处;

也就是创建中断服务程序函数,该函数的定义格式如下,其中n为中断源编号,可以为0-31之间的整数,前面跟上interrupt表示将函数声明为中断服务函数,而using m由于实现工作寄存器组的切换,m即为中断服务子程序中选用的工作寄存器组号(0-3):

返回值 函数名称([参数])interrupt n[using m]{}

要注意中断服务函数不能进行参数传递,且它没有返回值(可以将中断服务函数定义为void类型),另外不能调用中断服务函数,因为会导致编译错误。

三、Proteus仿真软件画原理图

原理图如下,其中的八段数码管为7SEG-MPX1-CA,按键与P3端的P3.2INT0相连(外部中断0请求输入端,低电平有效,这里采用电平触发方式):

四、Keil编程软件编写程序

首先创建一个数组Tab[],根据C51变量定义的四要素,将数组Tab定义为unsigned char code Tab[],其中的code的含义是用code把数组Tab[]定义在程序存储器中,总的来说就是定义一个无符号字符型(自动变量)数组Tab[],且该变量位于ROM中,根据共阳极数码管段码,即unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
设置一个延时函数,依然还是设置一个有参数的函数,调用函数delay(1000)即延时1秒:

//延时函数
void delay(unsigned int x)
{unsigned int i,j;for(i=0;i<x;i++)for(j=0;j<125;j++);
}

编写中断服务程序函数,如下:

unsigned char m;
...
//中断服务程序函数
void counter(void) interrupt 0
{EX0=0;           //禁止外部中断0中断m++;           //中断计数P2=Tab[m];       //依次取数组Tab内的元素if(m==10){m=0;P2=Tab[m];}EX0=1;          //允许外部中断0中断
}

完整程序代码如下:

#include<reg51.h>
unsigned char m;
unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};  //共阳极,对应八段数码管的数字0-9
void delay(unsigned int x)  //延时函数
{unsigned int i,j;for(i=0;i<x;i++)for(j=0;j<125;j++);
}
void counter(void) interrupt 0
{EX0=0;           //禁止外部中断0中断m++;           //中断计数P2=Tab[m];       //依次取数组Tab内的元素if(m==10){m=0;P2=Tab[m];}EX0=1;          //允许外部中断0中断
}
void main()
{EX0=1;        //允许外部中断0中断IT0=1;      //外部中断INT0为下降沿触发EA=1;      //使能CPU,CPU开放中断while(1){P2=Tab[m];          //依次取数组Tab内的元素delay(1000);      //调用延时函数,参数为1000,即1s}
}

五、实验结果

(一)仿真结果

导入可执行文件,点击开始仿真:

按下按键一次:

按下第二次:

……依次到第九次,数字到9:

(二)连接电路

注意排线的接线方式,否则数码管会显示错误:

(三)烧录并观察实验现象

烧录后,实验现象如下,按下按键:

再次按下按键,数字变为2:

……依次,按第九次按键,显示数字9:

单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)相关推荐

  1. 单片机原理及其应用——单片机定时器中断实验(八段数码管依次显示0~9数字)

    目录 一.实验要求 二.知识要点 (一)单片机定时器/计数器 (二)相关的特殊功能寄存器 1.工作方式寄存器TMOD 2.定时器/计数器控制寄存器TCON (三)定时器/计数器的工作方式 1.工作方式 ...

  2. 51单片机 | 外部中断实验

    文章目录 一.外部中断介绍 二.外部中断配置 三.硬件设计 四.软件设计 五.实验现象    51 单片机外部中断有 2 个,外部中断 0 和外部中断 1,它们的使用方法是一样的,所以只要学会一个即可 ...

  3. [Keil][Verilog][微机原理] 流水灯、存储器、外部中断实验_北京邮电大学计算机原理与应用课程实验报告

    计算机原理与应用实验-流水灯.存储器.外部中断实验 1 实验一 流水灯实验 1.1 实验目的 掌握ARM开发工具的使用. 掌握基本IO的使用. 1.2 实验原理及内容 电路结构图 实现流水灯的电路结构 ...

  4. 一起学mini2440裸机开发(十)--mini2440外部中断实验

    我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表, ...

  5. 基于Atmega16的外部中断实验

    一.实验目的 1. 理解单片机中断的概念. 2. 掌握外部中断的编程方法. 二.实验内容 1. 验证课堂例题 编译下载运行课堂例题--"按键次数显示"(INT_EX1)和" ...

  6. hal库开启中断关中断_「正点原子NANO STM32开发板资料连载」第十章 外部中断实验...

    1)实验平台:ALIENTEK NANO STM32F411 V1开发板 2)摘自<正点原子STM32F4 开发指南(HAL 库版>关注官方微信号公众号,获取更多资料:正点原子 第十章 外 ...

  7. gd32f303 设计中断优先级_ALIENTEK 阿波罗 STM32F767 开发板资料连载第九章 外部中断实验...

    1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 第九章 外部中断实验 这 ...

  8. zigbee CC2530 系列教程 5 外部中断实验

    所有课程见此链接: zigbee CC2530 系列教程 0 课程介绍 4.4外部中断实验 4.4.1 实验目的 了解使用外部中断的方法,在中断处理函数中切换LED的状态. 4.4.2 实验讲解 首先 ...

  9. EXIT外部中断实验——EXTI

    外部中断概述: STM32的每个IO都可以作为外部中断输入. STM32的中断控制器支持19个外部中断/事件请求: 线0~15:对应外部IO口的输入中断. 线16:连接到PVD输出. 线17:连接到R ...

最新文章

  1. 确定修改——取消修改
  2. Linux中vi编辑器的使用详解
  3. (Hibernate进阶)Hibernate系列——总结篇(九)
  4. “敏捷版”全链路压测
  5. websphere java和进程管理_jvisualvm/Jconsole监控WAS(WebSphere)中间件
  6. centos 6.5配置samba
  7. linux xia 安装程序,linux更新或安装libzip
  8. html边框为框,HTML 为元素设置边框
  9. linux 读取内存颗粒,linux查看主板内存槽与内存信息的命令dmidecode怎么用
  10. nginx-exporter安装使用
  11. 创建数据库和表的SQL语句
  12. DocsBuilderGUI 工具使用介绍
  13. 抓包分析数据(Charles以及HttpCanary)
  14. 三阶魔方还原 - 只需7步6个公式
  15. 基于MATLAB的激光光斑图像处理算法
  16. Android - 设置Switch不能手动切换 只能代码切换
  17. 节能与环保杂志节能与环保杂志社节能与环保编辑部2023年第2期目录
  18. android EditText 属性
  19. 计算机处理器i5和i7,i5与i7有什么区别 酷睿i5和i7区别汇总【详细介绍】
  20. 某淘宝卖家靠微头条引流,月销1000单

热门文章

  1. Linux调度系统全景指南(下篇)
  2. 一不小心,我们办了场全球最 _____ 的技术大会......
  3. LiveVideoStack线上交流分享 (十六) —— 爱奇艺剧场直播云端混流方案
  4. 基于QoE的实时视频编码优化:低功耗,低延时,高质量
  5. MySQL性能基准测试对比:MySQL 5.7与MySQL 8.0
  6. Intellij IDEA 自动生成 serialVersionUID
  7. 游戏数仓分析(二)SpringBoot项目对数据进行可视化展示
  8. Storm 06_Storm 容错机制
  9. java线程----生产者和消费者问题
  10. java基础---多线程同步锁问题