文档库 最新最全的文档下载
当前位置:文档库 › Arduino中断的使用

Arduino中断的使用

Arduino中断的使用
Arduino中断的使用

要搞清楚什么是中断,我们可以从生活中的一个例子了解下。

你正在家里看电视,突然家里座机响了,你起身去接电话,接完电话后继续回来看电视。这就是生活中的中断现象,也就是一个正在做的事情被外部的事情打断,当执行完外部事情后,继续做原本的事情。

什么是中断?

所谓中断,是指CPU在正常运行程序时,由于内部/外部事件或由程序预先安排的事件,引起CPU中断正在运行的程序,而转到为内部/外部事件或为预先安排的事件服务的程序中去,服务完毕,再返回去执行波暂时中断的程序

由于某个事件的发生,CPU暂停当前正在执行的程序,转而执行处理该事件的一个程序。该程序执行完成后,CPU接着执行被暂停的程序。这个过程称为中断。

根据中断源的位置,有两种类型的中断。有的中断源在CPU的内部,称为内部中断。大多数的中断源在CPU的外部,称为外部中断。

根据中断引脚的不同,或者CPU响应中断的不同条件,也可以把中断划分为可屏蔽中断和不可屏蔽中断两种。

使用中断的好处

1、实行分时操作提高 CPU 的效率只有当服务对象向 CPU 发出中断申请时才去为它服务这样我们就可以利用中断功能同时为多个对象服务从而大大提高了 CPU 的工作效率

2、实现实时处理

利用中断技术各个服务对象可以根据需要随时向 CPU 发出中断申请及时发现和处理中断请求并为

进入正题

UNO兼容板),IDE使用1.0.1版本。

在OCROBOT MANGO(UNO也一样)中,有两个

可以使用的外部中断,0(数字引脚2)和1(数

字引脚3),本次例子中我们使用D2引脚作为中

断引脚,使用A0引脚控制LED。原理图如下:

标准的数字输入与输出--没有中断

如果你按照上面的电路图进行了接线,把下面的代码编译上传进入Arduino。

代码用来读取你输入的值,然后作为条件进行比较,(按下开关,LED状态不会立刻改变,要按住一会儿才能改变)

1.int pbIn = 2; // 定义输入信号引脚

2.int ledOut = A0; // 定义输出指示灯引脚

3.int state = LOW; // 定义默认输入状态

4.void setup()

5.{

6.// 设置输入信号引脚为输入状态、输出引脚为输出状态

7.pinMode(pbIn, INPUT);

8.pinMode(ledOut, OUTPUT);

9.}

10.void loop()

11.{

12. state = digitalRead(pbIn); //读取微动开关状态

13.digitalWrite(ledOut, state); //把读取的状态赋予LED指示灯

14.//模拟一个长的流程或者复杂的任务

15.for(int i = 0; i < 100; i++)

16.{

17.//延时10毫秒

18.delay(10);

19.}

20.}

使用中断

现在,我们使用相同的电路连接图,然后修改代码以使用硬件中断。然后把下面的代码下载进入控制板中,当按下按钮时,LED的状态就会立刻改变,尽管代码仍然是在主循环中,而且是同样的延时。(按下开关,LED状态就会立刻变化)

1.int pbIn = 0; // 定义中断引脚为0,也就是D2引脚

2.int ledOut = A0; // 定义输出指示灯引脚

3.volatile int state = LOW; // 定义默认输入状态

4.void setup()

5.{

6.// 置ledOut引脚为输出状态

7.pinMode(ledOut, OUTPUT);

8.// 监视中断输入引脚的变化

9.attachInterrupt(pbIn, stateChange, CHANGE);

10.}

11.void loop()

12.{

13.// 模拟长时间运行的进程或复杂的任务。

14.for(int i = 0; i < 100; i++)

15.{

16.// 什么都不做,等待10毫秒

17.delay(10);

18.}

19.}

20.void stateChange()

21.{

22. state = !state;

23.digitalWrite(ledOut, state);

24.}

中断命令语法介绍

attachInterrupt(interrupt, function, mode)

interrupt:中断引脚数 (0 or 1)

function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数有时被称为中断服务程序。

mode:定义何时发生中断以下四个contstants预定有效值:

LOW 当引脚为低电平时,触发中断

CHANGE 当引脚电平发生改变时,触发中断

RISING 当引脚由低电平变为高电平时,触发中断

FALLING 当引脚由高电平变为低电平时,触发中断.

当发生外部中断时,调用一个指定函数。当中断发生时,该函数会取代正在执行的程序。大多数的Arduino板有两个外部中断:0(数字引脚2)和1(数字引脚3)。

arduino Mege有四个外部中断:数字2(引脚21),3(20针),4(引脚19),5(引脚18)。

注意事项

当中断函数发生时,delya()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。

重新分配中断

中断可以再任何时候通过attachInterrupt()命令进行改变。当重新使用attachInterrupt()时,先前分配的中断就会从对应引脚上移除。

启用\停止中断

Arduino也可以忽略所有中断。如果你需要在一段代码中不执行中断,只需要执行noInterrupts()命令。当这段代码执行完以后,你可以使用 interrupts()命令重新启用中断。删除中断

终端也可以通过detachInterrupt(interrupt_number)命令进行删除。

使用继电器控制12V风扇

Arduino 脚位的电流很小(小于40 mA),当你想要切换大电流或大电压设备(例如灯泡、马达或大风扇) 的开关时,会需要一个中继的电路(intermediate circuit),最简单的办法是使用继电器。

实验目的

练习用继电器控制12V 风扇。

前提

我假设你已经知道继电器是什么,而且也会查datasheet看懂继电器的接线图。如果你还不认识继电器,建议你在做这个实验前先看一看「继电器简介」一文,。

材料

?面包板x 1

?Arduino 主板x 1

?直流12V 风扇x 1

?5V 单刀双掷(SPDT) 继电器x 1

?1N4004 整流二极体x 1

?2n2222 NPN 电晶体x 1

?按钮(pushbutton) x 1

?10k 欧姆电阻x 1

?1k 欧姆电阻x 1

我用的是RAS-0515 小型继电器,它的线圈电压是直流5V,开关电流与电压为15A/120VAC (24VDC), 10A/250VAC:

▲ RAS-0515 小型继电器

RAS-0515 的接线图如下(翻过来从底部看):

▲ NC 是Normal Closed, NO 是Normal Open,而COM 是Common

