单片机C语言中断1

合集下载

单片机C语言编程中没有到的中断而中断全部开启的错误你了解吗

单片机C语言编程中没有到的中断而中断全部开启的错误你了解吗

单片机C语言编程中没有到的中断而中断全部开启的错误你了解吗我们知道,51单片机有几个不同的中断源。

对于一个系统的设计,通常在初始化程序里面需要定义各个中断等
比如:
TMOD = 0x21; // T1 mode 2 T0,mode 1 //GATE C/T M1 M0 GATE C/T M1 M0
TL1 = 0xfd; // 0xfa=4800 bps 0xfd=9600 bps
TH1 = 0xfd;
TH0 = -(10000/256);
TL0 = -(10000%256);
PCON = 0; //波特率不变等设置
SCON = 0x50; //串口1方式1,允许接收
IT0 = 1; //外部中断0下降沿有效
IT1 = 1; //外部中断1下降沿有效
TR0 = 1; //启动定时器0
TR1 = 1; //启动定时器1
ET0 = 1; //开放定时器0中断
ES = 0; //串行中断
EX0 = 0; //外部中断0
EX1 = 0; //外部中断1
EA = 1;
可以看到,我们一共有:定时中断0,定时中断1,外部中断0,外部中断1,串行中断。

这五个中断是最基本的中断源。

对于各位的设计,我相信这一段代码在不同的程序重通常都不会自己重复敲打进去了。

应该是从以前某个代码中直接复制过来吧。

此时会有一个小问题存在而被你忽略。

之前已经完成的代码中,你很有可能已经使用了全部5个中断,但是,一个刚开发的系统,也许还只是用到了其中的三个或者两个中断,而中断你全部开启了。

这个意味着什么呢?。

51单片机 中断1中断整体介绍

51单片机 中断1中断整体介绍

51 单片机中断1 中断整体介绍
简单介绍--[高手绕过这一段;心急的直接跳到下一部份]
>_>_外部中断请求源:即外部中断0 和1,经由外部引脚引入,在单片机上有两个引脚,外称为INT0、INT1,也就是P3.2、P3.3 这两个引脚
>_单片机内部的中断模块在每个CPU 周期都查询各个中断源的状态,当其
发生预期的中断事件时,通知CPU 将程序跳转到中断服务程序所在的程序存
储器(ROM)地址。

该地址称为中断向量。

中断的实质仍然是查询,只是不需要用户程序查询,不占用CPU 运行时间
而已。

51 系列只有5 个中断向量,5X 系列还增加一个定时器2 的中断向量
地址中断入口中断编号0x0 复位0x3 外部中断00 0xB 定时器01 0x0013 外部中断1 2 0x001B 定时器1 3 0x0023 串口4 0x002B 定时器2(5x 系列新增的)5
>_以INT0 为例:中断模块在每个CPU 时钟周期都查询P3.2 的状态,当输
入的电平由高电平变为低电平时,CPU 的程序运行会立即跳转的到地址
0x03。

处理INT0 中断的代码放在地址为0x03 开始的ROM 区域。

c 语言中采
用一类特殊的函数来实现此代码定位的功能,叫做中断服务函数,格式如下:
void 函数名()interrupt N
函数名可以任意,但一般要用一个有意义的函数名,N 代表中断向量编号。

>_MCS51 中断系统中,中断的允许或禁止是由片内可以进行位寻址的8 位
中断允许寄存器IE 来控制的。

EX0 :外中断0 中断允许。

单片机C语言 笔记

单片机C语言 笔记

单片机C 语言 笔记第三章:单片机内部资源一、中断系统1、基本概念(1)、5个中断源:外部中断源:0INT ,1INT 。

内部中断源为:定时器/计数器0、 1溢出中断,串口中断(T 、R)。

(2)、中断优先部分由中断优先级寄存器IP控制。

EA :中断总允许位。

IE.6:保留位。

ET2:定时器/计数器2溢出中断总允许位。

