中断小结.docx

上传人:b****8 文档编号:11388069 上传时间:2023-02-28 格式:DOCX 页数:27 大小:290.47KB
下载 相关 举报
中断小结.docx_第1页
第1页 / 共27页
中断小结.docx_第2页
第2页 / 共27页
中断小结.docx_第3页
第3页 / 共27页
中断小结.docx_第4页
第4页 / 共27页
中断小结.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

中断小结.docx

《中断小结.docx》由会员分享,可在线阅读,更多相关《中断小结.docx(27页珍藏版)》请在冰豆网上搜索。

中断小结.docx

中断小结

关于中断部分的小结

(1):

中断是单片机和其他各种微处理器中必不可少的一部分之一,在此对51单片机中断有用的部分加以小结。

小结

(1)主要是对中断部分,对中断编程常用的特殊功能寄存器加以罗列小结,这一部分是中断思想的核心,以后的编程全部围绕这些寄存器进行。

以后对于中断的编程及其寄存器设置可参考这一部分内容。

一、关于51中断:

对于51单片机中断子程序的编写我们必须知道大多51单片机芯片有5个中断源,有2个中断优先级,每个中断源的优先级可以编程控制。

5个中断源分别是:

外部中断0,由INT0/P3.2输入

外部中断1,由INT1/P3.3输入

定时器/计数器0,溢出中断请求;

定时器/计数器1,溢出中断请求;

串行口发送/接收,中断请求;

这里给出一个非常经典的中断源图,根据这个图我们就能大概知道中断的具体过程,以及在中断编程中哪些地方需要设置。

很明显的,5个中断源可以分为三类,外部中断,定时器中断和串口中断;并且我们需要对TCON,IE,IP等进行设置。

二、几个重要的特殊功能寄存器:

1.中断允许控制寄存器IE

CPU对中断系统所有中断以及某个中断源的开放和屏蔽是由中断允许寄存器IE控制的。

EX0(IE.0),外部中断0允许位;

ET0(IE.1),定时/计数器T0中断允许位;

EX1(IE.2),外部中断1允许位;

ET1(IE.3),定时/计数器T1中断允许位;

ES(IE.4),串行口中断允许位;

EA(IE.7),CPU中断允许(总允许)位。

2.控制寄存器TCON

TCON的低4位用于控制外部中断,TCON的高4位用于控制定时/计数器的启动和中断申请。

其格式如下:

TF1(TCON.7):

T1溢出中断请求标志位。

T1计数溢出时由硬件自动置TF1为1。

CPU响应中断后TF1由硬件自动清0。

T1工作时,CPU可随时查询TF1的状态。

所以,TF1可用作查询测试的标志。

TF1也可以用软件置1或清0,同硬件置1或清0的效果一样。

TR1(TCON.6):

T1运行控制位。

TR1置1时,T1开始工作;TR1置0时,T1停止工作。

TR1由软件置1或清0。

所以,用软件可控制定时/计数器的启动与停止。

TF0(TCON.5):

T0溢出中断请求标志位,其功能与TF1类同。

TR0(TCON.4):

T0运行控制位,其功能与TR1类同。

IE1(TCON.3),外部中断1中断请求标志位。

IT1(TCON.2),外部中断1触发方式控制位。

当IT0=0时,为电平触发方式。

当IT0=1时,为边沿触发方式(下降沿有效)。

IE0(TCON.1),外部中断0中断请求标志位。

IT0(TCON.0),外部中断0触发方式控制位。

当IT0=0时,为电平触发方式。

当IT0=1时,为边沿触发方式(下降沿有效)。

3.串口控制寄存器SCON

RI(SCON.0),串行口接收中断标志位。

当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI向CPU申请中断。

注意,RI必须由软件清除。

TI(SCON.1),串行口发送中断标志位。

当CPU将一个发送数据写入串行口发送缓冲器时,就启动了发送过程。

每发送完一个串行帧,由硬件置位TI向CPU申请中断。

注意,TI必须由软件清除。

4.中断优先级寄存器IP

51单片机有两个中断优先级,即可实现二级中断服务嵌套。

每个中断源的中断优先级都是由中断优先级寄存器IP中的相应位的状态来规定的。

PX0(IPH.0),外部中断0优先级设定位;

PT0(IPH.1),定时/计数器T0优先级设定位;

PX1(IPH.2),外部中断0优先级设定位;

PT1(IPH.3),定时/计数器T1优先级设定位;

PS(IPH.4),串行口优先级设定位;

PT2(IPH.5),定时/计数器T2优先级设定位