如果你用比较大的继电器(> 12V),记得把2n2222 换成耐压较大的TIP101/TIP102 之类的电晶体

接线

底下这张图是继电器的一般接法,在你开始进行这个实验的接线前,可以多看几遍这张图以加深记忆:

▲ 控制继电器的电路

我用的RAS-0515 是5V 小型继电器(上图是12V 继电器),所以继电器线圈的电源只要从Arduino +5V 拉出即可。接着开始进行接线。

1)参考下图连接继电器、二极体与电晶体:

其中:

?继电器线圈一端接+5V,线圈的另一端(蓝线) 接到NPN 电晶体的集极(Collector) ?把整流二极体并联到线圈上,注意整流二极体有方向性,有标示的一端要朝向电源?NPN 电晶体射极(Emitter) 接到GND,然后基极(Base) 串联一颗1k 电阻连接到Arduino 的pin 13

为了你的方便,我把NPN 电晶体跟继电器的端子(接脚) 做个标示,如下图所示:

2)接着进行风扇的连接:

其中:

?风扇正极(红线) 接到继电器NO 端,负极(黑线) 接到GND

?从外接的12V 电源正极拉一条线到继电器的COM 端

外接12V 电源要怎么取得呢?很简单,只要找一下家里电脑周边产品的电源供应器,确认是12V 的即可。

▲ 电源转换器

3)最重要的部份都已经接好了,剩下的步骤只是接一颗按钮。这颗按钮的目的是当作风扇的开关,到时只要按一下就开风扇,再按一下就关风扇:

参考上图,把按钮的一支脚接到+5V,另一支脚接到pin 2 同时接一个10K 电阻连到GND,这样接线的工作就完成了.

01 02 03 04 05 06 07 08 09 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

/*

* 用繼電器控制 12V 風扇 */

const int buttonPin = 2; // 按鈕(pushbutton)

const int relayPin = 13; // 繼電器(Relay) int relayState = 0; // 繼電器狀態 void setup() { Serial.begin(9600); // 開啟 Serial port, 通訊速率為 9600 bps pinMode(buttonPin, INPUT); // 把 buttonPin 設置成 INPUT pinMode(relayPin, OUTPUT); // 把 relayPin 設置成 OUTPUT } void switchRelay() { if (relayState == 0) relayState = 1; // 把繼電器狀態改為 ON else relayState = 0; // 把繼電器狀態改為 OFF digitalWrite(relayPin, relayState); // 讓繼電器作動, 切換開關 Serial.print("Relay status: "); // 把繼電器的狀態印到 Serial Port Serial.println(relayState); } void loop() { int buttonState; // 讀取按鈕狀態 buttonState = digitalRead(buttonPin); // 檢查按鈕是否被按下(pressed) // 有的話,buttonState 會是 HIGH if (buttonState == HIGH) {

switchRelay(); // 切換繼電器開關

delay(500); // 稍候 0.5 秒,以免風扇切換太頻繁 } }

程式非常简单,应该不需要多余的解释。把程式上传到Arduino 后,当你按下按钮时,风扇会打开,再按一下风扇就会关闭。继电器打开的时候会发出「嗒」的一声,代表继电器有正常作动。

你可以打开Serial Monitor 观察,看看程式的执行是否顺利:

▲ Serial Monitor 上会显示继电器的状态

用红外线遥控器遥控风扇

接下来把电路稍微做个修改,我们来把按钮换掉,改成用红外线遥控器来遥控风扇。

首先,先把按钮(及相关的电阻)移除,接着照下表把红外线接收器跟Arduino连接起来。红外线接收器建议使用38 kHz的(如TSOP2438 , TSOP4438 , PNA4602 , FM-8038TM2-5DN ),因为大部份遥控器用38 kHz的比较多

有些红外线接收器GND 和Vcc 是相反的,接线时请查阅你的datasheet 底下就是这支用红外线遥控器遥控风扇的程式( irRelayAnd12VFan.pde ):

01 02

03

04 05 06 07

08 09

10 11

12 13 14 15

16

17 18

19

/* * 用繼電器控制 12V 風扇(使用紅外線遙控) */ const int irReceiver = 2; // 紅外線接收器 const int relayPin = 13; // 繼電器(Relay) int relayState = 0; // 繼電器狀態 void setup() { Serial.begin(9600); // 開啟 Serial port,

通訊速率為 9600 bps pinMode(irReceiver, INPUT); // 把 irReceiver 接腳設置為 INPUT pinMode(relayPin, OUTPUT); // 把 relayPin 設置成 OUTPUT

20 21 22 23 24 25

26

27 28 29

30 31 32 33

34

35 36 37 38 39 40 41 42