ES :串行口收、发中断允许为。

EX1:外部中断1(INT1或P3.3)允许位。

ET1:定时器/计数器1溢出中断允许位。

ET0:定时器/计数器0溢出中断允许位。

EX0:外部中断0(INT0或P3.2)允许位。

以上位为0是禁止该类中断,为1时允许该类中断。

X :保留位。

PT2:定时器/计数器2溢出中断优先级设定位。

PS :串行口收、发中断优先级设定位。

PT1:定时器/计数器1溢出中断优先级设定位。

PX1:外部中断1(INT1或P3.3引脚)优先级设定位。

PT0:定时器/计数器2溢出中断优先级设定位。

PX0:外部中断0(INT0或P3.2引脚)优先级设定位。

为0时为低优先级,为1时为高优先级。

4、优先级结构及中断系统时序(1)、优先级IP 可把中断设置为高、低两种优先级遵循:低优先级可以被高优先级中断所 中断,反之不能;中断一旦得到响应,与它同级的中断源不能打断它;当同 时收到多个同级的中断请求时,先执行哪个取决于单片机内部的查询顺序,相当于还存在辅助优先级结构。

外部中断0定时器/计数器0溢出中断外部中断1定时器/计数器1溢出中断串行口定时器/计数器2溢出中断 //从上往下,从高到低5、中断响应6、外部中断源外部中断源:0INT ,1INT触发类型:边沿触发(下降沿)、电平触发(低电平)某中断源申请中断时,会设置中断请求标志,这些标志会在定时器/计数器控制寄存 器TCON 中体现。

三点说明:① 设置为电平触发时,处理器每个指令周期都会查询中断引脚,引脚电平为低是触 发中断。

但是如果输入信号一直为低,那么将一直触发中断。

单片机定时器中断原理和c语言代码详解

单片机定时器中断原理和c语言代码详解

单片机定时器中断原理和C语言代码详解我之前都是用ARM7,单片机基本不会。

但一个项目要用到51,所以克了一下51还是有点模糊,今天调了这个代码之后,对51定时器中断有些心得,拿来和大家共享。

废话不说了,上代码。

#define _1231_C_#include "reg51.h"#include "1231.h"//sbit OE=P2^3;unsigned int SystemTime;void timer0(void) interrupt 1 using 3 //中断部分代码,见下文的释疑{TH0 = 0xdb;TL0 = 0xff;// TF0 = 0;SystemTime++;}void main(){TMOD &= 0xF0;TMOD |= 0x01; //TMOD的值表示定时器工作方式选择TH0 = 0xdb; //写入初始值,初始值可以决定定时多久TL0 = 0xff;//根据下文的木桶比喻的话,如果TH0 = 0x00;TL0 = 0x00;则表示从桶底开始装水。

//TH0 = 0xdb;TL0 = 0xff;可以这样子理解相当于木桶里已经有部分液铅在里面,//TH0和TL0这个两个值表示木桶里液铅的高度,即此时桶里只能从液铅的高度以上开始装水,//TH0 = 0xff;TL0 = 0xff;即表示桶的最高位置.TF0 = 0; //计数到时TF0为1,即当TH0 = 0xff;TL0 = 0xff;再运行一步TF0 = 1;TR0 = 1; //开始计数,从这时起,每运行一步TH0和TL0都会增加,直到TH0 = 0xff;TL0 = 0xff;//相当于开水龙头,如TR0=0则TH0和TL0不变ET0 = 1; //允许定时器0中断EA=1; //开总中断//下面是个死循环,程序里每运行一步TH0和TL0都会增加,当增加到TH0 = 0xff;TL0 = 0xff;//单片机会从死循环里退出,去执行中断部分的代码,即开始运行void timer0(void) interrupt 1 using 3{}//运行完中断部分的代码后,接着继续执行死循环里的代码。

关于单片机 C中断函数

关于单片机 C中断函数

