【实验内容】
一、实验要求
1.P0口的2个扩展口作为段控口和位控口,通过使用P2.6和P2.7对SN74HC573芯片的使能。P3.2(INT0)作为按钮输入口构成一个“0#~#7”的8个按钮和8个LED的显示按钮电路,系统复位时,显示“HELLO-- ”。
2.画出AT89C51实现上述功能的完整电路图,包括微控制器电源、复位电路、晶振电路和控制电路;
3.完成全部程序和电路调试工作;
二、实验目的
1.了解八段共阴极LED工作动态显示原理;
2.掌握微控制器LED工作动态显示的方法;
3.掌握LED显示和按键输入联合控制的方法。
三、设计提示
1.可采用2个4位LED数码管;
四、主要元件
序号 | 元件名称 | 元件规格 | 所在元件库 | 所在工具模型 |
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 | 数据锁存器 | 74HC573 | TTL74HC series | Component mode |
9 | 共阴极LED | 7SEG-MPX8-CC | Optoelectronics | Component mode |
10 | 电源 | POWER | Terminals mode | |
11 | 地 | GROUND | Terminals mode | |
12 | 电源输入端 | SIL-100-02 | connectors | Component mode |
【实验电路原理图】
【实验过程】(程序流程图和代码)
+------------------------------------------------+
| 开始 |
+------------------------------------------------+
|
v
+------------------------------------------------+
| 初始化程序 (ORG 0000H) |
| AJMP MAIN |
+------------------------------------------------+
|
v
+------------------------------------------------+
| 主程序 (ORG 0100H) |
| MAIN: |
| MOV SP, #5FH |
| MOV 50H, #76H |
| MOV 51H, #79H |
| MOV 52H, #38H |
| MOV 53H, #38H |
| MOV 54H, #3FH |
| MOV 55H, #40H |
| MOV 56H, #40H |
| MOV 57H, #00H |
| MOV R0, #50H |
| MOV R1, #01H |
+------------------------------------------------+
|
v
+------------------------------------------------+
| 循环标签 HERE: |
| ACALL DISP |
| AJMP HERE |
+------------------------------------------------+
|
v
+------------------------------------------------+
| 显示子程序 DISP: |
| MOV P0, #0FFH |
| SETB P2.7 |
| CLR P2.6 |
| CLR P2.7 |
| LD0: MOV P0, @R0 |
| SETB P2.6 |
| MOV A, R1 |
| CPL A |
| CLR P2.6 |
| SETB P2.7 |
| MOV P0, A |
| ACALL DELAY |
| INC R0 |
| CJNE R0, #58H, GOON |
| MOV R0, #50H |
| GOON: MOV A, R1 |
| RL A |
| MOV R1, A |
| RET |
+------------------------------------------------+
|
v
+------------------------------------------------+
| 延时子程序 DELAY: |
| MOV R7, #240 |
| 循环标签 LOOP: |
| DJNZ R7, LOOP |
| RET |
+------------------------------------------------+
代码:
ORG 0000H
AJMP MAIN
ORG 0100H
MAIN: MOV SP, #5FH
MOV 50H, #76H
MOV 51H, #79H
MOV 52H, #38H
MOV 53H, #38H
MOV 54H, #3fH
MOV 55H, #40H
MOV 56H, #40H
MOV 57H, #00H
MOV R0, #50H
MOV R1, #01H ;存放位码
HERE: ACALL DISP
AJMP HERE
; SETB PSW.3 ;PSW.3=RS0
DISP: MOV P0,#0FFH
SETB P2.7
CLR P2.6
CLR P2.7
LD0: MOV P0, @R0
SETB P2.6
MOV A,R1
CPL A
CLR P2.6
SETB P2.7
MOV P0, A ;给位码
ACALL DELAY
INC R0
CJNE R0,#58H,GOON
MOV R0,#50H
GOON: MOV A,R1
RL A
MOV R1,A
RET
DELAY: MOV R7,#240
LOOP: DJNZ R7,LOOP
RET
END
实验后完成:实事求是,正确计算
【数据处理与结果讨论】(记录实验中遇到的问题及解决方案.)
1 调试过程中遇到的问题及其解决办法
问题1:复位电路始终呈现高电平
解决:调节接地电阻,使其在开关断开时不会导通,至于担心复位导通时电流过大,不妨设置按键支路的电阻,不仅使电容有办法释放热量,也能保证端口呈现高电平,注意不能过大,否则会被施密特触发器误读为低电平。
问题2:外部中断如何实现显示切换
解决:添加外部中断,通过cjne 指令实现条件转移,让一个寄存器完成数值比较,从而在跳转到不同的查表。
问题3:程序逻辑出现错误,导致程序不能按照预期顺序执行或者显示。解决方法:通过绘制流程图或者逐步执行代码,分析程序的执行流程,找出逻辑错误的根源,逐步改进代码。
问题3:在使用延时和定时器时,可能出现延时不准确或者定时器不工作的问题。解决方法:使用仿真器或者调试工具观察定时器和延时计数器的值,确认是否达到预期的计时和延时效果,调整参数和算法以提高精确度。
实验后完成:分析合理,善于思考
【分析讨论题及实验心得】
1显示控制:
- 理解数码管的显示原理以及如何使用段码和位码来控制数码管的显示。通过这个实验,我了解到如何利用汇编语言中的寄存器和指令来实现数码管的动态扫描显示。
2 延时程序:
- 延时程序是控制程序执行速度的常用方法。通过编写延时子程序,我学会了使用循环和 DJNZ 指令来实现精确的时间延迟。
3调试与验证:
- 在编写代码的过程中,反复调试和验证是必不可少的步骤。通过仿真器和实际硬件的测试,我能够发现并修正代码中的错误,从而确保程序按预期运行。
4逻辑思维与分析能力:
- 在设计和实现程序的过程中,逻辑思维和分析能力非常重要。通过绘制流程图和分解问题,我能够更好地理解和实现复杂的程序逻辑。