43

} void switchRelay() { if (relayState == 0) relayState = 1; // 把繼電器狀態改為 ON else relayState = 0; // 把繼電器狀態改為 OFF digitalWrite(relayPin, relayState); // 讓繼電器作動, 切換開關 Serial.print("Relay status: "); // 把繼電器的狀態印到 Serial Port Serial.println(relayState); } void loop() { int irStatus; // 讀取 irReceiver 的狀態 irStatus = digitalRead(irReceiver); // 檢查 irReceiver 是否有收到紅外線訊號

// 有的話,ir_status 會是 0 (因為 Receiver 會把訊號反向, 所以 0 代表有收到訊號) if (irStatus == 0) {

switchRelay(); // 切換繼電器開關

delay(500); // 稍候 0.5 秒,以免風扇切換太頻繁 } }

程式还是一样简单,相信你一定看得懂。唯一要注意的,因为红外线接收器会把讯号反向,所以0 代表有收到讯号,因此在检查接收器有没有收到红外线讯号时,必须判断irStatus 是不是0,如果是的话,就代表有收到红外线讯号。红外线接收器的状态储存在irStatus 变数里。

作业习题 中断及定时器

中断及定时器、串行口习题 一、填空 1.MCS-51的Po口作为输出端口时,每位能驱动个SL型TTL负载. 2.MCS-51有个并行I\O口,其中P0~P3是准双向口,所以由输出转输入时必须先 写入 3.设计8031系统时,_ 口不能用作一般I\O口. 4.MCS-51串行接口有4种工作方式,这可在初始化程序中用软件填写特殊功能寄存 器__ _加以选择. 5.当使用慢速外设时,最佳的传输方式是。 6.当定时器To工作在方式时,要占定时器T1的TR1和TF1_两个控制位. 7.MCS-51有个中断源,有2 个中断优先级,优先级由软件填写特殊功能寄存器加以选择.. 8.用串口扩并口时,串行接口工作方式应选为方式。 9.在串行通信中,有数据传送方向、、三种方式. 10.外部中断入口地址为_ 。 二、判断 1.MCS-51的5个中断源优先级相同。() 2.要进行多机通信,MCS-51串行接口的工作方式应为方式1。() 3.MCS-51上电复位时,SBUF=00H。()。 4.MCS-51有3个中断源,优先级由软件填写特殊功能寄存器IP加以选择.. () 5.用串口扩并口时,串行接口工作方式应选为方式1. () 6.外部中断INTO 入口地址为_0013H() 7.MCS-51外部中断0的入口地址是0003H。(). 8.TMOD中的GATE=1时,表示由两个信号控制定时器的启停。()。 9.使用8751且=1时,仍可外扩64KB的程序存储器。() 10.PC存放的是当前执行的指令。() 11.MCS-51的特殊功能寄存器分布在60H~80H地址范围内。() 12.MCS-51有4个并行I\O口,其中P0~P3是准双向口,所以由输出转输入时必须先写入"0"() 三、选择 1.在中断服务程序中,至少应有一条( ) (A)传送指令(B)转移指令(C)加法指法(D)中断返回指令 2.要使MCS-51能够响应定时器T1中断、串行接口中断,它的中断允许寄存器IE的内容应是() (A)98H (B)84H (C)42 (D)22H 3.D MCS-51在响应中断时,下列哪种操作不会发生( ). (A)保护现场(B)保护PC (C)找到中断入口若悬河(D)保护PC转入中断入口 4.用MCS-51串行接口扩展并行I\O口时,串行接口工作方式应选择( ) (A)方式0 (B)方式1 (C)方式2 (D)方式3 5.MCS-51有中断源() (A)5个(B)2个(C)3个(D)6个 6.MCS-51响应中断时,下面哪一个条件不是必须的() (A)当前指令执行完毕(B)中断是开放的确 (C)没有同级或高级中断服务须(D)必须有RET1指令 7.使用定时器T1时,有几种工作模式() (A)1种(B)2种(C)3种(D)4种 8.计算机在使用中断方式与外界交换信息时,保护现场的工作方式应该是( ) (A)由CPU自动完成(B)在中断响应中完成功之路 (C)应由中断服务程序完成(D)在主程序中完成 9.下面哪一种传送方式适用于处理外部事件( ) (A)DMA (B)无条件传递进(C)中断(D)条件传递 四、编程 1. 1. 8225A控制字地址为300FH,请按:A口方式0输入,B口方式1输出,C口高位输出,C口低位输入,确定8225A控制字并编初始化程序. 2. 2. 编定一个软件延时1S和1min的子程序.设fosc=6Hz,则一个机器周期1μs。

定时器中断程序设计实验

实验一定时器/中断程序设计实验 一、实验目的 1、掌握定时器/中断的工作原理。 2、学习单片机定时器/中断的应用设计和调试 二、实验仪器和设备 1、普中科技单片机开发板; 2、Keil uVision4 程序开发平台; 3、PZ-ISP 普中自动下载软件。 三、实验原理 805l 单片机内部有两个 16 位可编程定时/计数器,记为 T0 和 Tl。8052 单片机内除了 T0 和 T1 之外,还有第三个 16 位的定时器/计数器,记为 T2。它们的工作方式可以由指令编程来设定,或作定时器用,或作外部脉冲计数器用。定时器 T0 由特殊功能寄存器 TL0 和 TH0 组成,定时器 Tl 由特殊功能寄存器 TLl 和 TH1 组成。定时器的工作方式由特殊功能寄存器 TMOD 编程决定,定时器的运行控制由特殊功能寄存器 TCON 编程控制。T0、T1 在作为定时器时,规定的定时时间到达,即产生一个定时器中断,CPU 转向中断处理程序,从而完成某种定时控制功能。T0、T1 用作计数器使用时也可以申请中断。作定时器使用时,时钟由单片机内部系统时钟提供;作计数器使用时,外部计数脉冲由 P3 口的 P3.4(或 P3.5)即 T0(或 T1)引脚输入。 方式控制寄存器 TMOD 的控制字格式如下: 低 4 位为 T0 的控制字,高 4 位为 T1 的控制字。GATE 为门控位,对定时器/计数器的启动起辅助控制作用。GATE=l 时,定时器/计数器的计数受外部引脚输入电平的控制。由由运行控制位 TRX (X=0,1)=1 和外中断引脚(0INT 或 1INT)上的高电平共同来启动定时器/计数器运行;GATE=0时。定时器/计数器的运行不受外部输入引脚的控制,仅由 TRX(X=0,1)=1 来启动定时器/计数器运行。 C/-T 为方式选择位。C/-T=0 为定时器方式,采用单片机内部振荡脉冲的 12 分频信号作为时钟计时脉冲,若采用 12MHz 的振荡器,则定时器的计数频率为 1MHZ,从定时器的计数值便可求得定时的时间。 C/-T=1 为计数器方式。采用外部引脚(T0 为 P3.4,Tl 为 P3.5)的输入脉冲作为计数脉冲,当 T0(或 T1)输入信号发生从高到低的负跳变时,计数器加 1。最高计数频率为单片机时钟频率的 1/24。 M1、M0 二位的状态确定了定时器的工作方式,详见表。

51单片机外部中断与定时器的实用

中断使能寄存器 通过设置中断使能寄存器 IE 的 EA 位 使能所有中断 每个中断源都有单独的使能位 可通过软件设置 IE 中相应的使能位在任何时候使能或禁能中断 中断使能寄存器 IE 的各 位如下所示 中断使能寄存器IE 位地址 0AFH 0AEH 0ADH 0ACH 0ABH 0AAH 0A9H 0A8H 位符号 EA / ET2 ES ET1 EX1 ET0 EX0 EA 使能标志位 置位则所有中断使能 复位则禁止所有中断保留 ET2 定时器2 中断使能 ES 串行通信中断使能 ET1 定时器 1 中断使能 EX1 外部中断 1 使能 ET0 定时器0 中断使能 EX0 外部中断 0使能 8051 支持两个中断优先级 有标准的中断机制, 低优先级的中断只能被高优先级的中断所中断 ,而高优先级的中断不能被中断。 中断优先级寄存器 每个中断源都可通过设置中断优先级寄存器IP 来单独设置中断优先级 如果每个中断源的相应位被置位 则该中断源的优先级为高,如果相应的位被复位, 则该中断源的优先级为低, 如果你觉得两个中断源不够用 ,别急以后我会教你如何增加中断优先级 表 A-5 示出了 IP 寄存器的各位 此寄存器可位寻址 IP 寄存器 位地址 0BFH 0BEH 0BDH 0BCH 0BBH 0BAH 0B9H 0B8H 位符号 / / / PS PT1 PX1 PT0 PX0 编号 中断源 中断向量 上电复位 0000H 0 外部中断0 0003H 1 定时器0溢出 000BH 2 外部中断1 0013H 3 定时器1溢出 001BH 4 串行口中断 0023H 5 定时器2溢出 002BH PT2 定时器 2中断优先级 PS 串行通信中断优先级 PT1 定时器 1中断优先级 PX1 外部中断1 优先级 PT0 定时器0中断优先级 PX0 外部中断0 优先级

中断服务程序流程图

第一讲: 第六章I/O接口原理-接口、端口、编址 回顾:微机系统的层次结构,CPU、主机、接口电路及外部设备之间的结构关联,输入/输出的一般概念。 重点和纲要:微机系统主机与外部设备之间的数据传送,包括I/O端口的寻址方式,输入/输出的传送控制方式。 讲授内容: 6. 1 输入/输出数据的传输控制方式 一、输入/输出的一般概念 1.引言 输入/输出是微机系统与外部设备进行信息交换的过程。输入/输出设备称为外部设备,与存储器相比,外部设备有其本身的特点,存储器较为标准,而外部设备则比较复杂,性能的离散性比较大,不同的外部设备,其结构方式不同,有机械式、电动式、电子式等;输入/输出的信号类型也不相同,有数字信号,也有模拟信号;有电信号,也有非电信号;输入/输出信息的速率也相差很大。因此,CPU与外部设备之间的信息交换技术比较复杂。 CPU与外设之间的信息交换,是通过它们之间接口电路中的I/O端口来进行的,由于同一个外部设备与CPU之间所要传送的信息类型不同,方向不同,作用也不一样(例如数据信息、状态信息、控制信息、输入/输出等),所以接口电路中可以设置多个端口来分别处理这些不同的信息。 2.输入/输出端口的寻址方式 微机系统采用总线结构形式,即通过一组总线来连接组成系统的各个功能部件(包括CPU、内存、I/O端口),CPU、内存、I/O端口之间的信息交换都是通过总线来进行的,如何区分不同的内存单元和I/O端口,是输入/输出寻址方式所要讨论解决的问题。

根据微机系统的不同,输入/输出的寻址方式通常有两种形式:(1).存储器对应的输入、输出寻址方式 这种方式又称为存储器统一编址寻址方式或存储器映象寻址方式。 方法:把外设的一个端口与存储器的一个单元作同等对待,每一个I/O端口都有一个确定的端口地址,CPU与I/O端口之间的信息交换,与存储单元的读写过程一样,内存单元与I/O端口的不同,只在于它们具有不同的的地址。优点: ①CPU对I/O端口的读/写操作可以使用全部存储器的读/写操作指令,也可 以用对存储器的不同寻址方式来对I/O端口中的信息,直接进行算术、逻辑运算及循环、移位等操作。 ②内存与外设地址的分配,可以用统一的分布图。 ③不需要专门的输入、输出操作指令。 缺点: ①内存与I/O端口统一编址时,在地址总线根数一定的情况下,使系统中 实际可以直 接寻址的内存单元数减少。 ②一般情况下,系统中I/O端口数远小于内存单元数,所以在用直接寻址方 式来寻址这些端口时,要表示一个端口地址,必须用与表示内存单元地址相同的字节数,使得指令代码较长,相应地读/写执行时间也较长,这对提高系统的运行速度是不利的。 Mortorola公司的M6800CPU等均采用这种寻址I/O端口的方式。 3. CPU与外设之间所传送的信息类型 CPU与I/O端口之间所交换的信息,可以有下列几种类型: ①数据信息:包括数字量、模拟量、开关量等,可以输入、也可以输出 ②状态信息:这是I/O端口送给CPU的有关本端口所对应的外设当前状态 的信息。供CPU进行分析、判断、决策。 ③控制信息:这是CPU送给I/O端口的控制命令,使相应的外部设备完成 特定的操作。 数据信息、状态信息和控制信息是不同类型的信息,它们所起的作用也不一样。但在8086/8088微机系统中,这三种不同类型的信息的输入、输出过程是相同的。为了加以区分,可以使它们具有不同的端口地址,在端口地址相同的情况下,可以规定操作的顺序,或者在输入/输出的数据中设置特征位。

51单片机汇编语言编程:用定时器控制输出矩形波

80C51单片机的时钟频率为12MHz,利用定时器T1和P1.0输出矩形脉冲。 波形只画出了2段:一段为100us 另一段为50us。 要完全的、完整的、详细的编写此程序的过程!谢谢 ------------------------ 最佳答案: 用一个定时器定时50us,也可以达到题目要求。 在我的空间里面有类似的问题和解答。 ORG 0000H SJMP START ORG 001BH ;T1中断入口. SJMP T1_INT START: MOV TMOD, #20H ;设置T1定时方式2 MOV TH1, #206 ;自动重新装入方式. MOV TL1, #206 ;定时时间 MOV IE, #10001000B ;开放总中断和T1中断. SETB TR1 ;启动T1 MOV R2, #3 ;周期是3×50us SJMP $ ;等着吧. T1_INT: SETB P1.0 ;输出高.

DJNZ R2, T1_END ;R2-1 CLR P1.0 ;减到0,就输出低电平. MOV R2, #3 T1_END: RETI ;中断返回. END ;完. ------------------------ 已知51单片机系统晶振频率为12MHz,请利用定时器1工作方式1,中断方式在P2.3输出频率为10Hz的方波。 写出定时设计过程及完整代码 问题补充:用汇编的麻烦写一下 ------------------------ 最佳答案: ORG 0000H SJMP START ORG 001BH ;T1中断入口. SJMP T1_INT START: MOV TMOD, #10H ;设置T1定时方式1 MOV TH1, #(65536-50000) / 256 ;送入初始值.

计算机组成原理中断实验报告

北京建筑大学 2015/2016 学年第二学期 课程设计 课程名称计算机组成原理综合实验 设计题目微程序控制器设计与实现 系别电信学院计算机系 班级计141 学生姓名艾尼瓦尔·阿布力米提 学号 完成日期二〇一六年七月八日星期五 成绩 指导教师 (签名) 计算机组成综合实验任务书

指令执行流程图; ?5、利用上端软件,把所编写的微程序控制器内容写入实验台中控制器中。 ?6、利用单拍测试控制器与编程的要求是否一致。如果有错误重新修改后再写入控制器中。 7、编写一段测试程序,测试控制器运行是否正确。 实验目的 1.融合贯通计算机组成原理课程,加深对计算机系统各模块的工作原理及相互联系(寄存器堆、运算器、存储器、控制台、微程序控制器)。 2.理解并掌握微程序控制器的设计方法和实现原理,具备初步的独立设计能力;3.掌握较复杂微程序控制器的设计、调试等基本技能;提高综合运用所学理论知识独立分析和解决问题的能力。 实验电路 1. 微指令格式与微程序控制器电路 2.微程序控制器组成 仍然使用前面的CPU组成与机器指令执行实验的电路图,但本次实验加入中断系统。这是一个简单的中断系统模型,只支持单级中断、单个中断请求,有中断屏蔽功能,旨在说明最基本的原理。

中断屏蔽控制逻辑分别集成在2片GAL22V10(TIMER1 和TIMER2)中。其ABEL语言表达式如下: INTR1 := INTR; INTR1.CLK = CLK1; IE := CLR & INTS # CLR & IE & !INTC; IE.CLK= MF; INTQ = IE & INTR1; 其中,CLK1是TIMER1产生的时钟信号,它主要是作为W1—W4的时钟脉冲,这里作为INTR1的时钟信号,INTE的时钟信号是晶振产生的MF。INTS微指令位是INTS机器指令执行过程中从控制存储器读出的,INTC微指令位是INTC机器指令执行过程中从控制存储器读出的。INTE是中断允许标志,控制台有一个指示灯IE显示其状态,它为1时,允许中断,为0 时,禁止中断。当INTS = 1时,在下一个MF的上升沿IE变1,当INTC = 1时,在下一个MF的上升沿IE变0。CLR信号实际是控制台产生的复位信号CLR#。当CLR = 0时,在下一个CLK1的上升沿IE变0。当 CLR=1 且INTS = 0 且 INTC = 0时,IE保持不变。 INTR是外部中断源,接控制台按钮INTR。按一次INTR按钮,产生一个中断请求正脉冲INTR。INTR1是INTR经时钟CLK1同步后产生的,目的是保持INTR1与实验台的时序信号同步。INTR脉冲信号的上升沿代表有外部中断请求到达中断控制器。INTQ是中断屏蔽控制逻辑传递给CPU的中断信号,接到微程序控制器上。当收到INTR脉冲信号时,若中断允许位INTE=0,则中断被屏蔽,INTQ仍然为0;若INTE =1,则INTQ =1。

按键和定时器中断综合应用-秒表计时器

& INT1按键中断INT0# 和T0中断的综合应用 ‐简易秒表计时器 范例1:汇编源代码 范例2:C51源代码

P7 EQU 0F8H ORG 0100H #60H P6 EQU 0E8H D1 EQU 0FEH //数码管个位EQU 0FDH MAIN: MOV SP ,#60H //设置堆栈 MOV P2,#0FFH //关P2口LED MOV TMOD,#00H D2 //十位D3 EQU 0FBH // 百位 VARX DATA 30H //计数变量DATA 31H MOV TH0,#4BH MOV TL0,#0FDH //设置T0MOV R7,#20MOV VARX,#0 //置计数变量0DIG1 //BCD 个位DIG2 DATA 32H //BCD 十位DIG3 DATA 33H //BCD ,SETB ET0SETB EX0SETB IT0//百位ORG 0000H LJMP MAIN SETB EX1SETB IT1 SETB EA //允许相关中断 ORG 0003H LJMP KY1INT //KY1中断ORG 000BH LJMP T0INT //T0中断ORG 0013H KY2INT //KY2LJMP 中断

CONV: MOV A,VARX //读计数变量MOV A,DIG2 //读十位BCD MOV B,#100DIV AB DIG3A MOVC A,@A+DPTR MOV P7,A P6#D2//MOV DIG3,A MOV A,B MOV B,#10MOV P6,#D2 查表送显示ACALL DELAY //扫描延时A,DIG3//DIV AB MOV DIG2,A DIG1B MOV 读百位BCD MOVC A,@A+DPTR MOV P7,A MOV DIG1,B //转换为3位BCD DISP: MOV A,DIG1 //读个位BCD MOV DPTR,#SEGTBL MOV P6,#D3 //查表送显示ACALL DELAY CONV //MOVC A,@A+DPTR MOV P7,A P6,#D1//LJMP 返回读取VARX MOV 查表送显示 ACALL DELAY //扫描延时

单片机外部中断详解及程序

单片机外部中断详解及程序 单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。 实际上在第二个示例演示中,就已经举过有按键输入的例子了,只不过当时使用的方法并不是外部中断,而是用程序查询的方式。下面就用外部中断的方法来改写一下第二个示例中,通过按键来更改闪烁速度的例子(第二个例子)。电路结构和接线不变,仅把程序改为下面的形式。 #include ;

unsigned int t=500; //定义一个全局变量t,并设定初始值为500次 //===========延时子函数,在8MHz晶振时约 1ms============= void delay_ms(unsigned int k) { unsigned int i,j; for(i=0;i

定时器中断综合实验

实验2 定时器、中断综合实验 一、实验目的 熟悉MCS-51定时器,串行口和中断初始化编程方法,了解定时器的应用,时钟程序的设计与调试技巧。 二、实验内容 编写程序,用定时器中断现实LED跑马灯实验。 实验内容1: 1).用查表法实现LED跑马灯实验; 2).采用定时器控制跑马灯的变化速度。 三、流程框图 四、实验步骤及程序 ORG 0000H LJMP MAIN ORG 000BH ; T0 中断入口地址 MOV TH0,#0BH ; 62.5毫秒定时 MOV TL0,#0DCH DJNZ R2,T0OUT ; 中断16次为1秒 MOV R2,#16 PUSH ACC ; 保存数据 MOVC A,@A+DPTR ; 查表法LED 左右移 MOV P0,A POP ACC INC A CJNE A,#24,T0OUT ; 24种"花样" CLR A T0OUT: RETI ORG 0050H MAIN: MOV SP,#6FH ; MOV R2,#16 ; 定时器中断次数,@12M MOV A,#00H ; 查表起始值 MOV DPTR,#TABLE MOV TMOD,#00000001B ; 定时器方式1 MOV TH0,#0BH ; 62.5MS MOV TL0,#0DCH SETB EA ; 中端总允许 SETB ET0 ; 允许T0 中断 SETB TR0 ; 启动定时 WAIT: SJMP $ ;原地等待中断