关于单片机 C 中断函数定义中断服务函数函数类型函数名(形式参数) interrupt n [using n]中断号中断源中断向量0 外部中断0 0003H 1 定时器/计数器0 000BH 2 外部中断1 0013H 3 定时器/计数器1 001BH 4 串行口0023Hinterrupt 关键字是不可缺少的,由它告诉编译器该函数是中断服务函数,并由后面的n 指明所使用的中断号。

n 的取值范围为0-31,但具体的中断号要取决于芯片的型号,像AT89C51 实际上就使用0-4 号中断。

每个中断号都对应一个中断向量,具体地址为8n+3,中断源响应后处理器会跳转到中断向量所处的地址执行程序,编译器会在这地址上产生一个无条件跳转语句,转到中断服务函数所在的地址执行程序。

下表是51 芯片的中断向量和中断号。

楼上qmt 已经大致给你介绍清楚了中断函数的定义,值得提出的是,中断函数类型void,说明中断函数是不能有返回值的,这点要明确,所以不要企图让中断函数给你个返回值。

还有,函数名后面括弧内是没有参数的。

这点也需要注意,中断函数不能传递参数。

interrupt 后面的点是中断号。

重点我给你解释下using。

这是C51 编译器扩展的关键字。

用来选择80c51 单片机中不同的寄存器组,你也知道R0-R7 总共有4 组,那么using 后面的数字也就是0- 3 范围里的一个数了。

如果不需要using 的话,编译器会自动选择一组寄存器作为绝对寄存器访问的。

using 对代码是有一定的影响的。

给你说个简单的例子,你可以想下,如果定义void time0() interrupt 1 using 1 假设,我们又在中断里调用了一个delay();这个delay 是起延时作用。

那么,我们就需要确保我们使用的寄存器组是同一组,否则,就会出现混乱。

这样说你能明白么?所以,我建议你,不必要时不要使用using。

不过,你可以试下这个关键字。

单片机C语言函数中断函数(中断服务程序)

单片机C语言函数中断函数(中断服务程序)

