模拟汽车速度控制系统的设计
CSDN发布部分代码,完整代码及报告见文末
模拟汽车速度控制,使用清华科教厂TPC-ZK-II实验箱。
一、设计要求
用实验箱上4*4键盘的按键模拟汽车的挡杆,用发光二极管显示挡位,用数码管显示汽车的速度。
二、设计内容
1、“1”键启动系统,汽车以最低速度行驶,同时用1盏绿灯显示挡位,数码管显示速度(最低速度为5Km/h)。
当需要换档时,用键盘键入2、3键,并加用一盏黄灯和一盏红灯显示,同时在数码管上显示相应的速度。
2、汽车慢加速时用“A”键,急加速时用“B”键。慢刹车时用“C”键,急刹车时用“D”键。加速和刹车时用数码管显示相应的速度变化。
3、当汽车需紧急停车时,键入“ESC”键,所有发光二极管熄灭,同时数码管显示“0”。
4、各档位车速:
1挡:5~25 Km/h
2挡:25~60 Km/h
3挡:60~120 Km/h
概要设计
8255A是Intel86系列微处理器的配套并行接口芯片, 它可为80x86系列CPU与外部设备之间提供并行输入/输出的通道。
本课程设计主要使用8255A的A、B和C三个端口实现对不同外设的通信和控制。
首先由A端口控制七段数码管的段码,B端口控制LED灯和位码,最后C端口检测4*4键盘的输入。图1为课程设计的主要循环流程。
程序编译执行后,将等待键盘按下1以控制LED数码管逐渐提速到5(初始速度),此后将等待加速、提档、减速等多个对应键盘按键按下以转移程序分支。本次课程设计本质上是一个状态机,循环中改变状态变量,不断改变输出的值。当主机按下ESC键时,数码管复位000,LED灯全灭,表示紧急刹车。
运行环境
操作系统:Windows XP
实验箱:清华科教厂TPC-ZK-II
软件环境:TPC-ZK-II集成开发环境
本课程设计为软硬件结合的汇编程序设计,若不具备上述运行环境,可能无法运行。
键盘扫描子程序
由于TPC-ZK-II实验箱配备的4*4简易键盘为矩阵结构,配备了8个信号引脚,故对于此键盘的按键识别,可以使用扫描法或反转法。
扫描法识别按键的原理如下:先使第0行接低电平,其余行为高电平,然后看第0行是否有键闭合。这是通过检查列线电位来实现的,即在第0行接低电平时,看是否有哪条列线变成低电平。如果有某列线变为低电平,则表示第0行和此列线相交的位置上的键被按下,如果没有任何一条列线为低电位,则说明第0行没有任何键被按下。此后,再将第1行接地,然后检测列线是否有变为低电位的线。如此往下一行一行地扫描,直到最后一行。在扫描过程中,当发现某一行有键闭合时,也就是列线输入中有一位为0时,便在扫描中途退出,通过组合行线和列线即可识别此刻按下的是哪一键。
而反转法是在扫描法的基础上改进而来,省去了一次循环数据通信,故而效率更高,其不足之处在于需要连接行线和列线的接口电路必须支持动态改变输入输出,而8255A的C端口恰好支持。
反转法识别按键的原理为:首先,将行线作为控制线接一个输出端口,将列线作为检测线接一个输入端口。CPU通过输出端口将行线(控制线)全部设置为低电平,然后从输入端口读取列线(检测线)。如果此时有键被按下,则必定会使某列线为“0”。然后,将行线和列线的作用互换,即将列线作为控制线接输出端口,行线作为检测线接输入端口。并且,将刚才读得的列值从列线所接端口输出,再读取行线的输入值,那么,闭合键所在的行线值必定为“0”。这样,当一个键被按下时,必定可以读得一对唯一的行值和列值。
综合考虑,为了节约内存及编写方便,选择反转法识别。流程逻辑如图2。
按键识别子程序代码:
;扫描键盘输入
scan4x4Keyboard PROC
.... ;寄存器入栈
;反转法识别键盘
MOV DX,IO8255_C
MOV AL,00000000B ;八位为行3210列3210,此处使行输出0
OUT DX,AL
IN AL,DX ;读取列值到低四位
CMP AL,0FH ;判断低四位是否有0
JZ endOfScan4x4Keyboard
STEP1:
PUSH AX
PUSH AX
MOV DX,IO8255_K
MOV AL,10001000B ;将8255设为A、B口输出、C口上半输入下半输出
OUT DX,AL
MOV DX,IO8255_C
POP AX ;恢复上次扫描到的列值,低四位有效
OUT DX,AL ;将列值输出到列
IN AL,DX ;读取行值到高四位
AND AL,0F0H ;清空低四位
POP BX ;再次恢复上次扫描到的列值,低四位有效
AND BL,0FH;清空高四位
MOV AH,AL ;行值移到AH高4位
ADD AH,BL ;列值移到AH低4位,此时行列值合并到AH
MOV SI,OFFSET KEYTABLE
MOV DI,OFFSET KEY
MOV CX,16 ;4x4键盘共16个键需要比对
STEP2:
CMP AH,[SI]
JZ STEP3
INC SI
INC DI
LOOP STEP2
;未找到,恢复8255初始模式
MOV DX,IO8255_K
MOV AL,10000001B ;将8255设为A、B口输出、C口上半输出下半输入
OUT DX,AL
JMP endOfScan4x4Keyboard ;未找到键
STEP3:
.... ; 从[DI]获取键盘字母char比对及后续逻辑分支
endOfScan4x4Keyboard:
.... ;寄存器恢复
RET
scan4x4Keyboard ENDP
资源