RET TABLE:DB 0FEH,0FDH,0FBH,0F7H ;LED 左右移数据表,共有24种"花样" DB 0EFH,0DFH,0BFH,07FH DB 00H,55H,0AAH,00H DB 7FH,0BFH,0DFH,0EFH DB 0F7H,0FBH,0FDH,0FEH DB 00H,0AAH,55H,00H END 思考:换用T1定时器,定时方式2。 用汇编语言编辑8个LED灯,实现第一秒只有L1不亮,其余七个全亮,第二个L2不亮,其余七个全亮 ORG 0000H SJMP START ORG 000BH SJMP T0_INT START: MOV TMOD, #01H MOV TH0, #3CH ; (65536 - 50000) / 256; MOV TL0, #0B0H ; (65536 - 50000) % 256; SETB TR0 SETB ET0 SETB EA MOV A, #01H MOV R2, #20 SJMP $ T0_INT: MOV TH0, #3CH ; (65536 - 50000) / 256; MOV TL0, #0B0H ; (65536 - 50000) % 256; DJNZ R2, T0_END MOV R2, #20 MOV P0, A RL A T0_END: RETI END 实验内容2: 设计一个实时时钟,用42H显示秒单元,用41H显示分单元,用40H显示时单元。要求每满1秒,秒单元内容加1;秒满60,分单元加1,分满60,时单元加1。时满24 ,时分秒全部清0。 从秒到分,从分到时,通过软件累加现实。P115。 ORG 0000H LJMP MAIN ;上电,跳向主程序 ORG 000BH ;T0的中断入口