个人收集整理-ZQ 1 / 2 在开始写中断函数之前,我们来一起回顾一下,单片机地中断系统. 中断地意思(学习过微机原理与接口技术地同学,没学过单片机,也应该知道),我们在这里就不讲了,首先来回忆下中断系统涉及到哪些问题.文档来自于网络搜索 ()中断源:中断请求信号地来源.(有个内部中断源,,串行口,个外部中断源,(这两个低电平有效,上面地那个横杠不知道怎么加上去))文档来自于网络搜索 ()中断响应与返回:采集到中断请求信号,怎样转向特定地中断服务子程序,并在执行完之后返回被中断程序继续执行.期间涉及到响应中断地条件,现场保护,现场恢复.文档来自于网络搜索 ()优先级控制:中断优先级地控制就形成了中断嵌套(允许有两级地中断嵌套,优先权顺序为,,,,串行口),同一个优先级地中断,还存在优先权地高低.优先级是可以编程地,而优先权是固定地.文档来自于网络搜索 地原则是①同优先级,先响应高优先权②低优先级能被高优先级中断③正在进行地中断不能被同一级地中断请求或低优先级地中断请求中断.文档来自于网络搜索 地中断系统涉及到地中断控制有中断请求,中断允许,中断优先级控制 ()个内部中断源,,串行口,个外部中断源, ()中断控制寄存器:定时和外中断控制寄存器(包括、,、),串行控制寄存器,中断允许寄存器,中断优先级寄存器文档来自于网络搜索 具体地是什么,包括哪些标志位,在这里不讲了,所有书上面都会讲. 在这里我们讲下注意地事项 ()响应中断后,(中断标志位)和由硬件自动清. ()响应中断后,在边沿触发方式下,(外部中断请求标志位)和由硬件自动清零;在电平触发方式下,不能自动清楚和.所以在中断返回前必须撤出和引脚地低电平,否则就会出现一次中断被多次响应.文档来自于网络搜索 ()串口中断中,响应中断后,(串行口发送中断请求标志位)和(接收中断请求标志位)必须由软件清零.文档来自于网络搜索 ()单片机复位后,,给位清零. 语言允许用户自己写中断服务子程序(中断函数) 首先来了解程序地格式: 函数名() [ ] {} 关键字 [ ] 表示这是一个中断函数 为中断源地编号,有五个中断源,取值为,中断编号会告诉编译器中断程序地入口地址,执行该程序时,这个地址会传个程序计数器,于是开始从这里一条一条地执行程序指令.文档来自于网络搜索 为单片机工作寄存器组(又称通用寄存器组)编号,共四组,取值为 中断号 中断源 外部中断 定时器 外部中断 定时器中断 串行口中断文档来自于网络搜索 这个中断源地中断入口地址为:(在上一篇文章中讲到地前个存储单元就是他们,这个地址用来存放中断处理程序地地址单元,每一个类中断地存储单元只有,显然不是中断处理地程序,而是存放着中断处理程序地真正地址)文档来自于网络搜索 个人收集整理-ZQ 2 / 2 : : : : 串口: 中断向量(中断入口地址) 中断号 前面意思很清楚,不同地值表示这个函数是针对不同地中断源,比如为是表示它是定时器地中断函数, 如 () {} 那么后面地 又是什么意思呢?在正在执行一个特定任务时,有更紧急地事情需要来处理,涉及到中断优先权.高优先权中断低优先权正在处理地程序,所以最好给每个优先程序分配不同地寄存器组.文档来自于网络搜索 正在处理某个事件,突然另外一个事件需要处理,于是进入中断后,而你不想将现在执行地程序地各寄存器状态入栈,那么可以把这个中断程序放入另一个寄存器组,如切换到组,然后退出中断时,再切回到组(原来地程序在组).文档来自于网络搜索 为了更好地了解这里意思,你可以看看工作寄存器组地作用是什么. 下面地注意事项转自网络上其他朋友地文章(整理下,重复地去掉了,写地非常好): ()中断函数不能进行参数传递 ()中断函数没有返回值 ()在任何情况下都不能直接调用中断函数 ()中断函数使用浮点运算要保存浮点寄存器地状态. ()如果在中断函数中调用了其它函数,则被调用函数所使用地寄存器必须与中断函数相同,被调函数最好设置为可重入地. ()编译器对中断函数编译时会自动在程序开始和结束处加上相应地内容,具体如下:在程序开始处对、、、和入栈,结束时出栈.中断函数未加 修饰符地,开始时还要将入栈,结束时出栈.如中断函数加 修饰符,则在开始将入栈后还要修改中地工作寄存器组选择位. ()编译器从绝对地址处产生一个中断向量,其中为中断号,也即后面地数字.该向量包含一个到中断函数入口地址地绝对跳转. ()中断函数最好写在文件地尾部,并且禁止使用存储类型说明.防止其它程序调用.文档来自于网络搜索 ()在设计中断时,要注意地是哪些功能应该放在中断程序中,哪些功能应该放在主程序中.一般来说中断服务程序应该做最少量地工作,这样做有很多好处.首先系统对中断地反应面更宽了,有些系统如果丢失中断或对中断反应太慢将产生十分严重地后果,这时有充足地时间等待中断是十分重要地.其次它可使中断服务程序地结构简单,不容易出错.中断程序中放入地东西越多,他们之间越容易起冲突.简化中断服务程序意味着软件中将有更多地代码段,但可把这些都放入主程序中.中断服务程序地设计对系统地成败有至关重要地作用,要仔细考虑各中断之间地关系和每个中断执行地时间,特别要注意那些对同一个数据进行操作地.文档来自于网络搜索

51单片机中断函数

51单片机中断函数

51单片机中断函数在51单片机中,中断是一种强大的功能,它可以在一些特定的时间或事件发生时打断正在执行的程序,并执行一个特定的函数,然后再回到原来的程序继续执行。

