○微机原理/接口 TPC-ZK交通灯综合系统

  主要参考了这篇微机原理-TPC-ZK板-交通灯模拟系统超详细(含硬件连线)_用到tpc-zk实验系统的微机实验-CSDN博客在此基础上增加了步进电机,8x8双色点阵

选用TPC-ZK-Ⅱ综合开放式微机原理及接口技术实验系统作为系统设计平台,运用8259、8254、8255、0832、直流电机、蜂鸣器、8x8双色点阵等元件实现预计功能.

设备与环境:

  1. 硬件设备:PC机一台,TPC-ZK-Ⅱ综合开放式微机原理及接口技术实验系统
  2. 软件环境: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. .行列数据编码

想让点阵点亮最重要的是进行数据编码,对显示字符进行编码,高电平为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

  • 34
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jax不摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值