三、其他相关:

1.P3口复用功能;

51单片机P3口除了作为通用I/O口外,还具有复用的特殊功能,而这些功能通常都和各种中断有关。

P3.0RXD(串行数据输入口)

P3.1TXD(串行数据输出口)

P3.2INT0(外部中断0)

P3.3INT1(外部中断1)

P3.4T0(定时器/计数器0外部输入)

P3.5T1(定时器/计数器1外部输入)

P3.6WR(外部数据存储器写脉冲)

P3.7RD(外部数据存储器读脉冲)

2.中断排队和中断服务入口表

同一优先级中的中断申请不止一个时,则有中断优先权排队问题。

同一优先级的中断优先权排队,由中断系统硬件确定的自然优先级形成,其排列如所示:

3.中断函数写法:

在C51中中断函数的完整语法如下:

返回值函数名({参数})[模式][重入]interruptn[usingn]

Interrupt后面接一个0-31的整数,不允许用表达式。

例:

voidINT_TEST()interrupt0using0//外部中断0/1编号(0/2)

{

…………

}

中断不允许用于外部函数,小型程序中的中断程序使用默认的寄存器0,

不带using属性的可能会取得更高的效率。

其实今后对于中断的应用除了核心思想外,无非是对上述特殊功能寄存器的设置。

 

关于中断部分的小结

(2):

中断是单片机和其他各种微处理器中必不可少的一部分之一,在此对51单片机中断有用的部分加以小结。

小结

(2)主要是针对外部中断部分,总结外部中断对特殊功能寄存器的设置以及程序的编写流程。

此外这里重点介绍一些中断扩展的方法。

外部中断信号是由P3口的P3.2和P3.3两个管脚输入的。

外部中断程序编写流程:

一、外部中断初始化:

在使用外部中断前,先要设置相关特殊功能寄存器,即初始化过程;

1.开CPU总中断:

EA=1;

2.开外部中断:

开外部中断0:

EX0=1;

开外部中断1:

EX1=1;

3.设置外部中断触发方式:

外部中断0触发控制位IT0;

当IT0=0时,为电平触发方式

当IT0=1时,为边沿触发方式(下降沿有效)

外部中断1触发控制位IT1(同上);

4.外部中断优先级设置(可以不设置)

PX0=1;

PX1=1;

举例如下:

voidinterrupt_init(void)//中断初始化

{

EA=1;//开总中断

EX0=1;//开外部中断0

EX1=1;//开外部中断0

IT0=1;//外部中断0下降沿触发方式

IT1=0;//外部中断1电平的触发方式

}

二、主程序

主程序部分为你需要实现的功能,这部分和中断几乎没什么太大关联,只不过,在执行主程序时,如果从外部来一个外部中断信号,不得不放弃现在执行的任务而转而执行中断子程序;

三、中断子程序

这部分主要便是对请求中断成功后进入中断后,你需要执行什么任务;

外部中断子程序写法如下:

voidINT_0()interrupt0using0//外部中断0子程序

{

LED0=~LED0;//这句话代换成你所需要功能的C代码

}

voidINT_1()interrupt2using2//外部中断1子程序

{

LED1=0;//这句话代换成你所需要功能的C代码

}

完整外部中断例程代码如下:

#include

#defineucharunsignedchar

sbitwr=P3^6;

sbitLED0=P1^0;

sbitLED1=P1^1;

voidinterrupt_init(void)//中断初始化

{

EA=1;//开总中断

EX0=1;//开外部中断0

EX1=1;//开外部中断0

IT0=1;//外部中断0下降沿触发方式

IT1=0;//外部中断1电平的触发方式

}

voidmain(void)

{

wr=0;//低电平时第三列为独立按键

interrupt_init();

while

(1)

{

LED1=1;

}

}

voidINT_0()interrupt0using0//外部中断0子程序

{

LED0=~LED0;

}

voidINT_1()interrupt2using2//外部中断1子程序

{

LED1=0;

}

实现功能:

初始灯1和2全灭;

当按下P3.2对应键盘1(矩阵键盘第三行第三列),向下降沿触发外部中断0子程序,按一次键1松手灯1亮,再按一次键1松手灯1灭;

当按下P3.3对应键盘2(矩阵键盘第四行第三列),送入低电平信号触发外部中断1子程序,按下键2灯2亮,松手灯2灭。

中断的扩展:

一、定时器扩展为外部中断源

在51单片机内部有两个定时器/计数器T0和T1,在满足中断响应的情况下,当T0或T1的计数值从全1(0xFFFF)状态进入全0(0x0000)时,此时就会产生定时器溢出中断。

