单片机与数码管显示:编写计时器程序

蓝色海洋之心 2021-01-23 ⋅ 19 阅读

在单片机的应用中,数码管的显示是非常常见的需求之一。本篇博客将介绍如何编写一个简单的计时器程序,并使用数码管进行显示。

准备工作

首先,我们需要准备以下材料和工具:

  • 单片机开发板(如STC89C52)
  • 数码管(共阴或共阳)
  • 面包板、连接线等基础元件
  • Keil C51开发环境

硬件连接

首先,我们需要将数码管与单片机进行连接。连接方式根据数码管的类型(共阴或共阳)有所不同。以共阴数码管为例,连接方式如下:

  • 选一个IO口作为控制位(如P1.0),连接到数码管的COM端;
  • 将数码管的A、B、C、D、E、F、G引脚分别连接到单片机的IO口(如P2.0~P2.6);
  • 还需要为数码管上电,可以连接到单片机的5V和GND引脚上。

编写程序

下面我们将编写一个简单的计时器程序,用于实现秒表功能。

首先,需要引入头文件并定义一些常量和变量:

#include <reg52.h>

// 数码管共阴极控制的IO口
sbit D_A = P2^0;
sbit D_B = P2^1;
sbit D_C = P2^2;
sbit D_D = P2^3;
sbit D_E = P2^4;
sbit D_F = P2^5;
sbit D_G = P2^6;

// 控制位的IO口
sbit COM = P1^0;

// 计时器计数变量
unsigned int second = 0;

然后,编写一个延时函数,用于控制数码管的刷新速度:

void delay(unsigned int t) {
    unsigned int i, j;
    for (i = 0; i < t; i++) {
        for (j = 0; j < 120; j++);
    }
}

接下来,编写一个数码管位选函数,用于选择显示的数码管:

void selectDigit(unsigned int digit) {
    // 数码管控制位高电平选中
    COM = 1;

    // 根据对应位选中数码管
    switch (digit) {
        case 1:
            D_A = 0; D_B = 0; D_C = 0; D_D = 1; D_E = 1; D_F = 1; D_G = 1;
            break;
        case 2:
            D_A = 1; D_B = 0; D_C = 0; D_D = 0; D_E = 1; D_F = 0; D_G = 0;
            break;
        case 3:
            D_A = 0; D_B = 0; D_C = 1; D_D = 0; D_E = 1; D_F = 0; D_G = 1;
            break;
        case 4:
            D_A = 0; D_B = 1; D_C = 0; D_D = 1; D_E = 1; D_F = 0; D_G = 1;
            break;
    }

    // 数码管控制位低电平关闭
    COM = 0;
}

然后,编写一个数码管显示函数,用于显示当前的计时器值:

void display(unsigned int value) {
    // 获取百位、十位和个位的值
    unsigned int hundreds = value / 100;
    unsigned int tens = value % 100 / 10;
    unsigned int ones = value % 10;

    // 数码管依次显示
    selectDigit(1);
    P2 = hundreds; delay(1);
    selectDigit(2);
    P2 = tens; delay(1);
    selectDigit(3);
    P2 = ones; delay(1);
}

最后,编写一个主函数,用于实现计时器功能:

void main() {
    // 计时器初始化
    TMOD = 0x01;  // 定时器0工作在模式1,用于1ms中断
    TH0 = 0xFC;
    TL0 = 0x66;
    EA = 1;  // 总中断开关
    ET0 = 1;  // TIMER0中断开关
    TR0 = 1;  // 定时器0开始计时

    // 主循环
    while(1) {
        display(second);  // 显示当前计时器值
    }
}

// 定时器0中断服务函数
void timer0Interrupt() interrupt 1 {
    second++;  // 每1ms增加一次计时器值
    TH0 = 0xFC;
    TL0 = 0x66;
}

编译、烧录和运行

将上述代码保存为一个.c文件,使用Keil C51编译生成机器码,并使用STC-ISP工具将机器码烧录到单片机中。

烧录完成后,将单片机连接到外部电源,计时器将开始运行,并通过数码管显示当前计时器的值。

结语

通过本篇博客的介绍,我们学会了如何编写一个简单的计时器程序,并通过数码管进行显示。希望这对您有所帮助,欢迎探索更多有关单片机和数码管的应用!


全部评论: 0

    我有话说: