希望' 2024-06-06 21:26 采纳率: 0%
浏览 4

微机原理与接口技术电子秒表

设计一个带时间显示的电子秒表,具体内容如下:
1.电子秒表的初始状态为零,分别显示分、秒、毫秒;
2.设计一个按钮,按第一次开始计时,按第二次计时暂停,显示当前记录的时间,按第三次计时停止,回到初始态;
3.有时间显示的功能,当不用电子秒表的功能时,显示当先的时间,分别为时、分、秒形式。

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-06 21:26
    关注

    引自免费微信小程序:皆我百晓生

    为了实现这个电子秒表的设计,我们可以使用8051单片机(比如AT89C51)配合 proteus 软件进行硬件电路设计,并编写相应的汇编语言程序。下面我会提供一个基本的设计框架,包括电路设计和程序代码。

    电路设计

    在 Proteus 中,我们需要以下元件:

    1. AT89C51 单片机
    2. LED 数码管显示器(共阴极)
    3. 按钮开关(例如 SW1、SW2 和 SW3 分别对应开始、暂停和停止功能)
    4. 74HC595 驱动器(用于驱动数码管)
    5. 两个定时器(Timer 0 和 Timer 1)

    连接方式:

    • LED 数码管通过 74HC595 驱动器连接到单片机的 P0 口(P0.0 到 P0.7),并设置其控制信号(CS, RCLK, SCLK)。
    • SW1、SW2 和 SW3 分别连接到单片机的 P2.0, P2.1 和 P2.2 引脚。
    • 定时器配置:Timer 0 作为系统时钟,Timer 1 用于计时。

    程序代码 (8051汇编语言)

    ; 常量定义
    COUNT_PER_SEC EQU 12
    COUNT_PER_MIN EQU COUNT_PER_SEC * 60
    COUNT_PER_HOUR EQU COUNT_PER_MIN * 60
    MAX_TIME      EQU 23*COUNT_PER_HOUR + 59*COUNT_PER_MIN + 59*COUNT_PER_SEC + 999
    
    ; 寄存器定义
    TMR1H equ 0x85 ; Timer 1 高字节
    TMR1L equ 0x86 ; Timer 1 低字节
    TH1   equ TMR1H ; TH1 = Timer 1 的高字节
    TL1   equ TMR1L ; TL1 = Timer 1 的低字节
    TMR0  equ 0x8A ; Timer 0
    TMOD equ 0x8D ; Timer 控制寄存器
    SCON equ 0xB9 ; Serial Control Register
    
    ; 初始化子程序
    init:
        MOV TH1, #0 ; Timer 1 计数初值
        MOV TL1, #0
        MOV TMOD, #0x21 ; Timer 1 工作于模式1, 8位自动重载计数
        MOV TM0, #0 ; Timer 0 计数初值
        MOV TCON, #0x01 ; Timer 0 开启中断
        MOV P2, #0xFF ; 设置所有输入口为高电平
        MOV P0, #0x00 ; LED 显示清零
        MOV R0, #0 ; 当前时间存储变量
        MOV R1, #0
        MOV R2, #0
        MOV R3, #0
        RET
    
    ; 定时器0中断服务子程序
    timer_isr:
        INC R3 ; 每隔1ms增加1
        JNB TF0, timer_isr_end ; 如果TF0未置位,继续检查
        SETB TF0 ; 清除TF0标志
        JC overflow ; 时间溢出处理
    timer_isr_end:
        RETI
    
    ; 时间溢出处理子程序
    overflow:
        INC R2 ; 秒加1
        CPL P2.0 ; SW1 状态翻转
        CJNE R2, #COUNT_PER_SEC, overflow_end ; 若未满1s,跳过
        MOV R2, #0 ; 重置秒计数
        INC R1 ; 分加1
        CPL P2.1 ; SW2 状态翻转
        CJNE R1, #COUNT_PER_MIN, overflow_end ; 若未满1min,跳过
        MOV R1, #0 ; 重置分钟计数
        INC R0 ; 小时加1
        CPL P2.2 ; SW3 状态翻转
        CJNE R0, #COUNT_PER_HOUR, overflow_end ; 若未满1小时,跳过
        MOV R0, #0 ; 重置小时计数
    overflow_end:
        MOV TH1, #0 ; 重新装载Timer 1计数初值
        MOV TL1, #0
        CLR TR1 ; 关闭Timer 1中断
        MOV P0, R0 ; 更新小时显示
        MOV P0, R1 ; 更新分钟显示
        MOV P0, R2 ; 更新秒显示
        MOV P0, R3 ; 更新毫秒显示
        SETB TR1 ; 开启Timer 1中断
        RETI
    
    main:
        CALL init
    start:
        JMP start
    

    注意事项

    由于篇幅限制,这里仅提供了关键部分的代码和电路设计概述。你需要在 Proteus 中搭建电路,并将上述代码烧录到单片机中。同时,还需要根据实际使用的 LED 数码管类型调整显示逻辑,因为不同的数码管可能有不同的段选线和公共线连接方式。

    此外,由于汇编语言的复杂性,建议学习一些基础知识后再尝试理解代码。如果你对汇编语言不熟悉,可以考虑使用 C 语言或其他高级语言进行编程,这样会更易于理解和调试。

    在 Proteus 中,确保正确连接各个元件,并在单片机的 Keil uVision 或其他集成开发环境(IDE)中编译和下载程序。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月6日

悬赏问题

  • ¥15 反激PWM控制芯片调研
  • ¥15 Python for loop减少运行时间
  • ¥15 fluent模拟物质浓度udf
  • ¥15 Collection contains no element matching the predicate
  • ¥20 冻品电商平台的搜索是怎么实现的
  • ¥15 如何搞一个可以控制、显示马达频率
  • ¥15 WPF动态创建页面内容
  • ¥15 如何对TBSS的结果进行统计学的分析已完成置换检验,如何在最终的TBSS输出结果提取除具体值及如何做进一步相关性分析
  • ¥15 SQL数据库操作问题
  • ¥15 Matlab安装yalmip和cplex功能安装失败