实验八 交通灯控制实验
一、实验目的:
1、学习并掌握并行接口8255A的内部结构,功能及编程。
2、通过并行接口8255A实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用。 三、实验设备: 计算机、微机原理及接口实验系统 二、实验原理及内容: 1、并行接口8255A功能、结构及编程 8255A是一种可编程的并行接口电路芯片,实现并行数据传输功能。 8255A内部结构及引脚如图2-1所示。它具有A、B、C三个并行接口,实现与外部设备的数据交换,其A、B、C三个端口以排针形式引出,供8255A实验使用。8255的数据线片选信号线、地址线、读写控制线等分别与系统总线连接。 D0D1D2D3D4D5D6D7XIORXIOWA0A1RESETIOY13433323130292827D0D1D2D3D4D5D6D7RDWRA0A1RESETCSPA0PA1PA2PA3PA4PA5PA6PA7PB0PB1PB2PB3PB4PB5PB6PB7PC0PC1PC2PC3PC4PC5PC6PC743214039383718192021222324251415161713121110RDWRA0A1RESETCS536983568255PC0PC1PC2PC5PC6PC7L12L11L10L15L14L13图2-1 实验接线图 8255A的一组端口地址如表2-1所示。 表2-1 8255端口地址 信号线 寄存器 编址 A口 0E0H IOY7 B口 0E1H C口 0E2H 控制寄存器 0E3H A、B、C端口能在以下三种方式下工作:
方式0—基本输入/出方式 方式1—选通输入/出方式 方式2—双向选通输入/出方式
8255A的工作方式控制字用来决定8255A端口的工作方式,方式控制字的格式如图2-2所示。
表2-1 8255端口地址
信号线 寄存器 编址 A口 0E0H IOY7 B口 0E1H C口 0E2H 控制寄存器 0E3H A组控制C口0输出(低4位)1输入0输出A口1输入00方式0方式选择01方式11X方式2D71D6D5D4D3D2D1D0B组控制C口0输出(低4位)1输入0输出B口1输入方式0方式选择01方式1图2-2 8255A方式控制字格式 2、按照图2-1,L15、L14、L13作为南北路口的交通灯与PC5、PC6、PC7相连,L12、L11、L10作为东西路口的交通灯与PC0、PC1、PC2相连,编程使六个交通灯按如下变化规律燃灭。
十字路口交通灯的变化规律要求:
(1)南北路口的绿灯、东西路口的红灯同时亮。
(2)南北路口的黄灯闪烁若干次,同时东西路口红灯继续亮。 (3)南北路口的红灯、东西路口的绿灯同时亮。
(4)南北路口的红灯继续亮,同时东西路口的黄灯亮闪烁若干次。
(5)转(1)重复。
四、实验步骤
1、按图2-1连接实验线路,注意切断实验箱电源。 2、参考下面的实验流程编写实验程序。
实验流程如下:
南北路口黄灯闪,东西路口红灯亮 长延时 南北路口绿灯亮,东西路口红灯亮 设置8255C口输出 开始 短延时 南北路口红灯亮,东西路口绿灯亮 长延时 南北路口红灯亮,东西路口黄灯闪 短延时 3、经汇编、链接后将程序装入系统。 4、运行程序,观察交通灯的变化。
交通灯控制实验程序1: data segment
protc1 db 9bh,0bbh,0fbh,0bbh,0fbh,0bbh,0fbh db 7eh,7dh,7fh,7dh,7fh,7dh,7fh db 0ffh data ends code segment
assume cs:code,ds:data start: mov ax,data mov ds,ax mov dx,0e3h mov al,90h out dx,al mov dx,0e2h loop1: mov bx,0000h loop2:
mov al,protc1[bx] cmp al,0ffh jz loop1 out dx,al call delay inc bx jmp loop2 delay:
mov cx,01ffh de1: mov di,0ffh de0: dec di jnz de0 loop de1 ret
code ends end start
交通灯控制实验程序2: data segment
protc1 db 0dbh,0bbh,0fbh,0bbh,0fbh,0bbh,0fbh db 7eh,7dh,7fh,7dh,7fh,7dh,7fh db 0ffh data ends code segment
assume cs:code,ds:data start: mov ax,data mov ds,ax mov dx,0e3h mov al,90h out dx,al mov dx,0e2h loop1: mov bx,0000h loop2:
mov al,protc1[bx] cmp al,0ffh jz loop1
out dx,al and al 21h cmp al,21h jz aa
mov cx,0effh jmp bb
aa: mov cx,01dfh bb: call delay inc bx jmp loop2 delay:
de1: mov di,0ffh de0: dec di jnz de0 loop de1 ret code ends
end start
data segment
portc1 db 24h,44h,04h,44h,04h,44h,04h ;六个灯可能
db 81h,82h,80h,82h,80h,82h,80h ;的状态数据 db 0ffh ;结束标志 data ends code segment
assume cs:code,ds:data start:
mov ax,data mov ds,ax
mov dx,io8255b mov al,90h
out dx,al ;设置 mov dx,io8255a re_on: mov bx,0
on: mov al,portc1[bx] cmp al,0ffh jz re_on
out dx,al ;点亮相应的灯 inc bx
mov cx,20 ;参数赋初值 test al,21h ;是否有绿灯亮 jz de1 ;没有,短延时 mov cx,5000 ;有,长延时
de1: mov di,9000 ;dide0: dec di ;减 jnz de0 ;di loop de1 push dx mov ah,06h mov dl,0ffh int 21h pop dx
jz on ;没有,转到exit: mov ah,4ch ;返回 int 21h code ends
end start
8255为C口输出 赋初值5000 1计数 不为0 on