ATmega16的中断系统与定时器/计数器的使用


维普资讯 http://www.cqvip.com

文/ 李鹏 飞 
本期 文章 ,笔者 将在 上两 期 电路 

为 中 断 向 量 。 中 断 向 量 表 见  各中断源单独的中断控制寄存器共同  控制。 要使单片机响应某个中断请求 ,   中断向量保证了单片机执行与中  必须同时使允许全局 中断和该中断源  断源相对应的中断服务程序。 如表l 所  的 中断控制 位有效 。全局 中断可 以 比 

的基础上,在 At g I me a6单片机中编  A mea 6 T g 1 的数据手册 4 页。 2   入程序 , 实现以下功能: 按下按键, 定 
时器 / 数器0 计 开始 工作 , 发生溢 出 若  

中断,在中断服务程序 中向串口工具  示 ,单片机上电复位后程序计数器在  作一个房间的总电开关,其他的中断  输出进入中断的次数 ,并点亮相应的  代码区 ¥00 ,所以一般在此处放  控制寄存器则如同这个房问内电灯 、 00 处   L D 抬起按键, E l 定时器/ 计数器 0 停  置一条跳转指令到用户程序起始处 。   止工作 ,进人中断的数值清零 ,L D E   假设从地址¥0 0 04 处开始是用户程序 。  
熄灭 。  

电视机 等 电器 的开关 。  

全局 中断位 I位 于状态 寄存器 

如 果在 程 序运 行 期 间 ,有 外 部 中 断  S E R G的第7 位, 即最高位。 全局中断 

为了实现以上功能,我们要用到   I 0 NT 请求, 单片机会在保存完程序计  位 I l 为 。即全局中断允许 l为 0 ,全  A R V 单片机的中断功能和定时器/ 计  数器后跳转到I T 的中断向量¥0 2 局中断关闭。 N O 00  指令 “ E”可以设置位  SI
数器功 能 。下面 ,先请 读者 了解一 下  关于 中断的知识 。   触发下 ,单片机 放下 目前正 在处理 的 

处,在 ¥ 02 0 0 处用户放置一条跳转指  I , 为l 打开全局中断; 指令 “ L ” C I 可 
令 “m   X _ N 0 , j p E T I T ” 这样 , 单片机 

以清除位 I 0 为 ,关闭全局中断。  
AT e a6 m g 1进入 中断服务程 序后 ,   断。 在执行 完 中断服务 程序 , E I , R T返 

中断,就是在某种事件或条件的  在 I O NT 的中断向量 ¥ 0 2 0 0 处,执行  任务 A,转去处理具有更高优先级的 
自定义 的地 址 E T I T 。然 后在地  X  N 0

“m   X — N 0 指令跳转到编程者  硬 件 自 将位 I 0 不再 响应 其他 中  ip E T I T ” 动 清 , 回时, 硬件 自动置 I 位为 “ ” 从而允  1, 如果要使单片机在中断中仍然能够响  应 中断 ,也就是实现 中断嵌套,应该 
寰1  

任务 B。中断可以提高单片机的工作  址 E T I T 处编写中断服务程序 , X  N 0   理的任务。完整的中断系统要求:首  序而非其他的中段服务程序被执行。   先必须有事件或者外部触发引起单片  机的中断, 即中断源提请中断请求 然  \蠢t   t | l  蛰   饕 每■     l  濑蔼   毯| b  警 髑 _   | 自

  效率,使单片机优先执行需要及时处  这样就保证了是 I T N 0的中断服务程  许单片机再次响应下一个 中断请求。

在 中断服务程序 中使用指令 “E ” S I 打 
开 全局 中断 。   接下 来我 们通 过一个 应用 实例 进 


后单片机放下任务 A跳转到与中断源 
对应的特定地址去处理中断服务程序,   这时候单片机需要保存 目前的程序计  数器值 ,程序计数器可以使单片机在  中断返回后继续执行原来的程序 ,单 
片机 完成 中断服务程序 ,取 出保存 的 



¥00 00 
¥【 2 O)   0

r  EE   j R ST mp
r  X j E  JN 0 mp T 

¥0O 04 

R S T£ E E 代码  代码 

步 了解 A mea6 中断系统 ,并  T g 1的

¥20 0 0 

E TJ 0 代码  X .NT : RE TI( 中断返回)  

初步掌握该单片机 定时器 /计数器 
(/ O T C )的使用方 法 。   T C / 0的工作过程 比较 简单 ,T   /

程序计数器值 ,继续处理任务 A,即 
中断返回。程序计数器 的保存与取出   由硬件 自动完成 , 无需用户程序参与。  
就 是说有 2 种 不 同的 方 式可 以引 起  0

O 位计数 器 , 以进  可 需要注意 ,代码区fa h字长为  C 实际上 是一个 8 ls — 5 的计数 。开始 计数后 ,计数  1bt 6i ,即2 个字节。例如对于上表中  行 0 2 5 的地址 ¥00 0 4 ,其字节地 址是 ¥ 00  08。

