用protues软件仿真 24小时时钟显示控制实验

实验内容

一、实验要求

1..P0口的2个扩展口作为段控口和位控口,通过使用P2.6和P2.7对SN74HC573芯片的使能,设计一个24小时时钟显示控制电路,时间显示时只用左边6个LED数码管;

2.利用INT0按钮作为启动/停止键,INT1按钮作为清0键,并按键采用中断响应;

3.系统复位时,显示“000000”,当第一次按下启动/停止键时,开始计时,再按一次时钟停止,再按又从原来时间的基础上继续计时……;当按下清0键时,停止计数并将时间恢复到“000000”

4.画出AT89C51实现上述功能的完整电路图,包括微控制器电源、复位电路、晶振电路、显示电路和控制电路;

5.完成全部程序和电路调试工作;

二、实验目的

1.掌握定时器工作原理和使用方法;

2.掌握微控制器外部中断和定时中断的控制方法;

三、设计提示

1.按钮控制均在外部中断中进行,建议将外部中断的引脚输入电平设置为下降沿有效,同时将外部中断的优先级设置为高。

2.24小时定时中断程序看教学PPT

四、主要元件

序号

元件名称

元件规格

所在元件库

所在工具模型

1

微控制器

AT89C51

Microprcessor

Component mode

2

按钮

BUTTON

Switchs &Relay

Component mode

3

晶振

CRYSTAL

Miscellaneous

Component mode

4

发光二极管

LED-RED

Optoelectronics

Component mode

5

电容

CAP

Capacitors

Component mode

6

电解电容

CAP-ELEC

Capacitors

Component mode

7

电阻

RES

Resistors

Component mode

8

数据锁存器

74HC753

TTL74HC series

Component mode

9

共阴极LED

7SEG-MPX4-CC

Optoelectronics

Component mode

10

电源

POWER

Terminals mode

11

GROUND

Terminals mode

12

电源输入端

SIL-100-02

connectors

Component mode

实验电路原理图

实验过程】(写出程序流程图和代码)

流程图

+——————————–+

|            开始 (Start)        |

+——————————–+

            |

            v

+——————————–+

|   中断处理程序 T0INTP (入口)    |

+——————————–+

            |

            v

+——————————–+

|  推送 PSW 和 ACC (PUSH PSW/ACC) |

+——————————–+

            |

            v

+——————————–+

|   设置 TH0 和 TL0 (MOV TH0/TL0) |

+——————————–+

            |

            v

+——————————–+

|  增加地址 43H 的值 (INC 43H)    |

+——————————–+

            |

            v

+——————————–+

|   比较 43H 是否等于 20          |

