单片机:实现秒表(附带源码)

使用单片机实现秒表(计时器)是一个非常好的项目,它帮助你理解定时器、按键输入以及显示控制的基本应用。我们可以通过定时器来生成精准的时间基准,使用按键来控制秒表的启动、停止和重置,并通过LCD屏幕显示计时结果。

1. 项目概述

我们将实现一个基本的秒表功能,主要有以下几个功能:

  • 启动/停止:按下一个按钮启动秒表,按下再次停止秒表。
  • 重置:按下另一个按钮将秒表重置为0。
  • 显示时间:通过LCD屏幕显示当前时间。
  • 2. 硬件需求

    1. 单片机:我们使用8051单片机作为控制器,类似的可以用其他微控制器。
    2. LCD屏幕:显示时间,通常我们使用16×2字符LCD,显示格式为“秒:分:时”。
    3. 按键:两个按键,一个用于启动/停止,另一个用于重置秒表。
    4. 电源:为单片机和LCD提供必要的电源。

    3. 硬件连接

  • LCD连接:假设我们使用的是1602 LCD,采用4线方式连接到8051单片机。
  • 按键连接:使用两个按键,一个连接到P1.0(启动/停止),一个连接到P1.1(重置)。
  • 4. 秒表的原理

    为了实现秒表功能,我们需要用到单片机的定时器。8051单片机具有内置的定时器,可以用来生成时间间隔。我们使用定时器每隔1秒更新一次秒表,按键控制秒表的启动、停止和重置。

  • 启动/停止按钮:按下按钮后,秒表开始计时,再按一次按钮停止计时。
  • 重置按钮:按下按钮时,秒表归零。
  • 5. 程序设计

    5.1 定时器配置

    8051的定时器通过设置寄存器来控制。为了实现秒表功能,我们可以使用定时器0或者定时器1。我们设定定时器每产生1秒中断一次,触发更新秒表。

    5.2 按键输入

    我们需要使用按键来控制秒表的启动、停止和重置。按键的输入可以通过轮询方式进行处理。

    5.3 LCD显示

    使用LCD显示时间,我们显示格式为“秒:分:时”,每次时间更新时刷新LCD屏幕。

    6. 程序实现

    #include <reg51.h>
    #include "lcd.h"  // 假设已提供LCD的相关函数
    
    #define KEY_START_STOP P1_0  // 启动/停止按键
    #define KEY_RESET P1_1  // 重置按键
    
    unsigned char seconds = 0;  // 秒
    unsigned char minutes = 0;  // 分
    unsigned char hours = 0;    // 时
    bit is_running = 0;         // 秒表状态(启动或停止)
    
    void delay(unsigned int time) {
        unsigned int i, j;
        for(i = 0; i < time; i++) {
            for(j = 0; j < 1275; j++) {
                // 空循环实现延时
            }
        }
    }
    
    // 定时器0中断服务程序
    void timer0_ISR() interrupt 1 {
        // 每秒触发一次
        if (is_running) {
            seconds++;
            if (seconds == 60) {
                seconds = 0;
                minutes++;
                if (minutes == 60) {
                    minutes = 0;
                    hours++;
                    if (hours == 24) {
                        hours = 0;
                    }
                }
            }
            // 更新时间到LCD
            update_lcd();
        }
        // 清除定时器0中断标志
        TH0 = 0x3C;  // 设置定时器初值
        TL0 = 0xB0;
    }
    
    // 更新LCD显示时间
    void update_lcd() {
        lcd_clear();
        lcd_set_cursor(0, 0);
        lcd_print("Time: ");
        lcd_print_num(hours);
        lcd_print(":");
        lcd_print_num(minutes);
        lcd_print(":");
        lcd_print_num(seconds);
    }
    
    // 初始化定时器
    void timer_init() {
        TMOD = 0x01;  // 配置定时器0为模式1(16位计数)
        TH0 = 0x3C;   // 设置定时器初值
        TL0 = 0xB0;   
        IE = 0x82;    // 开启定时器中断
        TR0 = 1;      // 启动定时器0
    }
    
    // 初始化按键输入
    void key_init() {
        P1 = 0xFF;  // 设置P1口为输入
    }
    
    // 检查按键是否按下
    bit check_key(unsigned char key) {
        if (key == KEY_START_STOP) {
            return (P1_0 == 0);  // 按键按下返回1
        } else if (key == KEY_RESET) {
            return (P1_1 == 0);   // 按键按下返回1
        }
        return 0;
    }
    
    // 启动/停止秒表
    void toggle_start_stop() {
        if (is_running) {
            is_running = 0;  // 停止秒表
        } else {
            is_running = 1;  // 启动秒表
        }
    }
    
    // 重置秒表
    void reset_timer() {
        seconds = 0;
        minutes = 0;
        hours = 0;
        update_lcd();  // 刷新显示
    }
    
    void main() {
        lcd_init();  // 初始化LCD
        key_init();  // 初始化按键
        timer_init();  // 初始化定时器
    
        while(1) {
            if (check_key(KEY_START_STOP)) {
                toggle_start_stop();
                delay(300);  // 防抖动延时
            }
    
            if (check_key(KEY_RESET)) {
                reset_timer();
                delay(300);  // 防抖动延时
            }
        }
    }
    

    7. 程序说明

    7.1 定时器中断

    在程序中,我们使用了定时器中断。当定时器溢出时,会触发一个中断,进入timer0_ISR函数。每次中断,我们检查秒表是否在运行。如果在运行,秒表的秒数(seconds)增加1,并在必要时更新分钟和小时。然后,调用update_lcd()函数刷新LCD显示。

    7.2 按键输入处理

    通过check_key()函数检查是否有按键按下。对于启动/停止按键(KEY_START_STOP),每次按下时都会切换秒表的状态。对于重置按键(KEY_RESET),按下时会将秒表的时间重置为0。

    7.3 LCD显示

    通过update_lcd()函数在LCD屏幕上显示时间。时间以“时:分:秒”的格式显示,每次时间更新时刷新LCD内容。

    7.4 防抖动

    为了防止按键抖动造成多次触发,delay(300)函数给按键操作添加了一个简单的延时防抖动处理。

    8. 总结

    通过本项目,我们实现了一个基于8051单片机的简单秒表功能。通过定时器中断生成时间基准,使用按键控制秒表的启动、停止和重置,并通过LCD屏幕显示时间。这个项目不仅能够加深你对单片机定时器、按键输入以及LCD显示控制的理解,还能为其他类似的计时器和计数器应用提供参考。

    作者:Katie。

    物联沃分享整理
    物联沃-IOTWORD物联网 » 单片机:实现秒表(附带源码)

    发表回复