单片机学习之中断与定时计数器

本文详细介绍了单片机89C51中的中断系统,包括中断请求、中断允许控制、中断标志以及定时/计数器的使用方法。通过示例代码展示了如何设置定时器和外部中断,并讨论了中断优先级和计数器初值计算的相关知识。
摘要由CSDN通过智能技术生成

单片机学习之中断与定时/计数器

1. 中断及相关概念

CPU在处理 事件A 时,中断源 发出中断请求,请求cpu处理事件B ,cpu 中断 当前工作,转去处理事件B(中断响应和中断服务),待cpu将 事件B 处理完成后,再回到原来被中断的地方,继续处理事件A。89C51的中断系统有5个中断源 (INT0, T0, INT1, T1, RI/TI)

2.中断允许控制

CPU 对 中断系统所有中断是否打开及相应控制 由 中断允许寄存器IE 控制的。

  • EX0:外部中断 0 允许位。IE0
  • ET0:定时/计数器T0 中断允许位。IE1
  • EX1:外部中断 1 允许位。IE2
  • ET1:定时/计数器 T1 中断允许位。IE3
  • ES:串行口 中断 允许位。
  • EA: CPU中断允许位(总允许,)。所有中断都需要打开。

3.中断请求标志

中断标志

IT0:外部中断0 触发方式控制位。TI0=0时,为电平触发方式,IT0=1, 为 边沿触发方式(下降沿有效)。
IE0: 外部中断0 中断请求标志位。
IT1:外部中断1 触发方式控制位。IT1=0时,为电平触发方式,IT1=1时,为边沿触发方式(下降沿有效)。
IE1:外部中断1 中断请求标志位。
TF0:定时 /计数器T0 溢出中断请求标志位。
TFI:定时/计数器T1 溢出中断请求标志位。
各个中断源响应优先级及中断服务。当同一等级优先级的有多个时,存在排队问题。51单片机的中断优先级三条原则:

  • CPU 同时接收多个中断请求时,优先响应优先级级别最高的。
  • 正在进行的中断 不能被新的 同级别或更低优先级的中断请求中断
  • 正在进行的低等级中断服务, 能被更高优先级 的中断请求中断。

定时/计数器的工作方式
定时器模式时 N=t/Tcy

使用定时器步骤:

对TMOD赋值,即确定T0和T1的工作方式。
计算初值,并将其写入TH0、TL0(或TH1,TL1)。
选择中断方式,对EA赋值,打开定时器中断。
使TR0或TR1置位,启动定时/计数器定时或计数。
计数器初值的计算

时钟周期与时钟频率互为倒数。例如:频率为20赫兹(Hz),周期为1/20=0.05秒(s)。

机器周期=1/单片机的时钟频率(时钟频率通常指同步电路中时钟的基础频率,它以“若干周期每秒来度量”,频率为周期的倒数)。
51单片机内部时钟频率是外部时钟的12分频。当外部晶振的频率输入单片机里面的时候要进行12分分频。例如:单片机选择12MHZ的晶振,它的时钟周期是1/12us,机器周期为12*(1/12)us 。如果一个单片机选择了12兆赫兹晶振,它的时钟周期是1/12us,它的一个机器周期是12×(1/12)us,也就是1us。
例如:要求1s的初值,1s/1us=1000000 ,需要计数1000000,初值=0XFFFF-1000000+1(65535=0xFFFF 即 16位计数),注意:此时计数已经超过 65535 所以 不能直接 定时1 s.

4.示例代码:

#include “reg52.h”

typedef unsigned int u16;
typedef unsigned char u8;

sbit k3=P3^2;
sbit k4=P3^3;
sbit led=P2^0;

u16 m = 0;

/*******************************************************************************

  • 函 数 名 : delay

  • 函数功能 : 延时函数,i=1时,大约延时1s
    ******************************************************************************/
    void delay(u16 i)
    {
    while(1)
    {
    if(m == i
    20)
    {
    m = 0;
    led=~led;
    }

    }
    }

/*******************************************************************************

  • 函 数 名 : Timer0Init
  • 函数功能 : 定时器0初始化
  • 输 入 : 无
  • 输 出 : 无
    *******************************************************************************/
    void Timer0Init()
    {
    TMOD |= 0X01;//启用定时模式
    TH0= 0Xfc; //给定时器赋初值,定时1ms
    TL0 = 0X18;
    ET0=1;//打开定时器0中断允许
    EA = 1;//打开总中断
    TR0 =1; //打开定时器
    }

/*******************************************************************************

  • 函 数 名 : Timer1Init
  • 函数功能 : 定时器1初始化
  • 输 入 : 无
  • 输 出 : 无
    *******************************************************************************/
    void Timer1Init()
    {
    TMOD |= 0X10;//启用定时模式 ,使用或(|),防止0位对TMOD寄存器产生干扰
    TH1= 0X3c; //给定时器赋初值,定时50ms
    TL1 = 0Xb0;
    ET1=1;//打开定时器1中断允许
    EA = 1;//打开总中断
    TR1 =1; //打开定时器
    }

/*******************************************************************************

  • 函 数 名 : main
  • 函数功能 : 主函数
  • 输 入 : 无
  • 输 出 : 无
    *******************************************************************************/
    void main()
    {
    //Interrupt0Init();// 设置外部中断0
    Timer1Init();
    delay(5);
    }

/**************************************************************************************

  •                 外部中断0实验												  *
    

实现现象:下载程序后按下K3按键可以对D1小灯状态取反。
注意事项:无。
*/
void InterruptTest0() interrupt 0 //外部中断0 的 中断函数
{
delay(1000); //延时消抖
if(k3 == 0)
{
led=~led;
}
}
/

  •                 外部中断0实验												  *
    

实现现象:下载程序后按下K3按键可以对D1小灯状态取反。
注意事项:无。
***************************************************************************************/
void InterruptTest2() interrupt 2 //外部中断1 的 中断函数
{
delay(1000); //延时消抖
if(k4 == 0)
{
led=~led;
}
}

/*******************************************************************************

  • 函 数 名 : void Timer0InterruptTest() interrupt 1
  • 函数功能 : 定时器0中断函数
  • 输 入 : 无
  • 输 出 : 无
  • 注意事项 :如果执行程序过长,则不能放在中断中
    *******************************************************************************/
    void Timer0InterruptTest() interrupt 1
    {
    static u16 i;
    TH0= 0Xfc;
    TL0 = 0X18;
    i++;
    if(i == 1000)
    {
    i=0;
    led=~led;
    }
    }

/*******************************************************************************

  • 函 数 名 : void Timer1InterruptTest() interrupt 3
  • 函数功能 : 定时器1中断函数
  • 输 入 : 无
  • 输 出 : 无
  • 注意事项 :如果执行程序过长,则不能放在中断中,否则将会影响产生中断时间,将执行程序放入延时delay函数中
    *******************************************************************************/
    void Timer1InterruptTest() interrupt 3
    {
    TH1= 0X3c;
    TL1 = 0Xb0;
    m++;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值