根据以上分析,我们只需要把计数器的初值设置为0xFFFF,那么只要计数输入端再来一个脉冲就可以产生溢出中断申请。

设想我们把外部中断输入连接到计数器输入端,就可以利用外部中断申请的负脉冲产生定时器溢出中断申请,而转移到相应中断服务程序入口地址。

只要在(0x000B或0x001B)处存放外部中断服务子程序,就可以达到目的。

具体步骤如下:

1.将定时/计数器T0或T1的计数输入端(P3.3或P3.4)作为扩展外部中断请求输入端。

2.置定时/计数器T0或T1为工作模式2,计数方式—8位自动装载方式。

3.定时/计数器T0或T1的高8位和低8位都预置为全1。

4.在相应的中断服务程序入口(0x000B或0x001B)处存放外部中断服务子程序。

二、软件查询扩展外部中断源

当需要的外部中断源较多,采用第一种方法仍不能满足实际需求,我们可以采用这种方法。

设有四个外部中断源,INT00、INT01、INT02、INT03,这四个外部中断请求源的输入端通过一个4路的或非门连接到51单片机的/INT0引脚输入端。

只要4个外部中断请求源中有一个或者一个以上的有效(高电平),就会产生一个负的/INT0信号向51单片机发出中断申请。

为了确认在/INT0有效时究竟是INT00、INT01、INT02、INT03中哪个发出的中断申请,可以通过软件查询的方法来确认。

将四个中断源输入端INT00、INT01、INT02、INT03分别接到P1.0~P1.3这四个引脚上。

一旦响应中断,在中断服务程序中CPU通过软件查询方法对P1.0~P1.3这四条线的电位进行检测,以确认提出中断申请的中断源。

当扩展的4个外部中断源优先级不同时,软件查询的顺序也应按照优先级的的由高到低顺序进行。

设扩展的4个外部中断源的优先级由高到低的顺序是INT00到INT03,则软件查询顺序为P1.0到P1.3。

 

关于中断部分的小结(3):

中断是单片机和其他各种微处理器中必不可少的一部分之一,在此对51单片机中断有用的部分加以小结。

小结(3)主要是针对定时器中断部分,总结定时器特殊功能寄存器的设置以及程序的编写流程。

一、定时器/计数器简介:

51单片机中至少有二个16位内部的定时器/计数器。

定时器/计数器0和1既可以编程为定时器使用,也可以编程为计数器使用。

若是计数内部的晶振时钟,则是定时器。

若是计数单片机的外部I/O口脉冲信号,则是计数器。

51的T/C是加1计数器,定时器实际上也是工作在计数的方式下,只不过是对固定频率的脉冲进行计数。

对于脉冲周期是固定的,由计数值可以计算出时间。

在定时器/计数器工作在定时状态时,是对晶振的频率12分频脉冲计数,即每个机器周期计数值加1,计数率=1/12(晶振频率FOSC),当晶振为12M的时候,计数率=1M,每1US计数值加1。

当定时器/计数器工作在计数模式下,计数的脉冲来自外部输入引脚T0(P3.4)或T1(P3.5)。

当T0或T1脚上有负的跳变时计数值加1,识别引脚上的负跳变需要二个机器,即24个振荡周期。

所以在T0或T1输入的可计数外部脉冲的最高频率为1/24(晶振频率FOSC)。

当晶振为12M的时候,最高计数率为500KHZ,高于此频率计数值就会出错。

二、与定时器/计数器有关的寄存器

1.定时器工作方式寄存器TMOD

51单片机定时/计数器的工作由两个特殊功能寄存器控制。

TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。

工作方式寄存器TMOD用于设置定时/计数器的工作方式,低四位用于T0,高四位用于T1。

其格式如下:

GATE:

门控位。

GATE=0时,只要用软件使TCON中的TR0或TR1为1,就可以启动定时/计数器工作;GATA=1时,要用软件使TR0或TR1为1,同时外部中断引脚或也为高电平时,才能启动定时/计数器工作。

即此时定时器的启动多了一条件。

TMOD.6:

定时/计数模式选择位。

TMOD.6=0为定时模式;TMOD.6=1为计数模式。

M1M0:

工作方式设置位。

定时/计数器有四种工作方式,由M1M0进行设置。

2.计数寄存器TH和TL;

T/C是16位,计数寄存器由TH高8位和TL低8位构成。

在特殊功能寄存器(SFR)中,对应定时器/计数器0的为TH0、TL0。

