单片机中的定时器中断和计时器编程技巧

蓝色海洋之心 2020-05-31 ⋅ 58 阅读

在单片机开发中,定时器是一种常用的资源,用于生成一定时间间隔的中断信号或进行时间的计时。掌握定时器的编程技巧可以帮助我们更好地利用单片机的资源,实现各种功能。

1. 定时器中断

定时器中断是利用定时器生成的中断信号来唤醒单片机的一种方法。通过设置定时器的计数器初值和预设的溢出值,在定时器计数器溢出时触发中断,从而实现定时功能。

编程时,我们首先需要选择合适的定时器和中断源。然后,根据需求设置计数器初值和溢出值,使得中断周期符合要求。最后,编写中断处理函数,在函数内部实现指定的功能。

下面是一个简单的例子,使用定时器1和中断源TMR1来实现1秒钟的定时功能:

#include <reg51.h>

void timer1_init() {
    TMOD |= 0x10;   // 设置定时器1为工作在模式1(16位定时/计数器)下
    TL1 = 0x4C;     // 设置定时器1的计数器初值为0x4C
    TH1 = 0xFC;     // 设置定时器1的溢出值为0xFC
    ET1 = 1;        // 允许定时器1中断
    EA = 1;         // 允许中断
    TR1 = 1;        // 启动定时器1
}

void timer1_isr() interrupt 3 {
    // 在此处写入中断处理代码
}

void main() {
    timer1_init();
    while (1);
}

在以上代码中,我们通过设置定时器1的计数器初值和溢出值使得中断周期为1秒钟。当定时器1计数器溢出时,触发中断,程序跳转到timer1_isr()函数内部执行相应的处理逻辑。

2. 计时器

计时器是利用定时器的计数功能来进行时间累加的一种方法。通过设置计时器的时钟源和计数方式,在定时器的计数器中累加时钟脉冲,实现时间计时的功能。

编程时,我们需要选择合适的计时器和时钟源。然后,根据时钟源的频率和计数方式设置计数器初值,并在需要计时的时候读取计数器的值。最后,将计数器的值转化为可读的时间表示。

以下是一个简单的例子,使用定时器0和时钟源P1.1来实现秒表功能,每按下一次按键,显示经过的时间(秒):

#include <reg51.h>

void timer0_init() {
    TMOD |= 0x01;   // 设置定时器0为工作在模式0(13位计数器)下
    TR0 = 1;        // 启动定时器0
}

unsigned int timer0_count() {
    unsigned int count;
    TH0 = 0;        // 清零计数器初值
    TL0 = 0;
    while (P1_1);   // 等待按键松开
    while (!P1_1) { // 等待按键按下
        count = TH0 * 256 + TL0; // 读取计数器的值
    }
    return count;   // 返回计时结果
}

void main() {
    unsigned int count;
    timer0_init();
    while (1) {
        count = timer0_count();
        // 将计数器的值转化为可读的时间表示
        // 并显示在LED、LCD等输出设备上
    }
}

在以上代码中,我们通过设置定时器0的模式为模式0(13位计数器),并通过设置时钟源为外部引脚P1.1使得定时器0计数。每次按下按键时,我们读取计数器的值作为计时结果。

以上是单片机中的定时器中断和计时器编程技巧的简单介绍。根据具体的需求和单片机型号,我们可以灵活运用这些技巧来实现各种实用的功能。希望本文对大家有所帮助!


全部评论: 0

    我有话说: