数码管计时器与单片机应用

时光旅者 2021-03-31 ⋅ 28 阅读

引言

数码管是一种常见的显示器件,常用于计时器等应用中。结合单片机的控制能力,实现一个数码管计时器非常简单,而且可以应用于各种场景。本篇博客将介绍数码管计时器的原理及其在单片机中的应用,并附上具体的代码示例。

原理

数码管是由多个7段LED组成,分别对应数字0-9以及一些特殊字符。通过控制每个段的亮灭,可以显示出任何数字或字符。常见的数码管有4位和7位两种。

计时器的原理很简单,就是通过一个定时器来计算时间,并用数码管实时显示出来。具体流程如下:

  1. 初始化定时器,设定计时时间间隔。
  2. 开启定时器。
  3. 定时器溢出中断触发时,计时器的计数值加1,溢出中断服务程序将计时值进行解析,分别显示在各个数码管上。

单片机应用

在单片机中实现一个数码管计时器非常简单,只需配置好定时器和中断即可。以下以C语言为例,演示在STC89C52单片机上实现一个4位数码管计时器。

#include <reg52.h>

sbit dula = P2^6;
sbit wela = P2^7;
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char second = 0;   // 秒
unsigned char minute = 0;   // 分
unsigned char hour = 0;     // 时

void display(unsigned char sec, unsigned char min, unsigned char hr) {
    P1 = 0xff;    // 关闭所有的数码管
    wela = 1;     // 打开位选锁存器
    P0 = 0xf7;    // 第一个数码管选通
    wela = 0;     // 锁存位选器输出
    P1 = table[sec%10];   // 显示秒个位
    dula = 1;    // 打开段选锁存器
    dula = 0;    // 锁存段选输出

    wela = 1;     // 打开位选锁存器
    P0 = 0xef;    // 第二个数码管选通
    wela = 0;     // 锁存位选器输出
    P1 = table[sec/10];   // 显示秒十位
    dula = 1;    // 打开段选锁存器
    dula = 0;    // 锁存段选输出

    wela = 1;     // 打开位选锁存器
    P0 = 0xdf;    // 第三个数码管选通
    wela = 0;     // 锁存位选器输出
    P1 = table[min%10];   // 显示分个位
    dula = 1;    // 打开段选锁存器
    dula = 0;    // 锁存段选输出

    wela = 1;     // 打开位选锁存器
    P0 = 0xbf;    // 第四个数码管选通
    wela = 0;     // 锁存位选器输出
    P1 = table[min/10];   // 显示分十位
    dula = 1;    // 打开段选锁存器
    dula = 0;    // 锁存段选输出
    
    wela = 1;     // 打开位选锁存器
    P0 = 0x7f;    // 第五个数码管选通
    wela = 0;     // 锁存位选器输出
    P1 = table[hr%10];    // 显示时个位
    dula = 1;    // 打开段选锁存器
    dula = 0;    // 锁存段选输出
}

void init_timer() {
    TMOD = 0x01;    // 设定定时器0为模式1
    TH0 = 0xfc;     // 重装初值,100us
    TL0 = 0x18;
    EA = 1;     // 允许总中断
    ET0 = 1;    // 允许定时器0中断
    TR0 = 1;    // 开始计时
}

void timer0() interrupt 1 {    // 中断服务程序
    TH0 = 0xfc;    // 重装初值,100us
    TL0 = 0x18;
    display(second, minute, hour);
    second++;
    if (second >= 60) {
        second = 0;
        minute++;
        if (minute >= 60) {
            minute = 0;
            hour++;
            if (hour >= 24) {
                hour = 0;
            }
        }
    }
}

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

结论

通过单片机和数码管的结合,我们可以实现各种计时器应用。数码管计时器不仅仅可以显示时间,还可以显示其他数据,如温度、湿度等。希望本篇博客对你了解数码管计时器的原理和单片机的应用有所帮助。

参考资料:


全部评论: 0

    我有话说: