实验一开关状态显示【实验目的】熟悉实验箱和软件开发平台的使用。了解基本I/O端口的操作方法和技巧,掌握编程和调试基本技能。【实验内容】利用74LS244作为输入口,读取开关状态,根据给定表格中开关状态对应的输出关系,通过74LS273驱动发光二极管显示出来。【实验区域电路连接图】参考上图连线:Y0~Y1接K1~K2(对应J1、J2);Q0~Q7接L1~L8(对应J3至J10);CS1接8000H孔(对应J12);CS2接9000H孔(对应J11);IOWR→IOWR;IORD→IORD;然后用数据排线连接JX7→JX17(BUS2)。【程序框图】【编程】CODESEGMENTASSUMECS:CODEORG1200HSTART:MOVDX,8000HINAL,DXTESTAL,01HJNZY1/测试AL是否等于01H,若不等于,则跳入循环Y1/TESTAL,02HJNZY2/测试AL是否等于02H,若不等于,则跳入循环Y2/MOVDX,9000HMOVAL,0FFH/点亮所有的灯/OUTDX,ALJMPSTARTY1:TESTAL,02HJNZY3/测试AL是否等于02H,若不等于,则跳入循环Y3/MOVDX,9000HMOVAL,0AAH/点亮奇数号灯/OUTDX,ALJMPSTARTY2:MOVDX,9000HMOVAL,55H/点亮偶数号灯/OUTDX,ALJMPSTARTY3:MOVDX,9000HMOVAL,00H/所有灯全灭/OUTDX,ALJMPSTARTCODEENDSENDSTART【问答题】1、I/O端口的寻址方式有哪2种?在x86系统中,采用哪一种?解:I/O端口的寻址方式有两种:一种是I/O地址与存储器地址统一编址,一种是I/O地址与存储器地址分别独立编址。在x86系统中,采用I/O地址与存储器地址分别独立编址。2、在输入/输出电路中,为什么常常要使用锁存器和缓冲器?解:一般来说,I/O设备速度比CPU执行速度慢,故输入设备的数据线锁存在端口的锁存器中,CPU从端口中读入数据;输出时CPU将数据“打入”缓冲器后就可以退出,外设从缓冲器取数据。【心得体会】第一次的实践课程做的是开关状态显示,通过本次试验的操作,我了解了dice8086实验系统自带键盘、显示电路和监控管理程序,在无PC机的情况下,同样可以脱机通过单步、断点、全速等方法调试实验程序。熟悉了实验箱和软件开发平台的使用。了解基本I/O端口的操作方法和技巧,掌握编程和调试基本技能。掌握了编程和调试基本技能,加深了对课堂上理论知识的学习,将理论与实践动手相结合,更好的掌握了知识,熟练了实验箱和软件结合使用的方法。实验二模拟交通灯实验【实验目的】1.学习在PC机系统中扩展简单I/O接口的方法。2.进一步学习编制数据输出程序的设计方法。3.学习模拟交通灯控制的方法。【实验内容】用8255做输出口,控制十二个发光管(4组红绿黄灯)的亮灭,模拟十字路口交通灯管理。【实验区域电路连接图】PC0→L3;PC1→L7;PC2→L11;PC3→L15;红灯PC4→L2;PC5→L6;PC6→L10;PC7→L14;绿灯PB4→L1;PB5→L5;PB6→L9;PB7→L13。黄灯8255数据、控制线内部已线连好。【程序框图】【编程】CODESEGMENTASSUMECS:CODEORG1000HPORTAEQU0FF28HPORTBEQU0FF29HPORTCEQU0FF2AHPORTCNEQU0FF2BH;将8255的A、B、C和控制口地址定义,方便使用main:movdx,portcnmoval,80houtdx,al;8255初始化,向控制口写入80H,表示A、B、C三个口都工作在方式0movdx,portbmoval,0f0houtdx,al;B口高位为黄灯,输出0F0H/0FFH使黄灯初始全灭。否则默认输出全0,黄灯会全亮movdx,portcmoval,0f0houtdx,al;C口高位绿灯,低位红灯。输出0F0H使绿灯全灭红灯全亮calldelay1;延时BEGIN:;主循环标号movdx,portcmoval,0a5houtdx,al;1、3路口绿灯亮,即PC4和PC6为0。对应路口红灯灭,即PC0和PC2为1,所以输出0A5Hcalldelay3;红绿灯转换之间的长延时movdx,portcmoval,0f5houtdx,al;1、3路口绿灯灭,红灯不变,输出0F5Hmovcx,8;黄灯闪烁次数计数赋初值8L1:movdx,portbmoval,0a0houtdx,al;1、3路口黄灯对应PB4和PB6,该两位为0,故输出0A0H或0AFHcalldelay2;黄灯闪烁之间的短延时movdx,portbmoval,0f0houtdx,al;1、3路口黄灯灭,输出0F0H或0FFHcalldelay2deccx;闪烁次数计数减1jnzL1;闪烁次数计数不为0则跳回L1继续闪烁movdx,portcmoval,0f0h;绿灯全灭,红灯全亮outdx,almovdx,portcmoval,5ahoutdx,al;2、4路口绿灯亮,红灯灭calldelay3movdx,portcmoval,0fahoutdx,al;2、4路口绿灯灭,红灯不变movcx,8L2:movdx,portbmoval,50houtdx,alcalldelay2movdx,portbmoval,0f0houtdx,alcalldelay2deccxjnzL2;2、4路口黄灯闪烁8次movdx,portcmoval,0f0houtdx,al;四个红灯全亮jmpBEGINdelay1:movax,5hmovbx,0hx:decbxjnzxdecaxjnzxretdelay2:movax,1hmovbx,0hy:decbxjnzydecaxjnzyretdelay3:movax,20hmovbx,0hz:decbxjnzzdecaxjnzzretcodeendsendmain【问答题】1、8255A的哪个端口能实现位操作控制(按位置位/复位)?执行控制字写入操作的端口是哪个?解:8255A的C端口能实现位操作控制(按位置位/复位),执行控制字写入操作的端口是命令字端口。2、写出下图中Intel8255A占用的4个端口地址。解:FFF0H、FFF2H、FFF4H、FFF6H。【心得体会】这次的课程设计让我把书本上的理论知识应用在实践中,实现了理论和实践相结合,从中更懂得理论是实践的基础,实践有助于检验理论的正确性的道理。模拟交通灯工作的实验,通过8255A控制发光二极管,PB4-PB7对应黄灯,PC0-PC3对应红灯,PC4-PC7对应绿灯,以模拟交通路灯的管理。在实验中不但要满足题目所提出的要求,更要结合实际,考虑到现实问题,比如说绿灯时间要比红灯时间长。通过本次实验,不仅再次熟悉了8255A,更是对自己编程技术一个很好的锻炼,对我以后参加工作或者继续学习深造将产生巨大的帮助和影响。实验三8253定时器/计数器实验一、实验目的学会8253芯片与微机接口的原理和方法。掌握8253定时器/计数器的工作原理和编程方法。二、实验内容编写程序,将8253的计数器0设置为方式2(频率发生器),计数器1设置为方式3(方波频率发生器),计数器0的输出作为计数器1的输入,计数器1的输出接在一个LED上,运行后可观察到该LED在不停地闪烁。1、编程时用程序框图中的二个计数初值,计算OUT1的输出频率,用表观察LED,进行核对。2、修改程序中的二个计数初值,使OUT1的输出频率为1Hz,用手表观察LED,进行核对。3、上面计数方式选用的是16进制,现若改用BCD码,试修改程序中的二个计数初值,使LED的闪亮频率仍为1Hz。三、实验区域电路连接图参考上图连线:CS3→0040H;JX8→JX0;IOWR→IOWR;IORD→IORD;A0→A0;A1→A1;GATE0→+5V;GATE1→+5V;OUT0→CLK1;OUT1→L1;CLK0→0.5MHz;(单脉冲与时钟单元)四、编程指南8253是一种可编程定时/计数器,有三个十六位计数器,其计数频率范围为0-2MHz,用+5V单电源供电。8253的六种工作方式:⑴方式0:计数结束中断⑷方式3:方波频率发生器⑵方式l:可编程频率发生⑸方式4:软件触发的选通信号⑶方式2:频率发生器⑹方式5:硬件触发的选通信号8253初始化编程1、8253初始化编程8253的控制寄存器和3个计数器分别具有独立的编程地址,由控制字的内容确定使用的是哪个计数器以及执行什么操作。因此8253在初始化编程时,并没有严格的顺序规定,但在编程时,必须遵守两条原则:①在对某个计数器设置初值之前,必须先写入控制字;②在设置计数器初始值时,要符合控制字的规定,即只写低位字节,还是只写高位字节,还是高、低位字节都写(分两次写,先低字节后高字节)。2、8253的编程命令8253的编程命令有两类:一类是写入命令,包括设置控制字、设置计数器的初始值命令和锁存命令;另一类是读出命令,用来读取计数器的当前值。锁存命令是配合读出命令使用的。在读出计数器值前,必须先用锁存命令锁定当前计数寄存器的值。否则,在读数时,减1计数器的值处在动态变化过程中,当前计数输出寄存器随之变化,就会得到一个不确定的结果。当CPU将此锁定值读走后,锁存功能自动失效,当前计数输出寄存器的内容又跟随减1计数器变化。在锁存和读出计数值的过程中,减1计数器仍在作正常减1计数。这种机制确保了即能在计数过程中读取计数值,又不影响计数过程的进行。五、程序框图实验步骤1、按连线图连接好,检查无误后打开实验箱电源。在PC端软件开发平台上输入设计好的程序,编译通过后下载到实验箱。3、运行程序后,观察LED闪烁周期(可以看10次或更多次闪烁时间,以提高观察准确度)。再按要求调整初始值,使得闪烁周期为1S时间。如果运行不正常就要检查连线,程序。排查错误,修改程序,直到运行程序正常。七、实验程序清单及注释codesegmentassumecs:codeorg1200hSTART:movdx,43h;8253控制寄存器地址存入DXmoval,00110100boutdx,al;对8253初始化,计数器0选择16位方式2二进制计数movdx,40h;8253计数器0地址moval,0EEHoutdx,almoval,2Houtdx,al;给计数器0装入初值2EEH,先低字节后高字节movdx,43hmoval,01110110boutdx,al;8253初始化,计数器1选择16位方式3二进制计数movdx,41h;8253计数器1地址moval,0E8houtdx,almoval,3houtdx,al;给计数器1装入初值3E8H,先低字节后高字节jmp$;跳到本地址,使程序在这里无限循环codeendsendSTART计算步骤及结果由公式:f=10CLK0NNf1计数器1的输出频率(1.5S时):1.5Hz10000570.5MHz1f1计数器1的输出频率(1.0S时):Hz110000050.5MHz1f2观察时,计时30s,观察这段时间内LED闪烁多少次,即可估算输出频率。九、程序修改与调试(1)初始程序输出频率是1.5Hz,即LED灯每1.5秒闪烁一次,若要使LED灯每1s闪烁一次,即输出为1Hz。则程序应该作以下修改(十六进制时):MOVAL,0EEHMOVAL,0F4HOUTDX,ALOUTDX,ALMOVAL,2H→MOVAL,1HOUTDX,ALOUTDX,AL(2)若计数方式为BCD码,则程序应该作以下修改:MOVAL,00110100BMOVAL,00110101BOUTDX,ALOUTDX,ALMOVDX,40HMOVDX,40HMOVAL,0EEH→MOVAL,00HOUTDX,ALOUTDX,ALMOVAL,2HMOVAL,5HMOVAL,01110110BMOVAL,01110111BOUTDX,ALO