交通灯控制实验(TPC-USB 微机接口实验系统集成开发环境).pdf
实验八 交通灯控制实验 一、实验目的:一、实验目的:1、学习并掌握并行接口 8255A 的内部结构,功能及编程。2、通过并行接口 8255A 实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用。三、实验设备:三、实验设备:计算机、微机原理及接口实验系统 二、实验原理及内容:二、实验原理及内容:1、并行接口 8255A 功能、结构及编程 8255A 是一种可编程的并行接口电路芯片,实现并行数据传输功能。8255A 内部结构及引脚如图 2-1 所示。它具有 A、B、C 三个并行接口,实现与外部设备的数据交换,其 A、B、C 三个端口以排针形式引出,供 8255A 实验使用。8255 的数据线片选信号线、地址线、读写控制线等分别与系统总线连接。图 2-1 实验接线图 8255A 的一组端口地址如表 2-1 所示。表 2-1 8255 端口地址 信号线 寄存器 编址 A 口 0E0H B 口 0E1H C 口 0E2H IOY7 控制寄存器 0E3H D034D133D232D331D430D529D628D727PA04PA13PA22PA31PA440PA539PA638PA737PB018PB119PB220PB321PB422PB523PB624PB725PC014PC115PC216PC317PC413PC512PC611PC710RD5WR36A09A18RESET35CS68255D0D1D2D3D4D5D6D7WRXIOWRDXIORA0A0A1A1CSIOY1L12L11L10L15L14L13PC0PC1PC2PC5PC6PC7RESETRESETA、B、C 端口能在以下三种方式下工作:方式 0基本输入/出方式 方式 1选通输入/出方式 方式 2双向选通输入/出方式 8255A 的工作方式控制字用来决定 8255A 端口的工作方式,方式控制字的格式如图 2-2 所示。表 2-1 8255 端口地址 信号线 寄存器 编址 A 口 0E0H B 口 0E1H C 口 0E2H IOY7 控制寄存器 0E3H 图 2-2 8255A 方式控制字格式 2、按照图 2-1,L15、L14、L13 作为南北路口的交通灯与 PC5、PC6、PC7 相连,L12、L11、L10 作为东西路口的交通灯与 PC0、PC1、PC2 相连,编程使六个交通灯按如下变化规律燃灭。D7D6D5D4D3D2D1D01C口(低4位)B口方式选择010101输出输入输出输入方式0方式1B组控制输入1方式选择方式1方式000C口(低4位)输入输出输出A组控制A口100方式2101X十字路口交通灯的变化规律要求:(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,protc1bx 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,protc1bx 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 ;设置 8255 为 C 口输出 mov dx,io8255a re_on:mov bx,0 on:mov al,portc1bx 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 ;di 赋初值 5000 de0:dec di ;减 1 计数 jnz de0 ;di 不为 0 loop de1 push dx mov ah,06h mov dl,0ffh int 21h pop dx jz on ;没有,转到 on exit:mov ah,4ch ;返回 int 21h code ends end start