51单片机每个外部中断和定时器中断 应用模版

第一步,中断配置 /************************************************************ 函数名:INT0_Config 功能:配置单片机与中断相关的硬件,让单片机能够正常检测中断和执行中断代码。 输入参数: 输出参数: ************************************************************/ void INT0_Config(void) { IT0=1; //中断触发方式,IT0=0,低电平触发,INT0=1下降沿触发(下降沿就是由高电平向低电平的跳变); EX0=1; //外部中断0的中断开关,每个中断源都有自己的中断开关。 EA=1; //打开总中断,如果总中断不打开,就是其他中断开关被打开,单片机也不能执行中断。 } 第二步,中断服务,也就是cpu被中断后所要做的事。 /************************************************************ 函数名:Isr_INT0 功能:中断服务 输入参数: 输出参数: ************************************************************/ void Isr_INT0() interrupt 0 //interrupt表明该函数是中断函数,后面的标号表示是哪个中断源产生的中断。{ //(INT0)为0, Timer0为1,INT1为2,Timer3,串口中断为4。 // Add your code here //自己想要中断后发生的程序 } 第三部主函数 /************************************************************ 函数名:main 功能:主函数 输入参数: 输出参数: ************************************************************/ void main() { INT0_Config();//调用这个函数来配置外部中断 while(1) { //Add your code here //CPU一直在这里循环的执行代码,一旦发生中断,就停下来去执行中断函数Isr_INT0() interrupt 0, //执行完成后,返回从断点处继续往下执行原来的代码。 } }

单片机定时器汇编

我们在学单片机时我们第一个例程就是灯的闪烁,那是用延时程序做的,现在回想起来,这样做不很恰当,为什么呢?我们的主程序做了灯的闪烁,就不能再干其它的事了,难道单片机只能这样工作吗?当然不是,我们能用定时器来实现灯的闪烁的功能。例1:查询方式ORG 0000H AJMP START ORG 30H START: MOV P1,#0FFH ;关所灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB TR0 ;定时/计数器0开始运行 LOOP: JBC TF0,NEXT ;如果TF0等于1,则清TF0并转NEXT处(LOOP:JNB TF0,$) AJMP LOOP ;不然跳转到LOOP处运行 NEXT: CPL P1.0 MOV TH0,#15H MOV TL0,#9FH;重置定时/计数器的初值 AJMP LOOP END 键入程序,看到了什么?灯在闪烁了,这可是用定时器做的,不再是主程序的循环了。简单地分析一下程序,为什么用JBC呢?TF0是定时/计数器0的溢出标记位,当定时器产生溢出后,该位由0变1,所以查询该位就可知宇时时间是否已到。该位为1后,要用软件将标记位清0,以便下一次定时是间到时该位由0变1,所以用了JBC指令,该指位在判1转移的同时,还将该位清0.以上程序是能实现灯的闪烁了,可是主程序除了让灯闪烁外,还是不能做其他的事啊!不对,我们能在LOOP:……和AJMP LOOP指令之间插入一些指令来做其他的事情,只要保证执行这些指令的时间少于定时时间就行了。那我们在用软件延时程序的时候不是也能用一些指令来替代DJNZ吗?是的,但是那就要求你精确计算所用指令的时间,然后再减去对应的DJNZ循环次数,很不方便,而现在只要求所用指令的时间少于定时时间就行,显然要求低了。当然,这样的办法还是不好,所以我们常用以下的办法来实现。程序2:用中断实现 ORG 0000H AJMP START ORG 000BH ;定时器0的中断向量地址 AJMP TIME0 ;跳转到真正的定时器程序处 ORG 30H START: MOV P1,#0FFH ;关所灯 MOV TMOD,#00000001B ;定时/计数器0工作于方式1 MOV TH0,#15H MOV TL0,#0A0H ;即数5536 SETB EA ;开总中断允许 SETB ET0 ;开定时/计数器0允许 SETB TR0 ;定时/计数器0开始运行 SJMP $ ;LOOP: AJMP LOOP ;真正工作时,这里可写任意程序 TIME0:

定时器和计数器应用C语言程序

1、定时器应用实验 单片机的P1口上接有8只LED。采用定时器T0的方式1的定时中断方式,使P1口外接的8只LED每0.5s闪亮一次。 #include Char i=100;/*给变量i赋初值*/ void main( ) {TMOD=0x01;/*设置定时器T0为方式1*/ TH0=0xee;/*向TH0写入初值的高8位*/ TL0=0x00;/*向TL0写入初值的低8位*/ P1=0x00;/*P1口8只LED点亮*/ EA=1;/*总中断允许*/ ET0=1;/*定时器T0中断允许*/ TR0=1;/*启动定时器T0*/ while(1) ;/*无穷循环,等待定时中断*/ } /*以下为定时器T0的中断服务程序*/ void T0_int(void) interrupt 1 {TH0=0xee;/*给T0装入16位初值,计4608个数后,T0溢出*/ TL0=0x00; i--;/*循环次数减1*/ if(i<=0) {P1=~P1;/*P1口按位取反*/ i=100;/*重新设置循环次数*/ } } 2、计数器应用实验 采用定时器T1的方式1的中断计数方式。计数输入引脚T1(P3.5)上外接开关K1,作为计数信号输入。按4次K1后,P1口的8只LED闪烁不停。 #include void Delay(unsigned int i)/* 定义延时函数Delay( ),i是形式参数,不能赋初值*/ {unsigned int j; for(;i>0;i--) /* 变量i由实际参数传入一个值,因此i不能赋初值*/ for(j=0;j<125;j++) {;} /*空函数*/ } void main( ) /*主函数*/ {TMOD=0x50;/*设置定时器T1为方式1计数*/ TH1=0xff;/*向TH1写入初值的高8位*/ TL1=0xfc;/*向TL1写入初值低8位*/ EA=1;/*总中断允许*/ ET1=1;/*T1中断允许*/ TR1=1;/*启动T1*/

第5章 中断服务程序设计

第5章中断服务程序设计 中断服务程序(ISR)是嵌入式应用系统获取各种事件的基本手段,而“事件”是实时性问题的讨论基础和时间计算的起点。ISR的设计质量直接影响到系统的实时性指标和操作系统的工作效率。 只要没有关中断,中断服务程序可以中断任何任务的运行,可将中断服务程序可成比最高优先级(0级)还高的“任务”。 5.1中断优先级安排原则 中断源是系统及时获取异步事件的主要手段,其优先级安排原则如下: ●紧迫性:触发中断的事件允许耽误的时间越短,设定的中断优先级就越高。 ●关键性:触发中断的事件越关键(重要),设定的中断优先级就越高。 ●频繁性:触发中断的事件发生越频繁,设定的中断优先级就越高。 ●快捷性:ISR处理越快捷(耗时短),设定的中断优先级就越高。 中断服务程的功能应尽量简单,只要将获取的异步事件通信给关联任务,后续处理由关联任务完成。 5.2不受操作系统管理的中断服务程序 正常情况下,ISR应受操作系统的管理,因很多任务是靠ISR触发的。 但在两种情况下ISR不受操作系统管理:①没有必要;②操作系统没有对该ISR进行管理。 实时操作系统uC/OS-Ⅱ移植到ARM7体系的CPU上时,没有对FIQ进行处理,即FIQ 是不受操作系统管理的。 选用FIQ来响应实时性要求最高的高速采样操作是一个有效措施,保护现场的工作量很小(FIQ专有的8个寄存器不需要保护)。 在工程模板的系统启动文件Startup.s中,已经把汇编代码部分处理好,用户只需要用C 语言编写快速中断服务函数FIQ_Exception()即可,不需考虑保护现场和恢复现场的问题。 程序:Startup.s中队FIQ的处理 Reset ;异常向量表 LDR PC,ResetAddr ;跳转到复位入口地址 LDR PC,UndefinedAddr LDR PC,SWI_Addr ;跳转到软件中断入口地址 LDR PC,PrefetchAddr LDR PC,DataAbortAddr DCD 0xb9205f80 LDR PC,[PC,#-0xff0] ;跳转到向量中断入口地址(向量中断控制器) LDR PC,FIQ_Addr ;跳转到快速中断入口地址 ResetAddr DCD ResetInit UndefinedAddr DCD Undefined SWI_Addr DCD SoftwareInterrupt PrefetchAddr DCD PrefetchAbort Nouse DCD 0

T0作定时器汇编程序中断法

T0作定时器汇编程序(中断法) 单片机T0作定时器实现数码管显示的汇编程序(中断法) 电路是:P0口接数码管的字型码笔段,P2口接数码管的数位选择端. 下面是汇编语言源程序: SECOND EQU 30H TCOUNT EQU 31H ORG 00H LJMP START ORG 0BH LJMP INT0X START: MOV SECOND ,#00H MOV A,SECOND MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B

MOVC A,@A+DPTR MOV P2,A MOV TCOUNT,#00H MOV TMOD,#01H MOV TH0,#(65536-50000)/256 MOV TL0,#(65536-50000) MOD 256 SETB TR0 SETB ET0 SETB EA SJMP $ INT0X: MOV TH0,#(65536-5000)/256 MOV TL0,#(65536-5000) MOD 256 INC TCOUNT MOV A,TCOUNT CJNE A,#20,NEXT MOV TCOUNT,#00H

INC SECOND MOV A,SECOND CJNE A,#60,NEX MOV SECOND,#00H NEX: MOV A,SECOND MOV B,#10 DIV AB MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P0,A MOV A,B MOVC A,@A+DPTR

MOV P2,A NEXT: RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END T0工作在方式1,计时50ms,共20个循环,总计时1秒。 P0口显示低位,P2口显示高位,满60清零

uCOSii中断处理过程详解

一. UCOSII的中断过程简介 系统接收到中断请求后,如果CPU处于开中断状态,系统就会中止正在运行的当前任务,而按中断向量的指向去运行中断服务子程序,当中断服务子程序运行完成后,系统会根据具体情况返回到被中止的任务继续运行,或转向另一个中断优先级别更高的就绪任务。 由于UCOS II是可剥夺型的内核,所以中断服务程序结束后,系统会根据实际情况进行一次任务调度,如果有优先级更高的任务,就去执行优先级更高的任务,而不一定要返回被中断了的任务。 二.UCOSII的中断过程的示意图 三.具体中断过程 1.中断到来,如果被CPU识别,CPU将查中断向量表,根据中断向量表,获得中断服务子程序的入口地址。 2.将CPU寄存器的内容压入当前任务的任务堆栈中(依处理器的而定,也可能压入被压入被中断了的任务堆栈中。

3.通知操作系统将进入中断服务子程序。即:调用OSIntEnter()或OSIntNesting直接 加1。 4.If(OSIntNesting==1){OSTCBCur->OSTCBStrPtr=SP;} //如果是第一层中断,则将堆栈指针保存到被中断任务的任务控制块中 5.清中断源,否则在开中断后,这类中断将反复的打入,导致系统崩贵 6.执行用户ISR 7.中断服务完成后,调用OSIntExit().如果没有高优先级的任务被中断服务子程序激活而进入就绪态,那么就执行被中断了的任务,且只占用很短的时间. 8.恢复所有CPU寄存器的值. 9.执行中断返回指令.

四.相关代码 与编译器相关的数据类型: typedef unsigned char BOOLEAN; typedef unsigned char INT8U; typedef unsigned int OS_STK; //堆栈入口宽度为16 位(一) void OSIntEnter (void)的理解 uCOS_II.H中定义:

单片机定时器使用总结

单片机定时器的使用 第一部分:51系列定时器 定时/计数器0 和定时/计数器1都有4种定时模式。 16位定时器对内部机器周期进行技术,机器周期加1,定时器值加1,1MHZ 模式下,一个机器周期为1us 。 定时器工作模式寄存器TMOD,不可位寻址,需整体赋值,高4位用于定时器1,第四位用于定时器0。 C/T:为定时器功能选择位,C/T=0对机器周期计数,C/T=1,对外部脉冲计数。 GATE:门控位,GATE=0,软件置位TRn即可启动计时器,GATE=1需外部中断引脚为高电平时才能软件置位TRn启动计时器,一般取GATE=0。 定时器控制寄存器TCON TFn:Tn溢出标志位,当定时器溢出时,硬件置位TFn,中断使能的情况下,申请中断,CPU响应中断后,硬件自动清除TFn。中断屏蔽时,该位一般作为软件查询标志,由于不进入中断程序,硬件不会自动清除标志位,可软件清除。 TRn:计时器启动控制位,软件置位TRn即可启动定时器,软件清除TRn 关闭标志位。 IEn:外部中断请求标志位。

ITn:外部中断出发模式控制位,ITn=0为低电平触发,ITn=1为下降沿触发。 中断允许控制寄存器IE EA(IE.7):全局中断控制位。EA=1开全局中断,EA=0关闭全局中断。 IE.6无意义。 ETn:定时器中断使能控制位。置位允许中断,清除禁止中断。 ES:串行接收/发送中断控制位,置位允许中断。 EXn:外部中断使能控制位。置1允许,清0禁止。 中断优先级控制寄存器IP,复位后为00H IP.6,IP.7保留,无意义。 PT2:定时器2中断优先级控制,置1设为高优先级,清0置位低优先级。 PS:串行中断优先级控制位。 PT1/0:定时器1/0优先级控制位,置1高,清0低。 PXn:外部中断优先级控制位。 当有同级中断同时响应,按IE0—>TF0—>IE1—>TF1—IE0—>RI+TI—>TF2顺序依次响应。 定时器模式0的使用TMOD&=0xf0/TMOD&=0x0f TL0高3位不用,低5位溢出时,直接向TH0进位。 通过设置TH0和TL0初值(0~8191),使计数器从初值开始加1,溢出后申请中断,溢出后需重新设置初值,否则将从0开始加1计数。 T=(模值-初值)*机器周期,初值为8191位技术最小值1,初值为0为计数最

DSP 的定时器和外中断实验报告

实验三:DSP 的定时器和外中断 定时器: 一.实验目的 1.通过实验熟悉VC5509A 的定时器; 2.掌握VC5509A 定时器的控制方法; 3.掌握VC5509A 的中断结构和对中断的处理流程; 4.学会C 语言中断程序设计,以及运用中断程序控制程序流程。 二.实验设备 计算机,ICETEK-VC5509-A 实验箱(或ICETEK 仿真器+ICETEK–VC5509-A 系统板+ 相关连线及电源)。 三.实验原理 1.通用定时器介绍及其控制方法(详见spru595b.pdf): TMS320VC5509A 内部有两个20 位通用定时器(GP): * 每个通用定时器包括: - 一个16 位的减计数的计数器TIM; - 一个16 位的定时器周期寄存器PRD; - 一个16 位的定时器控制寄存器TCR; - 一个16 位的定时器预定标寄存器PSCR; * PSCR 寄存器说明: 15 10 9 6 5 4 3 0 Reserved PSC Reserved TDDR PSC: 4 位的预定标值,与TIM 共同组成20 位的定时计数器. TDDR: 预定标周期寄存器(在需要时重装入PSC 的值) TCR 寄存器说明(详见spru595b.pdf) 2.中断响应过程(详见spru595b.pdf): 外设事件要引起CPU 中断,必须保证:IER 中相应使能位被使能,IFR 相应中断也被 使能。在软件中,当设置好相应中断标志后,开中断,进入等待中断发生的状态;外设(如定时器)中断发生时,首先跳转到相应中断高级的服务程序中(如:定时器1 会引起TINT 中断),程序在进行服务操作之后,应将本外设的中断标志位清除以便能继续中断,然后返回。 3.中断程序设计: - 程序中应包含中断向量表,VC5509A 默认向量表从程序区0 地址开始存放,根据IPVD 和IPVH 的值确定向量表的实际地址。 - 注意观察程序中INTR_init()函数的定义部分,其中IPVD 和IPVH 的值都为0x0d0;同时 观察配置文件ICETEK–VC5509-AE.cmd 中的VECT 段描述中o=0x0d000。 - 向量表中每项为8 个字,存放一个跳转指令,跳转指令中的地址为相应服务程序入口地址。第一个向量表的首项为复位向量,即CPU 复位操作完成后自动进入执行的程序入口。 - 服务程序在服务操作完成后,清除相应中断标志,返回,完成一次中断服务 5.实验程序分析:

单片机定时器中断原理和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{} //运行完中断部分的代码后,接着继续执行死循环里的代码。 //注意:当TH0 = 0xff;TL0 = 0xff;再运行,TF0并没有从0变为1,个人猜测TF0=1;时触发了中断,并重新被置零。 //如把ET0 = 1;和EA=1;注释掉,当TH0 = 0xff;TL0 = 0xff;再运行,TF0会变为1,此时不会再执行中断部分代码。 while(1) { if ((SystemTime%100) 释疑:void Timer0() interrupt 1 using 1 Timer0 是函数名,随便取的 interrupt xx using y 跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1

相关文档
相关文档 最新文档