对应定时器/计数器1的为TH1、TL1。

定时器/计数器的初始值由TH0、TL0和TH1、TL1设置。

三、定时器几种工作方式:

1.工作方式0:

方式0为13位的定时器计数器。

TH中存放8位,TL中存放低5位(只用低5位,高3位未用),满计数为213。

初值计算:

T定时时间=(8192-X初值)*时钟周期*12

2.工作方式1:

方式1和方式0基本上是相同的,唯一的区别是计数的寄存器是16位的,由TH和TL寄存器各提供8位,满计数值为216。

初值计算:

T定时时间=(65536-X初值)*时钟周期*12

*注意:

工作在方式0或方式1的时候,当溢出生需要再次重新装入计数值。

3.工作方式2:

方式2是8位的可自动重装载的方式,满计数为28。

方式2中TH和TL被当作二个8位计数器,计数过程中,TH寄存器8位初值保持不变,由TL进行8位计数,当计数溢出的时候,除了产生溢出中断请求外,还自动将TH中的初值重装在到TL中,不会像方式0或方式1再装入数据。

除了这个自动重装载的不同之外,其它的和方式0完全一样。

初值计算:

T定时时间=(256-X初值)*时钟周期*12

4.工作方式3:

方式3只适合于定时器/计数器0,当定时器0工作于方式3时,TH0和TL成为2个独立的计数器,这时TL0可作定时器/计数器,占用定时器0TCON和TMOD寄存器中的控制位和标志位,而TH0只能做定时器用,占用原定时器1的资源和TR1TF1。

在这种情况下定时器1仍可以用于方式0、1、2,但不能使用中断方式。

因为定时器1的TR1、TF1和T1的中断源已被定时器0占用,计数器溢出时只能将输出送往串行口,这种情况下,定时器1一般做串行口波特率发生器或不需要中断的场合。

初值计算:

TL0定时时间=(256-TL0初值X)*时钟周期*12

TH0定时时间=(256-TH0初值X)*时钟周期*12

按公式计算完初值后转换为16进制,分别送入TH和TL中。

四、定时器程序编写流程:

1.定时器初始化:

a.设置定时器工作方式:

给TMOD赋值;

b.定时器装初值(将初值送入TH,TL中);

c.开CPU总中断:

EA=1;

d.开定时器中断:

开定时器0中断:

ET0=1;

开定时器1中断:

ET1=1;

e.用软件启动定时器:

启动定时器0:

TR0=1;

启动定时器1:

TR1=1;

举例如下:

voidInit_INT(void)

{

TMOD=0x61;//给TMOD赋值;

TH0=0xD5;//定时器装初值,定时10MS

TL0=0x9E;

TH1=255;//给计数器装初值,计数1次

TL1=255;

EA=1;//开总中断;

ET0=1;//开定时器0中断;

ET1=1;//开定时器1中断;

TR0=1;//启动定时器0;

TR1=1;//启动定时器1;

}

2.主程序:

主程序部分为你需要实现的功能,设置当定时器或计数器溢出时要执行的任务;当然也可以把任务放到中断程序中去执行。

3.定时器中断子程序:

这部分主要便是对定时器/计数器溢出中断后,需要执行什么任务;可以在其中设置标志变量让其在溢出时自加,当自加到N时,可以达到T*N的长时间定时,同理可以达到X*N的计数值。

外部中断子程序写法如下:

voidTIME0()interrupt1using1//定时器0中断

{

TH0=0xD5;//工作方式0和1在溢出后要重新装入初值

TL0=0x9E;

Time++;//设置标志变量

if(Time==100)//定时10ms*100=1s

{

Time=0;

LED0=~LED0;//代换成你所需要功能的C代码

}

}

voidTIME1()interrupt3using3//定时器1中断

{

LED1=~LED1;//代换成你所需要功能的C代码

}

完整定时器中断例程代码如下:

#include

#defineuintunsignedint

#defineucharunsignedchar

sbitLED0=P1^0;

sbitLED1=P1^7;

sbitP3_3=P3^3;

ucharTime=0;

voidInit_INT(void);

voidmain(void)

{

P3_3=0;

Init_INT();

while

(1);

}

//定时器0设置为16位定时器,计数器1设置为8位计数器.

voidInit_INT(void)

{

TMOD=0x61;

TH0=0xD5;//定时10MS

TL0=0x9E;

TH1=255;//计数1次

TL1=255;

EA=1;

ET0=1;

ET1=1;

TR0=1;

TR1=1;

}

voidTIME0()interrupt1using1