寄存器T NT  ̄从初始值 ( C 0 用户根据 

)计数到 2 5 5,   A mea6 T g 1 共有 2 个中断源,也  在编写程序时常用来实现查表功能的  需要设定 ,也可以为 0 0 可以设置溢 出中断, 向C U提  P 指令 l m”所使用的地址为字节地  溢出 ( p 出中断请求)之后,继续从初始值开  始计数。 图l 如 所示 , 假设计数时钟为 
A mea 6 中断 由全 局 中断和  T gl的   A me a6 T g [ 发生中断。对于不同的中   址 ,在 编写程序 时应 当注意 。

断源 ,单片机有不周的跳转地址 ,  

2 006. 第5巳 4总 3期 . ^  ̄8 i G m.I wⅥ Ⅳr do.O C I '  

3  7

维普资讯 http://www.cqvip.com

始 计数 。  

时钟 一 L    
TC T   f t 蚺  f一 蚺 t ??  I■ 担 t   ■ 值 【计 柱 世 ( 鼙 I I NO 计 制 位 计 栅 值+(    ?   太   【 ★   一 l   汁 蜘I   蚋 I 值+

关于设置T N 0 C T 的初始值, 假设 

C U系统时钟为内部 l z P MH ,时钟分 

~ 、   出中斯  一此处溢 
圈1  

频为 12 ,可以算出T C 计数一次  04 /0 耗费的时间为 T I (M/ 04 = / 1 12 )秒 ,  
如果我们想获得0 2 秒的定时, .5 那么  可以得出TC T 的初始值应该满足= N 0   而可以算得T N 0 C T 的初始值为 l,   即  2
0 C。 XO  

系统时钟。 实例将要演示的就是T C   / 0 溢出中断的使用方法。   T/C 0由一组控制寄存器控 制。  
来控 制选择 ,见 表 2  。

当T I0 O E 被设置 为 i 并且全局 中 ,  

断位I 也为 i 允许T C 溢出中断。 T X (5-计数初始 值 ) 02 I进  时, / 0     25 ; .5 此时。如果 T C 计数溢出,将引起  / 0
蔽 T C 溢 出 中断。 / 0  
i  r16,   di l o  TI K, l6 ut MS r  

T C 的时钟源由8 /0 位寄存器 T C 0 A mea6 k C R  T g l  ̄) 中断 。 此位 为0 则屏  ,

本例的详细程序清单及注释见本 
期配刊光盘。本例无需新加硬件 ,在 
原来 的线路 板上 即可运行 。在将 代码 

以上程序打开T/ 0的计数溢出  烧录入A m g l 以后,因为程序是  C T e a6 其中位2 ~位 0 用来选择T C 使  中断 。 / 0   用何种时钟源,见表 3  。
爱 萎藏 揪 
O  
0  

按照 I MHz 的系统时钟编写的。需要  将系统时钟修改为内部 I zRC振  MH   荡。修改方法 已经在上一期的文章中 

定 时 /计数嚣中断标志寄存器 TF ; I   R

O  
O  

0  
1  

没有时钟源 .TME / I R0  
C OUN R0 止  TE 俘

介绍过。本实例中所用串口波特率为 
位 0 - O 0 T C 溢 出 中断标  - T V: /0
志 位。  

40 ,在设置串口工具时应该注意。 80   读者 可以使用 AV   tdo R Su i 软件 

系统时钟 

0   O   1  

1   1   0  

O   l   O  

系统 时钟 /  8 系统时钟 / 2 3 
系统 时钟 / 5  26

当T C 产生溢出时, O 0 /0 T V 位被  模拟调 试本实例 ,能更清晰地看到 

1   1   l  

0   1   1  

I   O   l  

系统时钟 / 04 12  外郡时钟 TO 管脚 ,下降沿有效  外部时钟 TO 管脚 。上升沿有效 

硬件 自动变为 l 当单片机转入 T C   A mea6中断系统的工作过程。 。 /0 T gl   溢出中断服务程序时,该位由硬件 自   程序的运行效果如图2 所示。   动清零。如果不使用中断方式 ,查询 

以下程序选择系统时钟的 12 分  该位可以判断T C 是否发生溢出。 04 /0  

频作为 T C 的计数时钟源; /0  
i  rl6,   di 5 o  T R0, ut CC rl6  

接下来看一下使用 T C 溢出中 / 0   断的完整初始化过程 :  
i  rl6,   di 0

TC T 是T C   位计数寄存  N 0 / 0 的8

o t C R , l  u  T C 0 r 6

首先 停 止 

器。 C T 的当前计数值可以通过读  T C T N 0 / O工 作  

取该寄存器获得, 也可以为T N 0 C T 赋 
值。  
i  r di l6,   12 out  TC NT0, rl6  

l  r16,。 di 。  

.  

ot IS r6 u  T M K, l  

允许 溢 出  

中断 
l  rl 0 di 6, X0C  

以上程序 将十进 制数 l 送给    2
TCNT0  

o   NT RI6 ut TC 0,  

设 置 T NT   C 0

初始 值 , 使其每 0。 5 发生一 次计数  2秒 溢 出中断  si e 
完成 

下面介绍几个与定时 /计数器有 
关 的寄 存器 。  
定时 /计数器 中断屏蕾寄存嚣 TM K  IS ,

‘   打 开全局 中断 ,初 始化  本 文练 习:1 将上期 本 系列 文章  .

下面程序使 T N O C T 开始工作 :  
i  rl 5 di 6,  

中的 UA T 信例程 改为使 用 中断方  SR 通
式与 P 机进 行通 信。2 C  查 阅A r a  T  ̄g I  6 数据 手册 关于 T C / 0的 P M工作 方 式  w

位 O 一 O E : / 0 出中断允  一 T IO T C 溢

o tT C 0 R 6 u   C R , I 

设 置 时 钟 

许标志位。  

分频 为 1 2 0 4,即 T C 0 5 / 0开  C R = ,T C

的相关内容,尝试进行 P M蝙程。 w 回 

3   e o .总 5 3 w 8 o s 4 簟 穹 期? ww. c . m.n r lc , i 。 c  s 口


相关文档

更多相关文档

Atmega16定时器
Atmega16定时器
4.ATmega16中断系统
ATmega16定时器中断
Atmega16的定时器time0
电脑版