用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
【讨论】
- 中断机制的理解与应用:
在这次实验中,我学习了如何设置和使用中断。通过配置中断向量表,我了解到当特定的中断发生时,程序会自动跳转到对应的中断服务程序执行。在定时器0中断服务程序中,通过保存和恢复现场(使用 PUSH 和 POP 指令)确保了中断处理过程中不会影响主程序的正常执行。
- 定时器的配置与使用:
定时器的正确配置对于实现准确的时间控制至关重要。在这次实验中,我通过设置 TH0 和 TL0 寄存器的初值,达到了定时50ms的目标。为了实现1秒、1分钟和1小时的计时,我还使用了多个计数变量(40H, 41H, 42H, 43H),并在中断服务程序中对它们进行递增和比较。
- 汇编语言的使用:
汇编语言的指令较为底层,需要对硬件的工作原理有较深入的理解。在编写这段代码时,我使用了多种指令来实现不同的功能,例如数据传输指令(MOV)、算术运算指令(INC)、逻辑运算指令(CJNE)等。通过实践,我对汇编语言的理解有了进一步的提升。
- 调试与验证:
在编写和调试代码的过程中,我遇到了一些问题,如中断服务程序未按预期工作、变量未正确初始化等。通过使用仿真器和调试工具,我观察到寄存器值和程序的执行流程,逐步修正了这些问题。调试过程中,发现问题并找到解决方案是一个反复的过程,需要耐心和细心。
作者:想成为电气攻城狮