中断函数是在中断事件发生时自动执行的一段程序代码,可以用来处理中断事件。

中断函数的定义格式如下:```cvoid interrupt_function_name( interrupt interrupt_number//中断处理代码```其中,`interrupt_function_name`是中断函数的名字,`interrupt_number`是中断号。

当中断事件发生时,单片机自动调用该中断函数执行中断处理代码。

在51单片机中,有两种中断类型:硬件中断和软件中断。

一、硬件中断:硬件中断是由硬件引脚的输入触发的中断,常见的硬件中断包括外部中断、定时器中断和串口中断。

1.外部中断:外部中断是通过控制P3口上的引脚来实现的,有两个外部中断引脚INT0和INT1、当引脚上的电平发生变化时,会触发外部中断。

外部中断的中断号分别为0和1、具体的外部中断函数定义如下:```cvoid external_interrupt_0( interrupt 0//外部中断0处理代码void external_interrupt_1( interrupt 1//外部中断1处理代码```2.定时器中断:定时器中断是通过定时器产生的中断。

51单片机内部有两个定时器,分别为定时器0和定时器1、定时器中断的中断号分别为1和3、具体的定时器中断函数定义如下:```c//定时器0中断处理代码//定时器1中断处理代码```3.串口中断:串口中断是通过UART模块产生的中断,当接收到数据或发送数据完成时,会触发串口中断。

串口中断的中断号为4、具体的串口中断函数定义如下:```cvoid uart_interrupt( interrupt 4//串口中断处理代码```二、软件中断:软件中断是通过程序来触发的中断,通过软件中断可以在程序执行过程中主动调用中断函数。

单片机的中断

单片机的中断

