主要参考了这篇微机原理-TPC-ZK板-交通灯模拟系统超详细(含硬件连线)_用到tpc-zk实验系统的微机实验-CSDN博客在此基础上增加了步进电机,8x8双色点阵
选用TPC-ZK-Ⅱ综合开放式微机原理及接口技术实验系统作为系统设计平台,运用8259、8254、8255、0832、直流电机、蜂鸣器、8x8双色点阵等元件实现预计功能.
设备与环境:
- 硬件设备:PC机一台,TPC-ZK-Ⅱ综合开放式微机原理及接口技术实验系统
- 软件环境:TPC-USB V1.0.7.25.exe
系统总电路图:
图 1 交通灯模块电路连线图
图 2车辆控制模块电路连线图
图 3实物连线图
图 4连线图
系统说明:
本系统主要分为两大模块 第一部分是交通灯,第二部分是车辆控制速度模块
十字路口交通灯(这部分内容可以直接看那篇博客,这里就不多赘述了)
利用8255端口C控制LED发光管。LED发光管L7(红)、L6(黄)、L5(绿)作为南北路口的交通灯与8255的PC7、PC6、PC5相连,L2(红)、L1(黄)、L0(绿)作为东西路口的交通灯与PC2、PC1、PC0相连。编程使6个灯按交通灯变化规律亮灭。十字路口交通灯的变化规律要求:
(1)南北路口的绿灯、东西路口的红灯同时亮30秒。
(2)南北路口的黄灯闪烁5秒,同时东西路口的红灯继续亮。
(3)南北路口的红灯、东西路口的绿灯同时亮30秒。
(4)南北路口的红灯继续亮、同时东西路口的黄灯亮闪烁5秒
(5)转(1)重复。
。。。。。
。。。。。
。。。。。
智慧交通车辆控制部分
在基于交通灯部分添加直流电机,8x8双色点阵和电平输入开关,以实现当东边路口绿灯(L5)亮起时,电机启动,点阵显示“行”,当绿灯熄灭红灯亮起时电机启动,点阵显示“P”.
而K0-K5则可以控制直流电机的速度,K0速度最慢,K5速度最快
直流电机模块:
直流电机的转速是由0832的Ub输出脉冲的占空比例来决定的,正向占空比例越大,电机转速越快,反之越慢。
0832的输出Ub为双极性,当输入量小于80H时,输出为负,电机反转。等于80H时,输出为0,电机停止转动。大于80H时,输出为正,电机正转。而0832输出80H的持续时间是不变的,输出FFH的持续时间越长,电机转动时的速度就越快,持续长短用开关K0-K5来控制,共5个档,达到使电机加速、减速的目的。K0对应的速度最慢,K5对应的速度最快。
而0832的引脚图如图所示,各引脚功能
CS:片选使能,低电平芯片使能
CH0:模拟输入通道0,或作为IN+/-使用;
CH1:模拟输入通道1,或作为IN+/-使用;
GND:芯片参考零电位(地);
DI :数据信号输入,选择通道控制;
DO :数据信号输出,转换数据输出;
CLK:芯片时钟输入;
Vcc/REF:芯片电源
图 5 0832时序逻辑图
图 6 电机流程图
8x8双色点阵显示:
74HC273 8D触发器。内部包含8个D触发器,它们使用公共的时钟脉冲及异步清零信号,触发方式为边沿触发。
图 7 真值表
单片点阵LED:
图 8 LED显示原理
由于点阵LED显示器有8位行信号和8位列信号,故需要两片74HC273锁存器分别加以锁存,并需要占用两个地址空间。其地址分配如图4所示,当A1A0 = 00时,D7—DO为列信号,当AIA0 =01时为行信号。
工作时,可以让点阵LED显示器分8行逐行显示,也可以逐列显示。以前者为例,先向行地址输出数据80H,这时只有第一行为高电平,被选中,再向列地址输出相应的数据(注意因为点阵LED是共阳极,故列信号为低电平时对应的LED被点亮),就可以显示第一行。同样的,逐次向行地址输出40H , 20H ,…,01H ,选中相应的行,并显示各行信息,如此循环显示八个行,注意在显示两个行之间加入适当的延时(约1 ms),以确保LED被充分点亮,这样在视觉上就可以显示出完整的信息。
多片点阵:
图 9 双色点阵电路图
为实现汉字的显示,希望有四片点阵LED显示器同时工作。在电路上不能简单地按照上一节的方案来实现,这是因为按上述方案,每片显示器要占用两个地址空间,四片就需要8个地址,而J7接线端子只能提供4个地址(两根地址线),显然地址线不够用。
为使四片显示器同时工作,必须重新分配地址,一种方案如图5所示。按照电路,当行2地址为00H 或10H 时,第(3 )、(4)片显示器没有行被选中,故它们都没有显示,这时行1(地址01H)可以用来选中(1 ).(2)片的同一行,地址0OH 和10H用来选择两列中的某一列(连D触发器的CLK 引脚),当列1、列2输入不同数据时,( 1 ).(2)片被选中的行可以显示各自的信息。
- .行列数据编码
想让点阵点亮最重要的是进行数据编码,对显示字符进行编码,高电平为1,低电平为0由于是动态刷新行显示,所以LED的每一行都要编码LED点阵的行是共阳极,所以选通行要给高电平,给其他行低电平。列是共阴极,给选通的列低电平,其他列高电平。
图 10 点阵编码
由于不同机器的影响,具体编码可能有所不同,需要根据点阵结果来实际编码。
图 11 实际点阵结果图
源码:(由于机器问题,不能实现电机速度控制,实际效果是当led灯变化后,电机就启动)
DATAS SEGMENT
MESS DB 'TPCA INTERRUPT3!',0DH,0AH,'$'
WARN DB 'WARNING!',0DH,0AH,'$'
TIPS DB '1-night:[n] 2-change light:[c], 3-exigency red light[e]',0DH,0AH,'$'
D8255A EQU 288H ;常量
D8255B EQU 289H
D8255C EQU 28AH
D8255S EQU 28BH
proth EQU 2a0h
protlr EQU 298h
protly EQU 290h
LIGHT DB 34H ; 0011 0100
DB 54h ; 0101 0100
DB 91H ; 1001 0001
DB 92H ; 1001 0010
DB 0FFH
NUM DB 6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH ; 9,8,7,6,5,4,3,2,1,0
TENS DB 5BH,06H,3FH ; 2,1,0
YELLOWNUM DB 5BH,06H,3FH ; 2,1,0
min1 DB 00h,01h,02h,03h,04h,05h,06h,07h
BUFF DB 50H,5FH,52H,10H,0c0H,3fH,90H,50H
MESS1 DB 00H,0F0H,90H,90H,90H,0ffH,00H,00H
DATA ENDS
STACKS SEGMENT
X DB 100 DUP(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX ; 载入
MOV DX,OFFSET TIPS
MOV AH,09H
INT 21H
;; 设置8254
MOV DX,283h
MOV AL,36h ; 00110110 方式三,方波
OUT DX,AL
MOV AX,1000
MOV DX,280h
OUT DX,AL
MOV AL,AH
OUT DX,AL
MOV DX,283h
MOV AL,76h ; 01110110 方式三,方波
OUT DX,AL
MOV DX,281h
MOV AX,1000
OUT DX,AL
MOV AL,AH
OUT DX,AL
;; 初步设置8259
;; 设置8255
MOV DX,D8255S
MOV AL,80H
OUT DX,AL
MAINLP:
CALL MAIN
JMP MAINLP
EXIT:
MOV AH,4CH
INT 21H
MAIN PROC
MOV BX,0
MOV SI,0
LP1:
MOV DX,D8255C
MOV AL,LIGHT[BX]
CMP AL,0FFH
JZ EX1
OUT DX,AL
CMP AL,91H
JE SHOW_XING
; 其他情况显示"P"
; CALL SHOW_P
CALL DISPLAY_DOT_MATRIX ; 显示点阵字符
INC BX
TEST AL,21H
JZ S1
CALL GREEN
JMP LP1
S1:
CALL YELLOW ; 再次调用{黄色显示}
JMP LP1 ; 循环判断
EX1:
RET
MAIN ENDP
DISPLAY_DOT_MATRIX PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV CX,01H ;共存21组点阵代码,21帧图案
MOV BX,00H
WORDTIMES1:
MOV CX,40H
MOV SI,0
A1:
MOV AH,01H
PUSH CX
MOV CX,8 ; 8x8 点阵
MOV SI,0
NEXT1:
MOV AL,[MESS1+SI+BX] ; 分别得到第1组到第21组行代码首址
MOV DX,2a0H ; 行开始信号 CS1 接 280H
OUT DX,AL
MOV AL,AH ; 得到列代码
MOV DX,298H ; 列开始信号 CS2 接 288H
OUT DX,AL ; 显示行
MOV AL,0
OUT DX,AL
SHL AH,1 ; 滚屏左移一位
INC SI ; SI 加 1
CALL DELAY ; 显示一列后延时
LOOP NEXT1
POP CX
CALL DELAY ; 显示一行后延时
LOOP A1
MOV AL,0
MOV DX,298H
OUT DX,AL
ADD BX,8 ; BX 加 8,8 为每组点阵代码的大小
CALL DELAY
;LOOP WORDTIMES1
POP SI
POP DX
POP CX
POP BX
POP AX
RET
DISPLAY_DOT_MATRIX ENDP
SHOW_XING PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
MOV CX,01H ;共存21组点阵代码,21帧图案
MOV BX,00H
WORDTIMES2:
MOV CX,40H
MOV SI,0
A11:
MOV AH,01H
PUSH CX
MOV CX,8 ; 8x8 点阵
MOV SI,0
NEXT2:
MOV AL,[MESS1+SI+BX] ; 分别得到第1组到第21组行代码首址
MOV DX,2a0H ; 行开始信号 CS1 接 280H
OUT DX,AL
MOV AL,AH ; 得到列代码
MOV DX,290H ; 列开始信号 CS2 接 288H
OUT DX,AL ; 显示行
MOV AL,0
OUT DX,AL
SHL AH,1 ; 滚屏左移一位
INC SI ; SI 加 1
CALL DELAY ; 显示一列后延时
LOOP NEXT2
POP CX
CALL DELAY ; 显示一行后延时
LOOP A11
MOV AL,0
MOV DX,290H
OUT DX,AL
ADD BX,8 ; BX 加 8,8 为每组点阵代码的大小
CALL DELAY
;LOOP WORDTIMES1
POP SI
POP DX
POP CX
POP BX
POP AX
RET
SHOW_XING ENDP
DELAY PROC NEAR ; 延时子程序
PUSH CX
MOV CX,0FFH
L: LOOP L
POP CX
RET
DELAY ENDP
DCmotor proc
push dx
push ax
MOV DX,D8255S
MOV AL,82h ; Modify to configure PORT B as input
OUT DX,AL ;8255 PORT B INPUT
LLL: MOV AL,80h
MOV DX,proth
OUT DX,AL ;D/A OUTPUT 0V
INTK: MOV DX,D8255B
IN AL,DX ;READ SWITCH
JMP LLL
pop ax
pop dx
ret
Dcmotor endp
GREEN PROC ;; 绿色显示(和红色)
PUSH CX
PUSH BX
PUSH AX
PUSH DX
PUSH SI ; 保留现场,减少不必要的麻烦
MOV CX,3
MOV SI,0
REDBREAK:
CLI ; 设置红色计时中断
PUSH DS
MOV AX,SEG REDTIME
MOV DS,AX
MOV DX,OFFSET REDTIME
MOV AX,250BH
INT 21H
IN AL,21H
AND AL,0F7H ; 开启三号口
OUT 21H,AL
POP DS
STI
LP2:
MOV DI,0
PUSH CX
LP3:
; MOV CX,5 ; 红绿色延时时间
LP4:
MOV AL,22H ; 由于存在两位数码管,因此需要在两位数码管之间快速刷新
MOV DX,D8255A
OUT DX,AL
MOV AL,TENS[SI]
MOV DX,D8255B
OUT DX,AL
CALL DELAY_02S ; 调用延时函数
MOV AL,NUM[DI]
MOV DX,D8255B
OUT DX,AL
MOV AL,11H
MOV DX,D8255A ; 把0001 0001传递给A口
OUT DX,AL
CALL DELAY_02S
; LOOP LP4 ; 循环50次执行完50次才会改变数值
; JMP LP4
; INC DI
CMP DI,10
JNE LP3
INC SI
POP CX ; CX初始为3,即循环三次
LOOP LP2
POP SI
POP DX
POP AX
POP BX
POP CX ; 还原现场
RET
GREEN ENDP ; 退出数码管倒计显示
REDTIME PROC ; 红灯计时
STI
PUSH AX
INC DI
MOV AL,20H
OUT 20H,AL
POP AX
IRET
REDTIME ENDP
YELLOW PROC ; 黄灯闪烁情况下的计时与显示
PUSH SI
PUSH CX
PUSH BX
PUSH DX ; 保护现场
PUSH AX
CLI
PUSH DS
MOV AX,SEG YELLOTIME
MOV DS,AX
MOV DX,OFFSET YELLOTIME
MOV AX,250BH
INT 21H
IN AL,21H
AND AL,0F7H ; 开启三号口
OUT 21H,AL
POP DS
STI
MOV AL,11H
MOV DX,D8255A ; A口 0001 0001
OUT DX,AL
SHOW:
MOV AL,YELLOWNUM[SI] ; 2 2 1 1 0 0
MOV DX,D8255B
OUT DX,AL ; B口传递2,2,1,1,0,0
BACK:
MOV BX,0003H
CMP SI,BX
JNZ SHOW ; 此处循环三次 用loop比较混乱
POP DX
POP AX
POP BX
POP CX
POP SI
RET
YELLOW ENDP
YELLOTIME PROC ; 实现SI和BX加一
STI
PUSH DX
PUSH AX
INC SI ; 慎重
MOV AL,20H
OUT 20H,AL
POP AX
POP DX
iret
YELLOTIME ENDP
DELAY_02S PROC ; 循环 60*4000次,0.2大约
PUSH CX
PUSH SI
MOV CX,60
DD1: MOV SI,4000
DD2: DEC SI
JNZ DD2
LOOP DD1
POP SI
POP CX
RET
DELAY_02S ENDP
DELAY_05S PROC ; 循环4000*3000次大约0.5秒
PUSH CX
PUSH SI
MOV CX,4000
D1: MOV SI,4000
D2: DEC SI
JNZ D2
LOOP D1
POP SI
POP CX
RET
DELAY_05S ENDP
CODES ENDS
END START