按键控制流水灯系统
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计摘要
本设计旨在于通过所学知识,设计一个简单的按键控制流水灯系统,满足一些基本控制功能。
本设计选用80C51芯片作为核心硬件,组合74LS138译码芯片,4×4键盘,74LS273锁存芯片以及其他必要元器件实现对8个发光二极管和2个数码管显示屏的功能控制。控制过程中用到了51单片机的定时/计数器和中断技术。
本次设计旨在于在理论学习单片机的基础上,通过实际系统的搭建,提高对所学知识的实际应用能力。设计中,我们主要做了方案设计,电路搭建,程序编写,控制仿真,报告撰写等一系列工作。
方案设计说明
设计要求:
(1)利用按键控制流水灯的显示。
(2)利用3×3或者4×4键盘,控制数码管的显示。
(3)利用到定时/计数器。
(4)利用到中断技术。
设计功能:
(1)按键0—7键为普通亮灭控制键,对应8个发光二极管,每个按键按一下,对应的灯亮,再按一次,对应的灯熄灭。
(2)按键8,12,13,14号键为功能控制键。
1)8键:按一下,8个灯逐个点亮,熄灭,循环左移三次。
2)12键:按一下,灯全部点亮,闪烁20次,返回原来状态。
3)13键:按一下,从左至右,每次点亮一个灯并保持,至灯全部点亮,再逐个熄灭。
4)14键:左右两侧灯逐对向中间点亮,熄灭,当灯对相遇后,向相反方向进行,循环两次返回。
(3)数码管显示为两位,一号为按键显示(显示被按下的键号),二号为功能号显示(显示执行的功能,从0—4分别对应1—7号键,8号键,12号键,13号键,14号键的功能)
功能实现方案:
51单片机的P0口(P0.0—P0.7)为低位地址总线,兼做数据总线,连接74LS273锁存器,输出的数据通过其锁存。
单片机P1口(P1.0—P1.7)用作通用I/O口,与键盘连接,其中,高四位(P1.4—P1.7)接为列控制线,低四位(P1.0—P1.3)接行控制线。
单片机P2口(P2.0—P2.5)为高位地址线,接外部74LS138译码芯片。P2口的P2.6引脚控制二极管的闪烁。P2.6口输出的脉冲,由单片机定时/计数器T0通过查询的方式所得到。(T0用于定发光二极管点亮与熄灭的延时时间,延时时间到,输出脉冲)
选用三片74LS273,两片用于数码管显示屏的显示数据锁存,一片用于8个发光二极管的亮灭数据锁存。74LS273芯片除了受到51单片机输出状态的控制,还受触发端CLK的控制,即为上升沿触发,也就是当CP从低电平到高电平时,输入锁存器的数据通过芯片,为0时数据锁存,输入的数据不变。
中断类型为外部事件中断,选取INT0为外部中断触发信号的输入端。对应的中断触发硬件为4×4键盘的按键。在中断的内部,则采用了线反转法对键盘数据进行采集。(使行线为输入,列线为输出,列线全部输出低电平,则航线中变为低电平的行线为按键所在的行;使行线为输出,列线为输入,行线输出全部为低电平,则列线中变为低电平的列线为按键所在的列。)
数码管显示器采用共阴型,静态显示方式。(两个数码管显示屏相互独立,每个数码管的8个显示字段控制端分别与并行的锁存芯片输出端相连,只要输出字型码,数码管就立即显示出相应的字符。)
程序模块构成:
(1)初始化:
初始化程序地址,中断地址,置堆栈指针,设置触发方式为边沿触发,开中断,允许外部事件中断。
ORG 0000H
LJMP START ;初始化
ORG 0003H
LJMP KEY ;转中断服务程序
ORG 0100H
START: MOV SP, #60H ;置堆栈指针
SETB IT0 ;边沿触发
MOV IP, #01H ;高优先级中断
SETB EA ;开中断
SETB EX0 ;允许中断
(2)主程序
状态初始化,求显示数据的字型码,扫描键盘,调用其他功能的程序;主程序:
MAIN: MOV A, #16 ;状态初始化
MOV DPTR, #LED_SEG
MOVC A, @A+DPTR
MOV DPTR, #04FFH
MOVX @DPTR, A
MOV DPTR, #0CFFH
MOVX @DPTR, A
MOV DPTR, #14FFH
MOV A, #00H
MOVX @DPTR, A ;状态初始化
MOV 43H, #00H
CLR P2.6
SCAN: LCALL KY0 ;开始扫描按键
LCALL Xfunction
LCALL Rereal
LCALL Judge1
LJMP SCAN ;重新扫描
(3)扫描程序(键盘识别和处理)
置列线为输入,行线为输出,并输出0,读取列线状态,并取反,
暂存列线状态,判断有无按键按下,如果有,置行线为输入,列线为输出,输入0,再读行线并取反,暂存,消除抖动,判断按键是否释放,计算键值(行号的4倍+列号)
;键盘扫描程序:
KY0: MOV P1,#0F0H
MOV A , P1
CPL A
ANL A, #0F0H
MOV R1, A
JZ KY0
KY1: MOV P1,#0FH
MOV A, P1
CPL A
ANL A, #0FH
MOV R2,A
JZ GRET
JBC F0,WAIT
SETB F0
LCALL DELAY
SJMP KY0 GRET: RET
WAIT: MOV A, P1
CPL A
ANL A, #0FH
JNZ WAIT
KY2: MOV A, R1
MOV R1, #03H
MOV R3, #03H
CLR C
KY3: RLC A
JC KY4
DEC R1
DJNZ R3 ,KY3 KY4: MOV A, R2
MOV R2, #00H
MOV R3, #03H
CLR C
KY5: RRC A
JC KY6
INC R2
DJNZ R3, KY5 KY6: MOV A, R2
CLR C
RLC A
ADD A, R1
MOV 40H, A
RET
(4)按键功能判断程序:
Xfunction: MOV A, 40H
CLR C
SUBB A, #8
JNC A1
MOV A, #0
LCALL Transform
RET
A1: MOV A, 40H
SUBB A, #9
JNC A2
MOV A, #1
LCALL Transform
RET
A2: MOV A, 40H
SUBB A, #12
JNC A3
MOV A, #16
LCALL Transform
RET