{

TH0=0xD5;

TL0=0x9E;

Time++;

if(Time==100)

{

Time=0;

LED0=~LED0;

}

}

voidTIME1()interrupt3using3

{

LED1=~LED1;

}

实现功能:

LED1灯1亮1秒灭1灭;LED8灯按下4行2列键后亮,再按一次灭,循环往复;

注:

部分型号单片机有定时器2,一般情况下定时器0,1可以满足应用要求,这里暂时不做总结。

 

关于中断部分的小结(4):

中断是单片机和其他各种微处理器中必不可少的一部分之一,在此对51单片机中断有用的部分加以小结。

小结(4)主要是针对串口中断部分,阐述串口通信相关内容以及对特殊功能寄存器的设置以及串口通信程序的编写流程。

我们可以利用串口向电脑发送数据,也可以用串口接收电脑的数据。

有了这个接口我们可以利用它来设计很多东西,数据采集,多机通信,远程控制等。

所以串口通信时很重要的一部分。

一、关于串口通信;

我们可以利用串口向电脑发送数据,也可以用串口接收电脑的数据。

有了这个接口我们可以利用它来设计很多东西,数据采集,多机通信,远程控制等。

所以串口通信时很重要的一部分。

对于通信,我们需要了解一些概念,比如串行与并行通信,同步与异步通信以及单工半双工和双工传输等,除此之外我们还需要了解传输方法、比特率以及232、485通信的相关知识,这里不加赘述。

二、与串行通信有关的特殊功能寄存器;

1.串口控制寄存器SCON;

D7

D6

D5

D4

D3

D2

D1

D0

SM0

SM1

SM2

REN

TB8

RB8

TI

RI

SM2:

多机通信控制位

SM2为1时,只有接收到了第9位数据(RB8)为1,RI才置位。

SM2为0时,接收到字符RI就置位。

REN串行口接收允许位

REN为1,允许串行口接收。

REN为0,禁止串行口接收。

TB8:

方式2和方式3时,为发送的第9位数据,可以作奇偶校验位。

RB8:

方式2和方式3时,为接收到的第9位数据,方式1时,为接收到的停止位。

TI发送中断标志位

由硬件置位,必须由软件清零。

RI接收中断标志位

由硬件置位,必须由软件清零

2.电源控制寄存器PCON;

D7

D6

D5

D4

D3

D2

D1

D0

SMOD

GF1

GF0

PD

IDL

PCON的第7位SMOD是与串行口的波特率设置有关的选择位。

SMOD串行口波特率加倍位:

当SMOD=1时,在方式1和方式3时,波特率=定时器1溢出率/16;方式2波特率为FOSC/32。

当SMOD=0时,在方式1和方式3时,波特率=定时器1溢出率/32;方

式2波特率为FOSC/64。

GF0、GF1两个通用标志位

PD、IDLCHMOS器件的低功耗控制位

三、串口工作方式;

1.方式0:

方式0为移位寄存器的输入/输出方式。

串行数据通过RXD输入/输出,TXD则用于输出移位时钟脉冲。

方式0时,收发的数据为8位,低位在前。

波特率固定为FOSC/12,其中FOSC为单片机外接晶振频率。

发送是以写SBUF寄存器的指令开始的,8位输出结束时TI被置位。

方式0接收是在REN=1和RI=0同时满足时开始的。

接收的数据装入SBUF中,结束的时候RI被置位。

移位寄存器的方式在用于硬件扩展接口的方式时比较适用,串行口可外接一片移位寄存器74HC164构成输出接口电路;串行口外接一片74HC165可以构成输入接口电路。

任何数目的移位寄存器都可以串接于输入和输出,通过对SBUF进行读写。

(串并转换)

移位寄存器的方式还可以用于两个单片机之间的通信。

与通常波特率9600相比,短距离1M的通信速度还是相当的快。

2.方式1:

方式1是10位异步通信方式,有1位起始位“0”、8位数据位和1位停止位“1”。

其中的起始位和停止位是自动插入的。

任何的一条以SBUF为目的寄存器的指令都启动一次发送,发送的条件是TI=1.发送完毕后置位TI。

方式1的接收前提条件是SCON中的REN为1,同时还要满以下二个条件:

RI=0和SM2=0或接收到的停止位为1。

本次接收有效,将其装入SBUF和RB8位。

否则放弃接收结果。

方式1的波特率是可变的,波特率可由以下计算公式来计算得到:

方式1波特率=2SMOD*(定时器1的溢出率)/32。

其中的SMOD为PCON的最高位。

定时器1的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1