1、2015年 12月 9日微型计算机原理与接口技术实验报告班 级 : 学 号 : 姓 名 : 指导老师 : 朱亚萍 实验名称 :8255A 并行口实验 (一) 8255A并行口实验 (二) 8255A并行口实验 (一)1实验四 8255A 并行口实验(一)一、实验目的 1. 掌握 8255A和微机接口方法;2. 掌握 8255A的工作方式和编程原理。二、实验内容 用 8255PA口控制 PB口。三、实验接线图 图 4-1四、编程指南 1. 8255A芯片简介:8255A 可编程外围接口芯片是 INTEL公司生产的通用并行接口芯片,它具有 A、B、C 三个并行接口,用+5V 单电源供电,能在以下三
2、种方式下工作:方式 0:基本输入/ 输出方式;方式 l:选通输入/ 输出方式;方式 2:双向选通工作方式;2. 使 8255A端口 A工作在方式 0并作为输入口,读取 Kl-K8个开关量,PB口工作在方式 0作为输出口。五、实验程序框图 8255A并行口实验 (一)2图 4-2六、实验步骤 1. 断电连接导线, 8255A 芯片 A口的 PA0-PA7依次和开关量输入 Kl-K8相连,8255A 芯片 B口的 PB0-PB7依次接 Ll-L8;2. 在 PC机和实验系统联机状态下,新建实验程序,编辑完成后进行保存(保存后缀为.asm 文件);3. 编译下载;4. 全速运行,运行程序。七、实验程
3、序CODE SEGMENTMAIN PROC FARASSUME CS:CODESTART: MOV DX, 0FF2BH ;控制字寄存器MOV AL, 90H ;控制字OUT DX, AL ;写入控制字TEST: MOV DX, 0FF28H ;指向 A 口IN AL, DX ;从 A 口读入开关状态MOV DX, 0FF29H ;指向 B 口OUT DX, AL ;B 口控制 LED,指示开关状态JMP TEST ;进行下一轮检测MAIN ENDPCODE ENDSEND MAIN八、实验结果闭合或断开开关,相应的发光二极管会亮或灭。九、实验中遇到的问题及解决方式问题:编程过程中不知道此实
4、验平台的 8255A 的端口地址。解决:查阅实验指导书中对实验平台的简介,最终得到了 8255A 的端口地址。8255A并行口实验 (一)38255A并行口实验 (二)4实验五 8255A 并行口实验(二)一、实验目的 掌握通过 8255A并行口传输数据的方法,以控制发光二极管的亮与灭。二、实验内容 用 8255A做输出口,控制十二个发光管亮灭,模拟交通灯管理。三、实验接线图 图 5-1四、编程指南 1. 通过 8255A控制发光二极管,PB4-PB7 对应黄灯,PC0-PC3 对应红灯,PC4-PC7对应绿灯, 以模拟交通路灯的管理;2. 要完成本实验,必须先了解交通路灯的亮灭规律,设有一个
5、十字路口l、3 为南北方向,2、4 为东西方向,初始状态为四个路口的红灯全亮,之后,1、3 路口的绿灯亮,2、4 路口的红灯亮,1、3 路口方向通车。延时一段时间后,l、3 路口的绿灯熄灭,而 l、3 路口的黄灯开始闪烁,闪烁若干次以后,l、3 路口红灯亮,而同时 2、4 路口的绿灯亮,2、4 路口方向通车,延时一段时间后,2、4 路口的绿灯熄灭,而黄灯开始闪烁,闪烁若干次以后,再切换到 l、3 路口方向,之后,重复上述过程;8255A并行口实验 (二)53. 程序中设定好 8255A的工作模式及三个端口均工作在方式 0,并处于输出状态;4. 各发光二极管共阳极,使其点亮应使 8255A相应端
6、口的位清 0。五、实验程序框图 图 5-2六、实验步骤 1. 断电连接导线, 按图 6-4连好实验线路: 8255A: PC0L3,PC1L6,PC2L9,PC3L12,PC4L2,PC5L5,PC6L8,PC7L11;PB4L1,PB5L4,PB6L7,PB7L10;2. 在 PC机和实验系统联机状态下,新建实验程序,编辑完成后进行保存(保存后缀为.asm 文件);3. 编译下载;8255A并行口实验 (二)64. 全速运行,运行程序。七、实验程序CODE SEGMENTMAIN PROC FARASSUME CS:CODESTART: MOV DX, 0FF2BHMOV AL, 80HOU
7、T DX, ALMOV DX, 0FF2AHMOV AL, 0FFHOUT DX, ALMOV DX, 0FF29HMOV AL, 0FFHOUT DX, ALMOV DX, 0FF2AHMOV AL, 0F0HOUT DX, ALCALL DELAY2GRY: MOV DX, 0FF2AHMOV AL, 0A5HOUT DX, ALCALL DELAY2MOV AL, 0F5HOUT DX, ALMOV DX, 0FF29HMOV CX, 8NEXT1:MOV AL, 0AFHOUT DX, ALMOV AL, 0FFHCALL DELAY1OUT DX, ALCALL DELAY1LOOP
8、 NEXT1MOV DX, 0FF2AHMOV AL, 5AHOUT DX, ALCALL DELAY2MOV AL, 0FAHOUT DX, ALMOV DX, 0FF29HMOV CX, 8NEXT2:MOV AL, 05FHOUT DX, AL;控制字寄存器;控制字;写入控制字;指向 C 口;控制字;C 口全部置高电平;指向 B 口;控制字;B 口全部置高电平;指向 C 口;控制字;C 口控制红灯全亮;调用延时函数,延时 3s 左右;指向 C 口;控制字;C 口控制 2、4 红灯亮,1、3 绿灯亮;调用延时函数,延时 3s 左右;控制字;C 口控制 1、3 绿灯灭;指向 B 口;设置循环
9、次数,让黄灯闪烁 8 次;控制字;B 口控制 1、3 黄灯亮;控制字;调用延时函数,延时 300ms 左右;B 口控制 1、3 黄灯灭;调用延时函数,延时 300ms 左右;循环;指向 C 口;控制字;C 口控制 1、3 红灯亮,2、4 绿灯亮;调用延时函数,延时 3s 左右;控制字;C 口控制 2、4 绿灯灭;指向 B 口;设置循环次数,让黄灯闪烁 8 次;控制字;B 口控制 2、4 黄灯亮8255A并行口实验 (二)7MOV AL, 0FFHCALL DELAY1OUT DX, ALCALL DELAY1LOOP NEXT2JMP GRYMAIN ENDPDELAY1 PROC NEARP
10、USH CXMOV CX,0E524HDELY2: LOOP DELY2POP CXRETDELAY1 ENDPDELAY2 PROC NEARMOV CX, 10HDELA1: CALL DELAY1LOOP DELA1RETDELAY2 ENDPCODE ENDS END MAIN;控制字;调用延时函数,延时 300ms 左右;B 口控制 2、4 黄灯灭;调用延时函数,延时 300ms 左右;循环;切换到 l、3 路口方向;将 CX 压入堆栈,保护循环次数;设置循环次数;循环以达到延时目的;将 CX 弹出堆栈,恢复循环次数;返回;设置循环次数;调用延时函数,延时 300ms 左右;循环以达
11、到延时目的;返回八、实验结果初始状态为四个路口的红灯全亮,之后,1、3 路口的绿灯亮,2、4 路口的红灯亮,1、3 路口方向通车。延时一段时间后,l、3 路口的绿灯熄灭,而l、3 路口的黄灯开始闪烁,闪烁若干次以后,l、3 路口红灯亮,而同时2、4 路口的绿灯亮,2、4 路口方向通车,延时一段时间后,2、4 路口的绿灯熄灭,而黄灯开始闪烁,闪烁若干次以后,再切换到 l、3 路口方向,之后,重复上述过程。九、实验中遇到的问题及解决方式问题:程序好不容易编译成功后,下载运行时发现十二个灯完全不按我事先设定的方式进行变化。解决:再一次回顾接线图,发现发光二极管是共阳极连接,需送“0”才能使对应灯亮,
12、因此为我计算的数据取反后就可以正常运行了。8255A并行口实验 (二)8问题:取反后,程序仍然有一些时候灯不按我预想的方式点亮。解决:猜测是 B 口与 C 口在初始状态时值可能不确定或全为 0。按照这种想法,在初始化时加上了将 B 口与 C 口全部初始置 1,保证所有灯初始状态都是灭。问题:加上初始化后,发现程序运行到黄灯闪烁时就只执行一次黄灯闪烁。解决:在闪烁过程中,程序两次用到了 CX,第一次用来决定黄灯闪烁次数,第二次是用来延时,因此 CX 在延时后就变成 0 了,导致闪烁只执行一次就退出。因此,按此想法,在延时程序中必须将 CX 压入堆栈保护,延时完毕再弹出。加上此段程序后,实际下载运行终于完全符合实验要求。