51单片机中断实验连接图及程序
- 格式:doc
- 大小:77.00 KB
- 文档页数:2
实验五、中断实验
1、实验目的:了解单片机的中断系统,学习汇编语言中断程序的编程方法与调试技巧。
2、实验内容:单片机的INT0和INT1分别接了两个外部中断,当INT0引脚有中断时,点亮发光二极管D1,当INT1引脚有中断时,点亮发光二极管D2。
3、实验程序框图
4、实验电路图
5、实验步骤:SW1从高电平变为低电平时,点亮发光二极管D1;SW2从高电平变为低电
平时,点亮发光二极管D2。
调试程序,并运行。
观察发光二极管点亮情况。
6、思考:程序中的外部中断的触发方式是哪一种?修改程序使外部中断的触发方式改变。
7、程序清单:
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP SERVE
ORG 0013H
AJMP SERVE1
MAIN: ORL P1 , #0FFH ;;灯全灭,准备读入SETB IT0; ;选择边沿触发方式
SETB EX0; ;允许INT0中断
SETB IT1; ;选择边沿触发方式SETB EX1; ;允许INT0中断
SETB EA ;;CPU开中断
AJMP $ ;;等待中断
;中断服务子程序为:
SERVE: MOV A,#0F7H
MOV P1,A
RETI
SERVE1: MOV A,#0EFH
MOV P1,A
RETI。
MCS-51单⽚机的中断系统单⽚机中断技术概述在任何⼀款事件驱动型的CPU⾥⾯都应该会有中断系统,因为中断就是为响应某种事件⽽存在的。
中断的灵活应⽤不仅能够实现想要的功能,⽽且合理的中断安排可以提⾼事件执⾏的效率,因此中断在单⽚机应⽤中的地位是⾮常重要的。
单⽚机中断(Interrupt)是硬件驱动事件,它使得CPU暂停当前的主程序,转⽽去执⾏⼀个中断服务⼦程序。
为了更形象地理解中断,下⾯以学⽣上⾃习时接电话为例阐述⼀下中断的概念。
单⽚机的中断系统有5个中断源、2个中断优先级,可实现两级中断服务程序嵌套。
如果单⽚机没有中断系统,单⽚机的⼤量时间可能会浪费在查询是否有服务请求发⽣的定时査询操作上。
采⽤中断技术完全消除了单⽚机在査询⽅式中的等待现象,⼤⼤地提⾼了单⽚机的⼯作效率和实时性。
单⽚机中断系统结构及中断控制中断系统结构图如图5-2所⽰。
由图5-2可见,MCS-51中断系统共有5个中断请求源:INT0——外部中断请求0,中断请求信号由INT0引脚输⼊。
定时/计数器T0计数溢出发出的中断请求。
INT1——外部中断请求1,中断请求信号由INT1引脚输⼊。
定时/计数器T1计数溢出发出的中断请求。
串⾏⼝中断请求。
中断优先级从⾼到底排列。
单⽚机如何知道有中断请求信号?是否能够响应该中断?若5个中断源请求信号同时到来,单⽚机如何响应?这些问题都可以由中断寄存器来解决。
单⽚机中断寄存器有中断标志寄存器TCON和SCON、中断使能寄存器IE和中断优先级寄存器IP,这些寄存器均为8位。
中断标志寄存器5个中断请求源的中断请求标志分别由TCON和SCON的相应位锁存,单⽚机通过这些中断标志位的状态便能知道具体是哪个中断源正在申请中断。
TCON寄存器TCON寄存器为定时/计数器的控制寄存器,字节地址为88H,可位寻址。
特殊功能寄存器TCON的格式如图5-3所⽰。
TCON各标志位功能如下。
TF1——定时/计数器T1的溢出中断请求标志位。
51单片机之中断的实现过程单片机中断是一种特殊的事件处理机制,它可以在执行程序的过程中,根据预定的条件触发相应的中断服务程序,处理特定的事件。
在单片机中断的实现过程中,主要包括中断源、中断向量表、中断控制器和中断服务程序等几个方面。
首先,中断源是指能够引发中断的事件或条件,例如定时器溢出、外部硬件触发、串口接收数据等。
当中断源满足预设的条件时,会向单片机发送一个中断请求信号。
其次,中断向量表存储了每种中断所对应的中断服务程序的入口地址。
当中断请求信号到达单片机后,单片机会根据中断请求信号的种类,在中断向量表中查找相应的中断服务程序的入口地址,并将程序的执行转向该入口地址。
接下来,中断控制器是用于管理多个中断源的硬件模块,它可以对多个中断源的中断请求信号进行优先级排序和屏蔽操作,以确保系统能够正确地响应和处理中断请求。
中断控制器通常包括中断请求信号的触发电路、中断优先级编码器和屏蔽寄存器等。
当中断请求信号被中断控制器接受后,中断控制器会根据优先级规则确定当前要响应的中断源,并向单片机发送一个中断确认信号。
单片机接收到中断确认信号后,会将程序的执行转向中断向量表中相应中断源所对应的中断服务程序入口地址,并将当前的程序状态保存到堆栈或特定的寄存器中,以便在中断服务程序执行完毕后能够返回到原来的执行点。
最后,中断服务程序是中断响应的核心部分,它是一个特殊的子程序,用于处理特定的中断事件。
中断服务程序通常包括以下几个步骤:1.环境保存:在进入中断服务程序之前,需要先保存当前的程序状态,一般是将相关寄存器的值压入堆栈,以便在服务程序执行完毕后能够恢复现场。
2.中断处理:根据中断源的具体需求,进行相应的中断处理操作,比如读取外设的数据、更新相关的标志位或寄存器等。
3.状态更新:根据中断处理的结果,更新相关的状态信息。
4.环境恢复:在中断服务程序执行完毕后,需要将之前保存的程序状态恢复,一般是从堆栈中弹出相关寄存器的值,以便返回到原来的执行点。
51单片机中断系统程序实例(STC89C52RC)51单片机有了中断,在程序设计中就可以做到,在做某件事的过程中,停下来先去响应中断,做别的事情,做好别的事情再继续原来的事情。
中断优先级是可以给要做的事情排序。
单片机的学习不难,只要掌握学习方法,学起来并不难。
什么是好的学习方法呢,一定要掌握二个要点:1. 要知道寄存器的英文全拼,比如IE = interrupt中断不知道全拼,要去猜,去查。
这样就可以理解为什么是这个名称,理解了以后就不用记忆了。
2. 每个知识点要有形像的出处比如看到TF0,脑子里马上要形像地定位到TCON寄存器的某位看到ET0, 马上要形像地定位到IE寄存器的第2位/tuenhai/独家揭秘:形像是记忆的最大技巧。
当人眼看到某个图时,是把视觉信号转化成电信号,再转化成人能理解的形像。
当我们回忆形像时,就是在重新检索原先那个视觉信号,并放大。
在学习过程中,不断练习检索、放大信号,我们的学习能力就会越来越强。
写程序代码时,也要把尽量把每行代码形像化。
51单片机内中断源8051有五个中断源,有两个优先级。
与中断系统有关的特殊功能寄存器有IE(中断允许寄存器)、IP(中断优先级控制寄存器)、中断源控制寄存器(如TCON、SCON的有关位)。
51单片机的中断系统结构如下图(注意,IF0应为TF0):8052有6个中断源,它比8051多一个定时器/计数器T2中断源。
8051五个中断源分别是:(1)51单片机外部中断源8051有两个外部中断源,分别是INT0和INT1,分别从P3.2和P3.3两个引脚引入中断请求信号,两个中断源的中断触发允许由TCON的低4位控制,TCON的高4位控制运行和溢出标志。
INT0也就是Interrupt 0。
在这里应该看一下你的51单片机开发板的电路原理图。
离开形像的记忆是没有意义的。
读到上面这句,你应该回忆起原理图上的连接。
任何记忆都转化为形像,这是学习的根本原理,我们通过学习单片机要学会这种学习方法,会让你一辈子受益无穷。
实验四-MCS-51单片机外部中断实验实验目的:1. 学习MCS-51单片机的外部中断原理和使用方法;2. 掌握如何通过硬件中断和软件中断实现MCS-51单片机的响应机制;3. 了解MCS-51单片机外部中断的实际应用。
实验器材:MCS-51单片机开发板、按键开关、调试器。
实验原理:MCS-51单片机通过INT0和INT1两个硬件中断引脚实现外部中断。
当INT0外部中断线检测到低电平信号时,中断向量为0x0003;当INT1外部中断线检测到低电平信号时,中断向量为0x0013。
通过配置中断控制寄存器IE和TCON,可以实现对外部中断的使能、触发方式和优先级等的控制。
MCS-51单片机还可以通过软件方式实现外部中断,即通过软件方式扫描外部信号,并在检测到信号发生变化时触发相应的中断处理程序。
实现软件中断的方法是使用定时器功能,通过定时器中断触发中断服务程序,该程序扫描外部信号,并根据需要触发软件中断。
实验步骤:1. 将开发板上的按键开关连接到开发板的P3.2引脚。
按键开关按下时,P3.2引脚被拉低,可以触发外部中断。
2. 打开Keil μVision5软件,新建工程,选择芯片型号为STC89C52,保存并命名为“Exp4”。
3. 在主函数中声明中断函数,并在中断函数中打印提示信息。
4. 在主函数中初始化中断控制寄存器IE和TCON,开启INT0外部中断,并将中断优先级设置为最高。
5. 在主函数中使用无限循环,来保持程序一直运行,并定时打印提示信息,以验证程序是否正常运行。
6. 烧录程序到开发板上,先在开发板上不按下按键,观察是否正常打印提示信息。
然后按下按键,观察是否触发外部中断,进入中断函数并打印提示信息。
实验代码:#include<STC89C52.h>#include<stdio.h>// 定义外部中断0的中断服务函数void Interrupt0() interrupt 0{printf("External interrupt 0 has occured!\n");}// 打印提示信息printf("Program is running...\n");while(1){// 定时打印提示信息printf("Hello!\n");delay_ms(1000);}}注意事项:1. 写中断程序时,一定要注意将中断函数的声明放在程序开头,否则可能会出现中断无法触发的情况;2. 在使用中断相关功能的时候,务必仔细阅读数据手册中的相关章节,以确保正确使用并且避免出现不必要的错误;3. 在进行外部中断实验的时候,可以使用按键开关、光敏电阻等外部器件来模拟外部信号的变化,以测试程序的正确性。
51单片机各中断初始化及子程序模板/************************************************************ *51单片机各中断初始化及子程序模板,几乎包括了传统51单片机的全部中断*1、外部中断0*2、定时器中断0*3、外部中断1*4、定时器中断1*5、串行中断*6、定时器中断2---本中断在52时才有*以上所有中断已经在Keil软件环境上经过测试,工作正常*在使用定时中断的时候需要根据实际需要重设定时器的初值和工作方式*在串行通讯中,使用11.0592M晶振,通讯波特率为9600bps*为了保证文件的单一和方便保存,本项目只用了一个文件,没有进行模块化处理,在实际应用中不建议这样做*本程序在UE11.00b下编辑,在KeilV3.23(C8.01)下编译调试*本程序仅供初学者参考使用,细节问题未涉及,在实际项目中请谨慎使用*Author:大灵通*昌宁科技,欢迎您提出宝贵意见!*2006-12-7 15:05,OK!*************************************************************/#include<reg52.h>//如果是使用51单片机,则应该是reg51.h,//且不能使用定时器2#include<intrins.h>//以下两个包含文件在本代码中实际不需要,#include<absacc.h>//但经常用到,所以列出#define uchar unsigned char#define uint unsigned int#define TimeDelay 2//程序所用变量声明bit Time0Int;bit Int0Flag,Int1Flag;uchar Time0Count,Time1Count,Time2Count;uchar ReceiveData;//程序所用函数声明void McuInitial(void);void InitialTime0(void);void InitialTime1(void);void InitialTime2(void);void IntialSerialComm(void);void SerialSend(uchar SendData);void delay(uint n);/************************************************************ *Function: 主函数*parameter:*Return:*Modify:*************************************************************/ void main(void){uchar i;McuInitial();delay(TimeDelay);while(1){if(Int0Flag==1)//各中断的具体处理{Int0Flag = 0;}if(Int1Flag==1){Int1Flag = 0;}if(Time0Count==5){Time0Count = 0;}if(Time1Count==5){Time1Count = 0;}if(Time2Count==5){Time2Count = 0;}SerialSend(i);i++;if(i>=0xff)i=0;}}/*************************************************************Function: 单片机初始化处理*parameter:*Return:*Modify:*************************************************************/ void McuInitial(void){//外部中断0初始化IT0 = 1;EX0 = 1;//外部中断1初始化IT1 = 1;EX1 = 1;InitialTime0();//定时器0初始化// InitialTime1();//定时器1初始化InitialTime2();//定时器2初始化IntialSerialComm();//串行中断初始化,占用定时器1,//如果用串行中断,定时器1不能用于定时EA = 1;//打开中断}/************************************************************ *Function: 定时器1初始化*parameter:*Return:*Modify:*************************************************************/ void InitialTime0 (void){TMOD |= 0x01;//16位定时器TH0 = 0x06;//8msTL0 = 0xed;ET0 = 1;//使能中断TR0 = 1;//打开定时器}/************************************************************ *Function: 定时器1初始化*parameter:*Return:*Modify:*************************************************************/void InitialTime1 (void){TMOD |= 0x10;//16位定时器TH1 = 0x06;//8msTL1 = 0xed;ET1 = 1;//使能中断TR1 = 1;//打开定时器}/************************************************************ *Function: 定时器2初始化,本中断仅在52时才有*parameter:*Return:*Modify:*************************************************************/ void InitialTime2 (void){T2CON=0x04;RCAP2H=0x04;RCAP2L=0x00;ET2 = 1;}/************************************************************ *Function: 串行中断初始化*parameter:*Return:*Modify:*************************************************************/ void IntialSerialComm(void){TMOD |= 0x20;SCON=0xf0;TH1=0xfd;//fdTL1=0xfd;//fdTR1=1;ES=1;}/************************************************************ *Function: 外部中断0中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void Interrupt0 (void) interrupt 0Int0Flag = 1;}/************************************************************ *Function: 外部中断1中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void Interrupt1 (void) interrupt 2{Int1Flag = 1;}/************************************************************ *Function: 定时器0中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void InterruptTime0(void) interrupt 1{TH0 = 0x06;//8msTL0 = 0xed;Time0Count++;}/************************************************************ *Function: 定时器1中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void InterruptTime1(void) interrupt 3{TH1 = 0x06;//8msTL1 = 0xed;Time1Count++;}/************************************************************ *Function: 定时器2中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void InterruptTime2(void) interrupt 5TF2=0;Time2Count++;}/************************************************************ *Function: 串行接收中断服务子程序*parameter:*Return:*Modify:*************************************************************/ void InterruptSerialComm(void) interrupt 4{if(RI){RI = 0;ReceiveData = SBUF;}}/************************************************************ *Function: 串行发送程序*parameter:*Return:*Modify:*************************************************************/ void SerialSend(uchar SendData){SBUF = SendData;while(TI==0);TI = 0;}/************************************************************ *Function: 延时*parameter:*Return:*Modify:*************************************************************/ void delay(uint n){while(n!=0){n--;}。
实验五、中断实验
1、实验目的:了解单片机的中断系统,学习汇编语言中断程序的编程方法与调试技巧。
2、实验内容:单片机的INT0和INT1分别接了两个外部中断,当INT0引脚有中断时,点亮发光二极管D1,当INT1引脚有中断时,点亮发光二极管D2。
3、实验程序框图
4、实验电路图
5、实验步骤:SW1从高电平变为低电平时,点亮发光二极管D1;SW2从高电平变为低电
平时,点亮发光二极管D2。
调试程序,并运行。
观察发光二极管点亮情况。
6、思考:程序中的外部中断的触发方式是哪一种?修改程序使外部中断的触发方式改变。
7、程序清单:
ORG 0000H
AJMP MAIN
ORG 0003H
AJMP SERVE
ORG 0013H
AJMP SERVE1
MAIN: ORL P1 , #0FFH ;;灯全灭,准备读入
SETB IT0; ;选择边沿触发方式
SETB EX0; ;允许INT0中断
SETB IT1; ;选择边沿触发方式
SETB EX1; ;允许INT0中断
SETB EA ;;CPU开中断
AJMP $ ;;等待中断
;中断服务子程序为:
SERVE: MOV A,#0F7H
MOV P1,A
RETI
SERVE1: MOV A,#0EFH
MOV P1,A
RETI。