unsigned char Countor; //设置全局变量,储存定时器T0中断次数
void main(void)
{
EA=1;
//开总中断
ET0=1;
//定时器T0中断允许
TMOD=0x01;
//使用定时器T0的模式2
TH0=(65536-46083)/256; //定时器T0的高8位赋初值
TL0=(65536-46083)%256; //定时器T0的高8位赋初值
有关的特殊功能寄存器(SFR)有: 中断允许寄存器IE 中断优先级控制寄存器IP 中断源寄存器(TCON、SCON中的有关位) 注:均可位寻址。
中断源
8051单片机共有五个中断源,分别是外部中断、定时 中断和串行中断。 2个外部中断是: 外部中断0--INT0,由P3.2提供, 外部中断1—INT1,由P3.3提供, 外部中断有两种触发方式,即低电平方式和负边沿 方式。
interrupt表示该函数是一个中断服务函数 整数n表示该中断服务函数对应哪一个中断源
[ void] 函数名 ([void]) interrupt n [using m] { 函数体语句 }
using m 指定该中断服务程序要使用的工作寄存器组号,m 为0~3。 若缺省using项,则编译系统默认为是当前工作寄存器组。
中断的使用(编程):
1 接通中断信号通道( 开总中断EA=1; ,开 中断源中断。如ET0=1;。
3 中断做什么(写中断服务函数)。
4、中断使用(编程)例
//例:用外中断0的负跳变产生中断信号点亮LED
#include<reg51.h>
void main(void)
{
EA=1; //开放总中断 EX0=1; //允许使用外中断 IT0=1; //选择负跳变来触发外中断
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机C语言中断1字号:大中小interrupt中断的关键字,n是中断号提供中断程序的入口地址。

0-INT0 1-T0 2-INT1 3-T1 4-串行中断5-T2直接访问寄存器和端口定义sfr P0 0x80sfr P1 0x81sfr ADCON; 0xDEsbit EA 0x9F操作ADCON = 0x08 ; /* Write data to register */P1 = 0xFF ; /* Write data to Port */io_status = P0 ; /* Read data from Port */EA = 1 ; /* Set a bit (enable all interrupts) */在使用了interrupt 1 关键字之后,会自动生成中断向量在ISR中不能与其他"后台循环代码"(the background loop code) 共享局部变量因为连接器会复用在RAM中这些变量的位置,所以它们会有不同的意义,这取决于当前使用的不同的函数复用变量对RAM有限的51来将很重要。

所以,这些函数希望按照一定的顺序执行而不被中断。

timer0_int() interrupt 1 using 2{unsigned char temp1 ;unsigned char temp2 ;executable C statements ;}"interrupt"声明表示向量生成在(8*n+3),这里,n就是interrupt参数后的那个数字这里,在08H的代码区域生成LJMP timer0_int 这样一条指令'using' 告诉编译器在进入中断处理器去切换寄存器的bank。

这个"contet"切换是为中断处理程序的局部变量提供一个新鲜的寄存器bank 最快的方式。

对时序要求严格的程序,是首选的stack寄存器(保存寄存器到stack)方式。

注意:同样优先级别的中断可以共享寄存器bank,因为他们每次将中断没有危险如果在timer1 的中断函数原型中使用USING 1, 寄存器的pushing将被MOV to PSW 切换寄存器bank 所替换。

不幸的是,当一个中断入口被加速时。

用在入口的直接寄存器寻址将失败。

这是因为C51没有告诉寄存器bank已经改变。

如果不工作的寄存器将被使用,如果没有其他函数被调用,优化器.....Logically, with an interrupt routine, parameters cannot be passed to it or returned. When the interrupt occurs, compiler-inserted code is run which pushes the accumulator, B,DPTR and the PSW (program status word) onto the stack. Finally, on exiting the interrupt routine, the items previously stored on the stack are restored and the closing "}" causes a RETI to be used rather than a normal RET.逻辑上,一个中断服务程序,不能传递参数进去,也不可返回值。

当中断发生时,编译器插入的代码被运行,它将累加器,B,DPTR和PSW(程序状态字)入栈。

最后,在退出中断程序时,预先存储在栈中被恢复。

最后的"}"结束符号将插入RETI到中断程序的最后,为了用Keil‘C’语言创建一个中断服务程序(ISR),利用interrupt 关键词和正确的中断号声明一个static void 函数。

Keil‘C’编译器自动生成中断向量,以及中断程序的进口、出口代码。

Interrupt 函数属性标志着该函数为ISR。

可用using 属性指定ISR使用哪一个寄存器区,这是可选的。

有效的寄存器区范围为1到3。

中断源的矢量位置中断源Keil中断编号矢量地址最高优先级 6 0x0033外部中断0 0 0x0003定时器0溢出 1 0x000B外部中断1 2 0x0013定时器1溢出 3 0x001B串口 4 0x0023定时器2溢出 5 0x002BDMA 7 0x003B硬件断点8 0x0043JTAG 9 0x004B软件断点10 0x0053监视定时器12 0x00631.函数在调用前定义与在调用后定义产生的代码是有很大差别的(特别是在优化级别大于3级时)。

(本人也不太清楚为什么,大概因为在调用前定义则调用函数已经知道被调用函数对寄存器的使用情况,则可对函数本身进行优化;而在调用后进行定义则函数不知被调用函数对寄存器的使用情况,它默认被调用函数对寄存器(ACC、B、DPH、DPL、PSW、R0、R1、R2、R3、R 4、R5、, R6、R7)都已经改变,因此不在这些寄存器中存入有效的数据)2.函数调用函数时除在堆栈中存入返回地址之外,不在堆栈中保存其它任何寄存器(ACC、B、DPH、DPL、PSW、R0、R1、R2、R3、R 4、R5、, R6、R7)的内容。

(除非被调用函数使用了using特性)3.中断函数是一个例外,它会计算自身及它所调用的函数对寄存器(ACC、B、DPH、DPL、PSW、R0、R1、R2、R3、R 4、R5、, R6、R7)的改变,并保存相应它认为被改变了的寄存器。

4.不知算不算是一个小bug)默认keil c51中的函数使用的是0寄存器组,当中断函数使用using n时,n = 1,2,3或许是对的,但n=0时,程序就已经存在了bug(只有中断函数及其所调用的函数并没有改变R0 ---- R7的值时,这个bug不会表现出来))一个结论是,在中断函数中如果使用了using n,则中断不再保存R0----R7的值。

当n相同时,这个存在的bug 是多么的隐蔽。

(这恰是使人想象不到的)使用不同寄存器组的函数(特殊情况外)不能相互调用using"关键字告诉编译器切换register bank如果中断程序不重要,using关键字能忽略。

如果一个函数被从中断程序调用,而此中断强制使用using 当编译一个被调用的函数时,编译器必须告诉它1)在函数前必须用伪指令#pragma NOAREGS在进入函数#pragma RESTORE或者#pragmas AREGS这样就不会使用"绝对地址定位"2)#pragma REGISTERBANK(n)用这个指定告诉当前使用的bank用NOAREGS指令移除MOV R7,AR7中断服务例程/* Timer 0 Overflow Interrupt Service Routine */timer0_int() interrupt 1 USING 1 {unsigned char temp1 ;unsigned char temp2 ;/* executable C statements */}被调用的函数#pragma SAVE // Rember current registerbankvoid func(char x) { // Called from interrupt routine// with "using1"/* Code */}#pragma RESTORE // Put back to original registerbank如果中断服务例程使用了USING,被中断服务例程调用的函数一定要REGISTERBANK(n)一个被ISR调用的函数也可能被后台程序调用为了函数"reentrant"(可重入)8051 系列MCU 的基本结构包括:32 个I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的64K 字节可寻址数据和代码区。

