51单片机中断系统详解

更新时间:2023-08-24 16:55:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

51 单片机中断系统详解(定时器、计数器)51 单片机中断级别中断源 INT0---外部中断 0/P3.2 T0---定时器/计数器 0 中断/P3.4 INT1---外部中断 1/P3.3 T1----定时器/计数器 1 中断 /P3.5 TX/RX---串行口中断 T2---定时器/计数器 2 中断 第5 最低 4 5 默认中断级别 最高 第2 第3 第4 序号(C 语言用) 0 1 2 3 intrrupt 0

中断允许寄存器 IE位 序 号 符 号 位 EA/0 ------ET2/1 ES ET1 EX1 ET0 EX0 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

EA---全局中允许位。 EA=1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打 开或关闭。 EA=0,关闭全部中断。 -------,无效位。

ET2---定时器/计数器 2 中断允许位。ET2=1, 打开 T2 中断。 ET2=0,关闭 T2 中断。 关,…… ES---串行口中断允许位。 关,…… ES=1,打开串行口中断。 关,…… ES=0,关闭串行口中断。 关,…… ET1---定时器/计数器 1 中断允许位。 关,…… ET1=1,打开 T1 中断。 ET1=0,关闭 T1 中断。 EX1---外部中断 1 中断允许位。 EX1=1,打开外部中断 1 中断。 EX1=0,关闭外部中断 1 中断。 ET0---定时器/计数器 0 中断允许位。 ET0=1,打开 T0 中断。

EA 总中断开关,置 1 为开;EX0 为外部中断 0 (INT0) 开关, …… ET0 为定时器/计数器 0(T0)开 EX1 为外部中断 1(INT1)开 ET1 为定时器/计数器 1(T1)开 ES 为串行口(TX/RX)中断开 ET2 为定时器/计数器 2(T2)开

ET0=0,关闭 T0 中断。 EX0---外部中断 0 中断允许位。 EX0=1,打开外部中断 0 中断。 EX0=0,关闭外部中断 0 中断。

中断优先级寄存器 IP位 序 号 位 地 址 ------PS/0 PT1/0 PX1/0 PT0/0 PX0/0 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

-------,无效位。 PS---串行口中断优先级控制位。 PS=1,串行口中断定义为高优先级中断。 PS=0,串行口中断定义为低优先级中断。 PT1---定时器/计数器 1 中断优先级控制位。 PT1=1,定时器/计数器 1 中断定义为高优先级中断。 PT1=0,定时器/计数器 1 中断定义为低优先级中断。 PX1---外部中断 1 中断优先级控制位。 PX1=1,外部中断 1 中断定义为高优先级中断。 PX1=0,外部中断 1 中断定义为低优先级中断。 PT0---定时器/计数器 0 中断优先级控制位。 PT0=1,定时器/计数器 0 中断定义为高优先级中断。 PT0=0,定时器/计数器 0 中断定义为低优先级中断。 PX0---外部中断 0 中断优先级控制位。 PX0=1,外部中断 0 中断定义为高优先级中断。 PX0=0,外部中断 0 中断定义为低优先级中断。

定时器/计数器工作模式寄存器 TMOD位序 号 位符 号 GATE C/T M1 M0 GATE C/T M1 M0 DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0

|---------定时器 1-----------------------|-------- ------定时器 0----------------------| GATE---门控制位。 GATE=0,定时器/计数器启动与停止仅受 TCON

寄存器中 TRX(X=0,1)来控制。 GATE=1, 定时器计数器启动与停止由 TCON 寄存器中 TRX(X=0,1)和外部中断引 脚(INT0 或 INT1)上的电平状态来共同控制。 C/T---定时器和计数器模式选择位。 C/T=1,为计数器模式;C/T=0,为定时器模式。 M1M0---工作模式选择位。M 1 0 M 工作模式

0 0 1 1 位 序 号 符 号 位 TF1 DB7

0 1 0 1 DB6 DB5

方式 0,为 13 位定时器/计数器 方式 1,为 16 位定时器/计数器 方式 2,8 位初值自动重装的 8 位定时器/计数器 方式 3,仅适用于 T0,分成两个 8 位计数器,T1 停止工作 DB4 DB3 DB2 DB1 DB0

定时器/控制器控制寄存器 TCON

TR1

TF0

TR0

IE1 /1

IT1/P3.3 0/1

IE0

IT0P3.2