|   (CJNE A,#20,RETURN)          |

+——————————–+

            |       |

      不等于 |       | 等于

            |       v

            | +——————————–+

            | | 重置 43H (MOV 43H,#00H)        |

            | +——————————–+

            |            |

            |            v

            | +——————————–+

            | | 增加地址 42H 的值 (INC 42H)    |

            | +——————————–+

            |            |

            |            v

            | +——————————–+

            | | 比较 42H 是否等于 60           |

            | | (CJNE A,#60,RETURN)           |

            | +——————————–+

            |            |       |

      不等于 |       | 等于

            |            |       v

            | +——————————–+

            | | 重置 42H (MOV 42H,#00H)        |

            | +——————————–+

            |            |

            |            v

            | +——————————–+

            | | 增加地址 41H 的值 (INC 41H)    |

            | +——————————–+

            |            |

            |            v

            | +——————————–+

            | | 比较 41H 是否等于 60           |

            | | (CJNE A,#60,RETURN)           |

            | +——————————–+

            |            |       |

      不等于 |       | 等于

            |            |       v

            | +——————————–+

            | | 重置 41H (MOV 41H,#00H)        |

            | +——————————–+

            |            |

            |            v

            | +——————————–+

            | | 增加地址 40H 的值 (INC 40H)    |

            | +——————————–+

            |            |

            |            v

            | +——————————–+

            | | 比较 40H 是否等于 24           |

            | | (CJNE A,#24,RETURN)           |

            | +——————————–+

            |            |       |

      不等于 |       | 等于

            |            |       v

            | +——————————–+

            | | 重置 40H (MOV 40H,#00H)        |

            | +——————————–+

            |            |

            |            v

+——————————–+

| 弹出 ACC 和 PSW (POP ACC/PSW)  |

+——————————–+

            |

            v

+——————————–+

|   返回中断 (RETI)              |

+——————————–+

中断子程序 INT0SUB:

+——————————–+

|   停止定时器 0 (CLR TR0)       |

+——————————–+

            |

            v

+——————————–+

|   返回中断 (RETI)              |

+——————————–+

中断子程序 INT1SUB:

+——————————–+

|   重置 40H, 41H, 42H 和 43H    |

+——————————–+

            |

            v

+——————————–+

|   返回中断 (RETI)              |

+——————————–+

延迟子程序 DELAY:

+——————————–+

|   设置地址 30H 和 31H (MOV)     |

+——————————–+

            |

            v

+——————————–+

|   递减 31H (DJNZ 31H, NEXT)     |

+——————————–+

            |

            v

+——————————–+

|   递减 30H (DJNZ 30H, NEXT)     |

+——————————–+

            |

            v

+——————————–+

|   返回主程序 (RET)              |

+——————————–+

+——————————–+

|            结束 (END)          |

+——————————–+

代码

; 主程序开始

              ORG 0000h

               LJMP MAIN

; 定时器0中断向量

              ORG 000Bh

               LJMP T0INTP

; 外部中断0向量

              ORG 0003h

               LJMP INT0SUB

; 外部中断1向量

              ORG 0013h

               LJMP INT1SUB

; 主程序开始

MAIN:

    MOV TMOD, #01H

    MOV TH0, #3CH

    MOV TL0, #0B0H

    SETB TR0

    SETB ET0

    SETB EA

    MOV 40H, #00H

    MOV 41H, #00H

    MOV 42H, #00H

    MOV 43H, #00H

    SJMP $

; 定时器0中断处理程序

T0INTP:

    PUSH PSW

    PUSH ACC

    MOV  TH0, #3CH

    MOV  TL0, #0B0H

    INC  43H

    MOV  A, 43H

    CJNE A, #20, RETURN

    MOV  43H, #00H

    INC  42H

    MOV  A, 42H

    CJNE A, #60, RETURN

    MOV  42H, #00H

    INC  41H

    MOV  A, 41H

    CJNE A, #60, RETURN

    MOV  41H, #00H

    INC  40H

    MOV  A, 40H

    CJNE A, #24, RETURN

    MOV  40H, #00H

RETURN:

    POP ACC

    POP PSW

    RETI

; 外部中断0处理程序

INT0SUB:

    CLR TR0

    RETI

; 外部中断1处理程序

INT1SUB:

    MOV 40H, #00H

    MOV 41H, #00H

    MOV 42H, #00H

    MOV 43H, #00H

    RETI

; 延迟子程序

DELAY:

    MOV 30H, #2

    MOV 31H, #234

NEXT:

    DJNZ 31H, NEXT

    DJNZ 30H, NEXT

    RET

TABLE:

    DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH

END

讨论

  1. 中断机制的理解与应用

在这次实验中,我学习了如何设置和使用中断。通过配置中断向量表,我了解到当特定的中断发生时,程序会自动跳转到对应的中断服务程序执行。在定时器0中断服务程序中,通过保存和恢复现场(使用 PUSH 和 POP 指令)确保了中断处理过程中不会影响主程序的正常执行。

  1. 定时器的配置与使用

定时器的正确配置对于实现准确的时间控制至关重要。在这次实验中,我通过设置 TH0 和 TL0 寄存器的初值,达到了定时50ms的目标。为了实现1秒、1分钟和1小时的计时,我还使用了多个计数变量(40H, 41H, 42H, 43H),并在中断服务程序中对它们进行递增和比较。

  1. 汇编语言的使用

汇编语言的指令较为底层,需要对硬件的工作原理有较深入的理解。在编写这段代码时,我使用了多种指令来实现不同的功能,例如数据传输指令(MOV)、算术运算指令(INC)、逻辑运算指令(CJNE)等。通过实践,我对汇编语言的理解有了进一步的提升。

  1. 调试与验证

在编写和调试代码的过程中,我遇到了一些问题,如中断服务程序未按预期工作、变量未正确初始化等。通过使用仿真器和调试工具,我观察到寄存器值和程序的执行流程,逐步修正了这些问题。调试过程中,发现问题并找到解决方案是一个反复的过程,需要耐心和细心。

作者:想成为电气攻城狮

物联沃分享整理
物联沃-IOTWORD物联网 » 用protues软件仿真 24小时时钟显示控制实验

发表回复