中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务处理程序。

中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。

8051的中断向量表如下:中断源中断向量上电复位0000H外部中断0 0003H定时器0 溢出000BH外部中断1 0013H定时器1 溢出001BH串行口中断0023H定时器2 溢出002BHinterrupt 和using 都是C51 的关键字。

C51 中断过程通过使用interrupt 关键字和中断号(0 到31)来实现。

中断号指明编译器中断程序的入口地址中断序号对应着8051中断使能寄存器IE 中的使能位,对应关系如下:IE寄存器C51中的8051的的使能位中断号中断源IE.0 0 外部中断0IE.1 1 定时器0 溢出IE.2 2 外部中断1IE.3 3 定时器1 溢出IE.4 4 串口中断IE.5 5 定时器2 溢出有了这一声明,编译器不需理会寄存器组参数的使用和对累加器A、状态寄存器、寄存器B、数据指针和默认的寄存器的保护。

只要在中断程序中用到,编译器会把它们压栈,在中断程序结束时将他们出栈。

C51 支持所有 5 个8051 标准中断从0 到4 和在8051 系列(增强型)中多达27 个中断源。

using 关键字用来指定中断服务程序使用的寄存器组。

用法是:using 后跟一个0 到3 的数,对应着4 组工作寄存器。

一旦指定工作寄存器组,默认的工作寄存器组就不会被压栈,这将节省32 个处理周期,因为入栈和出栈都需要 2 个处理周期。

这一做法的缺点是所有调用中断的过程都必须使用指定的同一个寄存器组,否则参数传递会发生错误。

因此对于using,在使用中需灵活取舍。

8051 系列MCU 的基本结构包括:32 个I/O 口(4 组8 bit 端口);两个16 位定时计数器;全双工串行通信;6 个中断源(2 个外部中断、2 个定时/计数器中断、1 个串口输入/输出中断),两级中断优先级;128 字节内置RAM;独立的64K 字节可寻址数据和代码区。

中断发生后,MCU 转到 5 个中断入口处之一,然后执行相应的中断服务处理程序。

中断程序的入口地址被编译器放在中断向量中,中断向量位于程序代码段的最低地址处,注意这里的串口输入/输出中断共用一个中断向量。

相关文档
最新文档