TF1---定时器 1 溢出标志位。 当定时器 1 记满溢出时,由硬件使 TF1 置 1,并且申请中断。进入中断服务程 序后,由硬件自动清 0。需要注意的是,如果使用定时器中断,那么该位完全不用人 为去操作,但是如果使用软件查询方式的话,当查询到该位置 1 后,就需要用软件清 0。 TR1---定时器 1 运行控制位。 由软件清 0 关闭定时器 1。当 GATE=1,且 INIT 为高电平时,TR1 置 1 启动定 时器 1;当 GATE=0 时,TR1 置 1 启动定时器 1。 TF0---定时器 0 溢出标志,其功能及其操作方法同 TF1。 TR0---定时器 0 运行控制位,其功能及操作方法同 TR1。 IE1---外部中断 1 请求标志。 当 IT1=0 时,位电平触发方式,每个机器周期的 S5P2 采样 INT1 引脚(p3.3), 若 NIT1 脚为低电平,则置 1,否则 IE1 清 0。 当 IT1=1 时,INT1 为跳变沿触发方式,当第一个及其机器周期采样到 INIT1 为 低电平时,则 IE1 置 1。IE1=1,表示外部中断 1 正向 CPU 中断申请。当 CPU 响应中 断,转向中断服务程序时,该位由硬件清 0。 IT1 外部中断 1 触发方式选择位。 IT1=0,为电平触发方式,引脚 INT1 上低电平有效。 IT1=1,为跳变沿触发方式,引脚 INT1 上的电平从高到低的负跳变有效。 IE0---外部中断 0 请求标志,其功能及操作方法同 IE1。 IT0---外部中断 0 触发方式选择位,其功能及操作方法同 IT1。 从上面的知识点可知,每个定时器都有 4 种工作模式,可通过设置 TMOD 寄存 器中的 M1M0 位来进行工作方式选择。 方式 1 的计数位数是 16 位,对 T0 来说,由 TL0 寄存器作为低 8、TH0 寄存器 作为高 8 位,组成了 16 位加 1 计数器。 关于如何确定定时器 T0 的初值问题。定时器一但启动,它便在原来的数值上开 始加 1 计数,若在程序开始时,我们没有设置 TH0 和 TL0,它们的默认值都是 0,假 设时钟频率为 12MHz,12 个时钟周期为一个机器周期,那么此时机器周期为 1us,记 16 满 TH0 和 TL0 就需要 2 -1 个数, 再来一个脉冲计数器溢出, 随即向 CPU 申请中断。 因此溢出一次共需 6

5536us,约等于 65.6ms,如果我们要定时 50ms 的话,那么就需要 先给 TH0 和 TL0 装一个初值,在这个初值的基础上记 50000 个数后,定时器溢出, 此时刚好就是 50ms 中断一次,当需要定时 1s 时,我们写程序时当产生 20 次 50ms

的定时器中断后便认为是1s,这样便可精确控制定时时间啦。要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536.,把15536对256求模:15536/256=60装入TH0中,把15536对256求余:15536/256=176装入TL0中。

以上就是定时器初值的计算法,总结后得出如下结论:当用定时器的方式1时,设机器周期为TCY,定时器产生一次中断的时间为t,那么需要计数的个数为N=t/TCY ,装入THX和TLX中的数分别为:

THX=(65536-N)/256 , TLX=(65536-N)%256 <x为0或1> 中断服务程序的写法

void 函数名()interrupt 中断号 using 工作组 {

中断服务程序内容 }

在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置,通常定时器初始化过程如下:

(1)对TMOD赋值,以确定T0和 T1的工作方式。

(2)计算初值,并将初值写入TH0、TL0或TH1、TL1。 (3)中断方式时,则对IE赋值,开放中断。

(4)使TR0和TR1置位,启动定时器/计数器定时或计数。

例:利用定时器0工作方式1,实现一个发光管以1s亮灭闪烁。 程序代码如下: #include<reg52.h>

#define uchar unsigned char #define uint unsigned int sbit led1=P1^0; uchar num; void main() {

TMOD=0x01; //设置定时器0位工作模式1(M1,M0位0,1) TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872

TL0=(65536-45872)%256; EA=1; //开总中断

ET0=1; //开定时器0中断 TR0=1; //启动定时器0 while(1) {

if(num==20) //如果到了20次,说明1秒时间 {

led1=~led1; //让发光管状态取反 num=0; } } }

void T0_time()interrupt 1

{

TH0=(65536-45872)/256; //重新装载初值 TL0=(65536-45872)%256; num++; }

本文来源:https://www.bwwdw.com/article/a3ni.html

Top