
| 实验名称 | 实验一 8251可编程通信实验(与微机) | ||||||
| 姓 名 | 系院专业 | 你的专业 | 班 级 | 你的专业 13-5班 | 学 号 | ||
| 实验日期 | 2015.5.20 | 指导教师 | 成 绩 | ||||
| 一、实验目的和要求 1、了解8251的内部结构、工作原理;了解8251与8086的接口逻辑;掌握对8251的初始化编程方法,学会使用8251实现设备之间的串行通信。 | |||||||
| 二、实验内容(包括实验步骤和代码) (一)实验内容 1、编制程序:实现8251A与PC机的串行通讯,使用8253作分频器提供8251的收发时钟。 2、连接线路,从微机接收一批数据,接收完毕,再将它们回送给微机。 (二)实验步骤 1、连线说明: C4区:CS(8253)、A0、A1 | —— | A3区:CS2、A0、A1 | |||||
| C4区:CLK0 | —— | B2区:2M | |||||
| C4区:GATE | —— | C1区的VCC | |||||
| C4区:OUT0 | —— | C3区:RxC TxC | |||||
| C3区:CS(8251)、C/D | —— | A3区:CS4、A0 | |||||
| C3区:CLK | —— | B2区:4M | |||||
| C3区:RXD、TXD | —— | D7区:RXD、TXD | |||||
3、运行“串口助手(ComPort.EXE)”,设置串口(波特率4800,8个数据位,一个停止位,偶校验),打开串口,选择“HEX发送”、“HEX显示”,向8251发送10个字节数据(输入数据之间用空格分隔),是否能接收到10个字节数据,接收到的数据是否与发送数据一致。
4、改变传输数据的数目,重复实验,观察结果。
(三)实验代码
| .MODEL | TINY | |||||||||
| ;使用8253的计数器0,外接2Mhz,经26分频后,送给8251,产生4800bps | ||||||||||
| CTL_ADDR | EQU | 0241H | ;控制字或状态字 | |||||||
| DATA_ADDR | EQU | 0240H | ;读写数据 | |||||||
| W_8253_T0 | EQU | 0260H | ;计数器0地址 | |||||||
| W_8253_C | EQU | 0263H | ;控制字 | |||||||
| .STACK | 100 | |||||||||
| .DATA | ||||||||||
| Receive_Buffer | DB | 10 DUP(0) | ;接受缓冲器 | |||||||
| Send_Buffer | EQU | Receive_Buffer | ;发送缓冲器 | |||||||
| .CODE | ||||||||||
| START: | MOV | AX,@DATA | ||||||||
| MOV | DS,AX | |||||||||
| MOV | ES,AX | |||||||||
| NOP | ||||||||||
| CALL | INIT_8253 | |||||||||
| CALL | INIT_8251 | |||||||||
| START1: | MOV | CX,10 | ||||||||
| CALL | Receive_Group | |||||||||
| MOV | CX,10 | |||||||||
| CALL | Send_Group | |||||||||
| JMP | START1 | |||||||||
| INIT_8253 | PROC | NEAR | ||||||||
| MOV | DX,W_8253_C | |||||||||
| MOV | AL,37H | ;定时器0,方式3 | ||||||||
| OUT | DX,AL | |||||||||
| MOV | DX,W_8253_T0 | |||||||||
| MOV | AL,26H | ;BCD码26(2000000/26)=16*4800 | ||||||||
| OUT | DX,AL | |||||||||
| MOV | AL,0 | |||||||||
| OUT | DX,AL | |||||||||
| RET | ||||||||||
| INIT_8253 | ENDP | |||||||||
| INIT_8251 | PROC | NEAR | ||||||||
| CALL | RESET_8251 | |||||||||
| MOV | DX,CTL_ADDR | |||||||||
| MOV | AL,7EH | ;波特率系数为16,8个数据位 | ||||||||
| OUT | DX,AL | ;一个停止位,偶校验 | ||||||||
| CALL | DLTIME | ;延时 | ||||||||
| MOV | AL,15H ;允许接收和发送发送数据,清错误标志 | |||||||||
| OUT | DX,AL | |||||||||
| CALL | DLTIME | |||||||||
| RET | ||||||||||
| INIT_8251 | ENDP | |||||||||
| Reset_8251 | PROC | NEAR | ||||||||
| MOV | DX,CTL_ADDR | |||||||||
| MOV | AL,0 | |||||||||
| OUT | DX,AL | ;向控制口写入"0" | ||||||||
| CALL | DLTIME | ;延时,等待写操作完成 | ||||||||
| OUT | DX,AL | ;向控制口写入"0" | ||||||||
| CALL | DLTIME | ;延时 | ||||||||
| OUT | DX,AL | ;向控制口写入"0" | ||||||||
| CALL | DLTIME | ;延时 | ||||||||
| MOV | AL,40H | ;向控制口写入复位字40H | ||||||||
| OUT | DX,AL | |||||||||
| CALL | DLTIME | |||||||||
| RET | ||||||||||
| Reset_8251 | ENDP | |||||||||
| ;接受一组数据,CX--接受数目 | ||||||||||
| Receive_Group | PROC | NEAR | ||||||||
| LEA | DI,Receive_Buffer | |||||||||
| Receive_Group1: | CALL | Receive_Byte | ||||||||
| STOSB | ||||||||||
| LOOP | Receive_Group1 | |||||||||
| RET | ||||||||||
| Receive_Group | ENDP | |||||||||
| ;接受一个字节 | ||||||||||
| Receive_Byte | PROC | NEAR | ||||||||
| MOV | DX,CTL_ADDR | |||||||||
| Receive_Byte1: | IN | AL,DX | ;读入状态 | |||||||
| TEST | AL,2 | |||||||||
| JZ | Receive_Byte1 | ;有数据吗? | ||||||||
| MOV | DX,DATA_ADDR | ;有 | ||||||||
| IN | AL,DX | |||||||||
| RET | ||||||||||
| Receive_Byte | ENDP | |||||||||
| ;发送一组数据,CX--发送数目 | ||||||||||
| Send_Group | PROC | NEAR | ||||||||
| LEA | SI,Send_Buffer | |||||||||
| Send_Group1: | LODSB | |||||||||
| CALL | SendByte | |||||||||
| LOOP | Send_Group1 | |||||||||
| RET | ||||||||||
| Send_Group | ENDP | |||||||||
| ;发送一个字节 | ||||||||||
| Sendbyte | PROC | NEAR | ||||||||
| PUSH | AX | |||||||||
| MOV | DX,CTL_ADDR | ;读入状态 | ||||||||
| Sendbyte1: | IN | AL,DX | ||||||||
| TEST | AL,1 | |||||||||
| JZ | Sendbyte1 | ;允许数据发送吗? | ||||||||
| POP | AX | ;发送 | ||||||||
| MOV | DX,DATA_ADDR | |||||||||
| OUT | DX,AL | |||||||||
| RET | ||||||||||
| Sendbyte | ENDP | |||||||||
| ;延时 | ||||||||||
| DLTIME | PROC | NEAR | ||||||||
| MOV | CX,10 | |||||||||
| LOOP | $ | |||||||||
| RET | ||||||||||
| DLTIME | ENDP | |||||||||
| END | START | |||||||||
(一)实验结果
由图1.1可知,使用串口助手每发送十个字节的十六进制数便可以接收到这十个字节的十六进制数。
图1.1
(二)实验扩展及思考
1、请读者思考,如何修改程序实现8251的自发自收功能?
答:将8251的TxD与RxD相连接,由TxD逐个发送字符,并用RxD逐个接收。
2、8251 与8250有何区别?
| 答:8250是异步收发器UART,8251是同步异步收发器USART,在PC机中带的串行口是8250 |
实验名称 | 实验二 8255控制交通灯实验 | ||||||
| 姓 名 | 系院专业 | 你的专业 | 班 级 | 你的专业 13-5班 | 学 号 | ||
| 实验日期 | 2015.6.8 | 指导教师 | 成 绩 | ||||
| 一、实验目的和要求 1、了解8255芯片的工作原理,熟悉其初始化编程方法以及输入、输出程序设计技巧。学会使用8255并行接口芯片实现各种控制功能,如本实验(控制交通灯)等。 2、熟悉8255内部结构和与8086的接口逻辑,熟悉8255芯片的3种工作方式以及控制字格式。 | |||||||
| 二、实验内容(包括实验步骤和代码) (一)实验内容 1、编写程序:使用8255的PA0..2、PA4..6控制LED指示灯,实现交通灯功能。 2、连接线路验证8255的功能,熟悉它的使用方法。 (二)实验步骤 1、连线说明: D3区:CS、A0、A1 | —— | A3区:CS1、A0、A1 | |||||
| D3区:JP23(PA口) | —— | F4区:JP18 | |||||
(三)实验代码
| .MODEL | TINY | |||||||||
| COM_ADD | EQU | 0273H | ||||||||
| PA_ADD | EQU | 0270H | ||||||||
| PB_ADD | EQU | 0271H | ||||||||
| PC_ADD | EQU | 0272H | ||||||||
| .STACK | 100 | |||||||||
| .DATA | ||||||||||
| LED_Data | DB | 10111110B | ;东西绿灯,南北红灯 | |||||||
| DB | 10111111B | ;东西绿灯闪烁,南北红灯 | ||||||||
| DB | 10111101B | ;东西黄灯亮,南北红灯 | ||||||||
| DB | 11101011B | ;东西红灯,南北绿灯 | ||||||||
| DB | 11111011B | ;东西红灯,南北绿灯闪烁 | ||||||||
| DB | 11011011B | ;东西红灯,南北黄灯亮 | ||||||||
| .CODE | ||||||||||
| START: | MOV | AX,@DATA | ||||||||
| MOV | DS,AX | |||||||||
| NOP | ||||||||||
| MOV | DX,COM_ADD | |||||||||
| MOV | AL,80H | ;PA、PB、PC为基本输出模式 | ||||||||
| OUT | DX,AL | |||||||||
| MOV | DX,PA_ADD | ;灯全熄灭 | ||||||||
| MOV | AL,0FFH | |||||||||
| OUT | DX,AL | |||||||||
| LEA | BX,LED_Data | |||||||||
| START1: | MOV | AL,0 | ||||||||
| XLAT | ||||||||||
| OUT | DX,AL | ;东西绿灯,南北红灯 | ||||||||
| CALL | DL5S | |||||||||
| MOV | CX,6 | |||||||||
| START2: | MOV AL,1 | |||||||||
| XLAT | ||||||||||
| OUT | DX,AL | ;东西绿灯闪烁,南北红灯 | ||||||||
| CALL | DL500ms | |||||||||
| MOV | AL,0 | |||||||||
| XLAT | ||||||||||
| OUT | DX,AL | |||||||||
| CALL | DL500ms | |||||||||
| LOOP | START2 | |||||||||
| MOV | AL,2 | ;东西黄灯亮,南北红灯 | ||||||||
| XLAT | ||||||||||
| OUT | DX,AL | |||||||||
| CALL | DL3S | |||||||||
| MOV | AL,3 | ;东西红灯,南北绿灯 | ||||||||
| XLAT | ||||||||||
| OUT | DX,AL | |||||||||
| CALL | DL5S | |||||||||
| MOV | CX,6 | |||||||||
| START3: | MOV | AL,4 | ;东西红灯,南北绿灯闪烁 | |||||||
| XLAT | ||||||||||
| OUT | DX,AL | |||||||||
| CALL | DL500ms | |||||||||
| MOV | AL,3 | |||||||||
| XLAT | ||||||||||
| OUT | DX,AL | |||||||||
| CALL | DL500ms | |||||||||
| LOOP | START3 | |||||||||
| MOV | AL,5 | ;东西红灯,南北黄灯亮 | ||||||||
| XLAT | ||||||||||
| OUT | DX,AL | |||||||||
| CALL | DL3S | |||||||||
| JMP | START1 | |||||||||
| DL500ms | PROC | NEAR | ||||||||
| PUSH | CX | |||||||||
| MOV | CX,60000 | |||||||||
| DL500ms1: | LOOP | DL500ms1 | ||||||||
| POP | CX | |||||||||
| RET | ||||||||||
| DL500ms | ENDP | |||||||||
| DL3S | PROC | NEAR | ||||||||
| PUSH | CX | |||||||||
| MOV | CX,6 | |||||||||
| DL3S1: | CALL | DL500ms | ||||||||
| LOOP | DL3S1 | |||||||||
| POP | CX | |||||||||
| RET | ||||||||||
| ENDP | ||||||||||
| DL5S | PROC | NEAR | ||||||||
| PUSH | CX | |||||||||
| MOV | CX,10 | |||||||||
| DL5S1: | CALL | DL500ms | ||||||||
| LOOP | DL5S1 | |||||||||
| POP | CX | |||||||||
| RET | ||||||||||
| ENDP | ||||||||||
| END | START | |||||||||
(一)实验结果
全速运行程序,实验结果如图所示。
(二)实验扩展及思考
1、如何对8255的PC口进行位操作?
| 答:8255控制字D7=1时,D6~D0为口模式控制,D7=0时控制字为PC口的位操作模式,如控制字=00H,PC0复位;控制字=01H,PC0置位;控制字=0EH,PC7复位;控制字=0FH,PC7置位;其中D6~D4没定义,D3~D1从000B~111B分别指定PC0~PC7脚,D0位为相应的电平高低,0为低电平,1为高电平。 |
实验名称 | 实验三 静态存贮器(16位)读写实验 | ||||||
| 姓 名 | 姓名 | 系院专业 | 你的专业 | 班 级 | 你的专业 13-5班 | 学 号 | |
| 实验日期 | 2015.6.13 | 指导教师 | 成 绩 | ||||
| 一、实验目的和要求 1、了解静态存贮器的特性、扩展方法,掌握存贮器的读写时序。 2、掌握CPU对16位静态存贮器的访问方法 3、认真预习本节实验内容,尝试自行编写程序,填写实验报告。 | |||||||
| 二、实验内容(包括实验步骤和代码) (一)实验内容 1、说明:实验仪选用常用的静态存贮器芯片62256(32K×8位),二片组成32K×16位,共K字节。实验仪具有16位数据总线D0..D15、20位地址线A0..A19、BLE(低电平有效,选择低8位存贮器芯片)、BHE(低电平有效,选择高8位存贮器芯片);BLE、BHE同时有效,对存贮器字方式读写,BLE或BHE有效,对存贮器字节方式读写。扩展16位存贮器时,不使用地址线A0。 2、编写程序:将B4区的静态存贮器3000H-30FFH单元中数据复制到6000H-60FFH的单元中,并校验,检测写入的数据是否正确。 3、连接线路验证功能,熟悉它的使用方法。 (二)实验步骤 1、连线说明: B4(RAM)区:CS、BLE、BHE | —— | A3区:mCS0、BLE、BHE | |||||
| B4(RAM)区:RD、WR | —— | A3区:MEMR、MEMW | |||||
| B4(RAM)区:JP49(A0..A7) | —— | A3区:JP29(A1..A8) | |||||
| B4(RAM)区:JP38(A8..A15) | —— | A3区:JP33(A9..A16) | |||||
| B4(RAM)区:JP57(D0..D7) | —— | A3区:JP42(D0..D7) | |||||
| B4(RAM)区:JP56(D8..D15) | —— | A3区:JP40(D8..D15) | |||||
(三)实验代码
| ;数据块移动(16位存贮器实验) | |||
| .MODEL | TINY | ||
| .STACK | 100 | ||
| .CODE | |||
| START: | MOV | AX,8000H | ;存贮器扩展空间段地址 |
| MOV | DS,AX | ||
| MOV | ES,AX | ||
| NOP | |||
| MOV | CX,100H | ||
| MOV | SI,3000H | ||
| MOV | DI,6000H | ||
| CALL | Move | ||
| MOV | CX,100H | ||
| MOV | SI,3000H | ||
| MOV | DI,6000H | ||
| CLD | |||
| REPE | CMPSB | ||
| JNE | ERROR | ||
| TRUE: | JMP | $ | |
| ERROR: | JMP | $ | |
| Move | PROC | NEAR | |
| CLD | |||
| CMP | SI,DI | ||
| JZ | Return | ||
| JNB | Move1 | ||
| ADD | SI,CX | ||
| DEC | SI | ||
| ADD | DI,CX | ||
| DEC | DI | ||
| STD | |||
| Move1: | REP | MOVSB | |
| Return: | RET | ||
| Move | ENDP | ||
| END | START | ||
| 三、实验结果及其分析 (一)实验结果 3000H-30FFH单元中数据如图3.1所示。当执行完程序后,3000H-30FFH单元中数据被复制到6000H-60FF单元中,如图3.2所示。程序最终停留在 JMP $。 图3.1 图3.2 (二)实验扩展及思考 1、子程序Move中为什么比较SI、DI? 答:源数据块与目标范围有可能部分重叠,需要考虑从第一个字节开始复制(顺序复制),还是从最后一个字节开始复制(倒序复制)。 |
| 实验名称 | 实验四 8259A(1)中断控制器实验 | ||||||
| 姓 名 | 姓名 | 系院专业 | 你的专业 | 班 级 | 你的专业 13-5班 | 学 号 | |
| 实验日期 | 2015.6.13 | 指导教师 | 成 绩 | ||||
| 一、实验目的和要求 1、了解8259A的内部结构、工作原理;了解8259A与8086的接口逻辑;掌握对8259A的初始化编程方法,了解8086是如何响应中断、退出中断的。 | |||||||
| 二、实验内容(包括实验步骤和代码) (一)实验内容 1、编制程序:拨动单脉冲开关,“”送给8259A的IR0,触发中断,8086计数中断次数,显示于F5区的数码管上 (二)实验步骤 1、连线说明: B3区:CS、A0 | —— | A3区:CS3、A0 | |||||
| B3区:INT、INTA | —— | A3区:INTR、INTA | |||||
| B3区:IR0 | —— | B2区:单脉冲 | |||||
| D3区:CS、A0、A1 | —— | A3区:CS1、A0、A1 | |||||
| D3区:PC0、PC1 | —— | F5区:KL1、KL2 | |||||
| D3区:JP20、B、C | —— | F5区:A、B、C | |||||
3、上下拨动单脉冲开关,拨动二次,产生一个“”,观察结果,数码管上显示的次数与拨动开关次数是否对应。
(三)实验代码
| .MODEL | TINY | |||||||||
| EXTRN | InitKeyDisplay:NEAR, Display8:NEAR | |||||||||
| IO8259_0 | EQU | 0250H | ||||||||
| IO8259_1 | EQU | 0251H | ||||||||
| .STACK | 100 | |||||||||
| .DATA | ||||||||||
| BUFFER | DB | 8 DUP(?) | ||||||||
| Counter | DB | ? | ||||||||
| ReDisplayFlag | DB | 0 | ||||||||
| .CODE | ||||||||||
| START: | MOV | AX,@DATA | ||||||||
| MOV | DS,AX | |||||||||
| MOV | ES,AX | |||||||||
| NOP | ||||||||||
| CALL | InitKeyDisplay | ;对键盘、数码管控制器8255初始化 | ||||||||
| CALL | Init8259 | |||||||||
| CALL | WriIntver | |||||||||
| MOV | Counter,0 | ;中断次数 | ||||||||
| MOV | ReDisplayFlag,1 | ;需要显示 | ||||||||
| STI | ;开中断 | |||||||||
| START1: | LEA | SI,Buffer | ||||||||
| CALL | Display8 | |||||||||
| CMP | ReDisplayFlag,0 | |||||||||
| JZ | START1 | |||||||||
| CALL | LedDisplay | |||||||||
| MOV | ReDisplayFlag,0 | |||||||||
| JMP | START1 | |||||||||
| Init8259 | PROC | NEAR | ||||||||
| MOV | DX,IO8259_0 | |||||||||
| MOV | AL,13H | |||||||||
| OUT | DX,AL | |||||||||
| MOV | DX,IO8259_1 | |||||||||
| MOV | AL,08H | |||||||||
| OUT | DX,AL | |||||||||
| MOV | AL,09H | |||||||||
| OUT | DX,AL | |||||||||
| MOV | AL,0FEH | |||||||||
| OUT | DX,AL | |||||||||
| RET | ||||||||||
| Init8259 | ENDP | |||||||||
| WriIntver | PROC | NEAR | ||||||||
| PUSH | ES | |||||||||
| MOV | AX,0 | |||||||||
| MOV | ES,AX | |||||||||
| MOV | DI,20H | |||||||||
| LEA | AX,INT_0 | |||||||||
| STOSW | ||||||||||
| MOV | AX,CS | |||||||||
| STOSW | ||||||||||
| POP | ES | |||||||||
| RET | ||||||||||
| WriIntver | ENDP | |||||||||
| LedDisplay | PROC | NEAR | ||||||||
| MOV | AL,Counter | |||||||||
| MOV | AH,AL | |||||||||
| AND | AL,0FH | |||||||||
| MOV | Buffer,AL | |||||||||
| AND | AH,0F0H | |||||||||
| ROR | AH,4 | |||||||||
| MOV | Buffer + 1,AH | |||||||||
| MOV | Buffer + 2,10H | ;高六位不需要显示 | ||||||||
| MOV | Buffer + 3,10H | |||||||||
| MOV | Buffer + 4,10H | |||||||||
| MOV | Buffer + 5,10H | |||||||||
| MOV | Buffer + 6,10H | |||||||||
| MOV | Buffer + 7,10H | |||||||||
| RET | ||||||||||
| LedDisplay | ENDP | |||||||||
| INT_0: | PUSH | DX | ||||||||
| PUSH | AX | |||||||||
| MOV | AL,Counter | |||||||||
| ADD | AL,1 | |||||||||
| DAA | ||||||||||
| MOV | Counter,AL | |||||||||
| MOV | ReDisplayFlag,1 | |||||||||
| MOV | DX,IO8259_0 | |||||||||
| MOV | AL,20H | |||||||||
| OUT | DX,AL | |||||||||
| POP | AX | |||||||||
| POP | DX | |||||||||
| IRET | ||||||||||
| END | START | |||||||||
(一)实验结果
每中断一次,便计数一次,中断77次后数码管显示如图4.1所示。
| 图4.1 |
实验名称 | 实验五 8253方波实验 | ||||||
| 姓 名 | 姓名 | 系院专业 | 你的专业 | 班 级 | 你的专业 13-5班 | 学 号 | |
| 实验日期 | 2015.6.14 | 指导教师 | 成 绩 | ||||
| 一、实验目的和要求 1、了解8253的内部结构、工作原理;了解8253与8086的接口逻辑;熟悉8253的控制寄存器和初始化编程方法,熟悉8253的6种工作模式。 | |||||||
| 二、实验内容(包括实验步骤和代码) (一)实验内容 1、编写程序:使用8253的计数器0和计数器1实现对输入时钟频率的两级分频,得到一个周期为1秒的方波,用此方波控制蜂鸣器,发出报警信号,也可以将输入脚接到逻辑笔上来检验程序是否正确。 2、连接线路,验证8253的功能,熟悉它的使用方法。 (二)实验步骤 1、连线说明: C4区:CS、A0、A1 | —— | A3区:CS2、A0、A1 | |||||
| C4区:CLK0 | —— | B2区:2M | |||||
| C4区:OUT0 | —— | C4区:CLK1 | |||||
| C4区:OUT1 | —— | F8区:Ctrl(蜂鸣器) | |||||
| C4区:GATE | —— | C1区的VCC | |||||
(三)实验代码
| .MODEL | TINY | |||||||||
| COM_ADDR | EQU | 0263H | ||||||||
| T0_ADDR | EQU | 0260H | ||||||||
| T1_ADDR | EQU | 0261H | ||||||||
| .STACK | 100 | |||||||||
| .CODE | ||||||||||
| START: | MOV | DX,COM_ADDR | ||||||||
| MOV | AL,35H | |||||||||
| OUT | DX,AL | ;计数器T0设置在模式2状态,BCD码计数 | ||||||||
| MOV | DX,T0_ADDR | |||||||||
| MOV | AL,00H | |||||||||
| OUT | DX,AL | |||||||||
| MOV | AL,10H | |||||||||
| OUT | DX,AL | ;CLK0/1000 | ||||||||
| MOV | DX,COM_ADDR | |||||||||
| MOV | AL,77H | |||||||||
| OUT | DX,AL | ;计数器T1为模式3状态,输出方波,BCD码计数 | ||||||||
| MOV | DX,T1_ADDR | |||||||||
| MOV | AL,00H | |||||||||
| OUT | DX,AL | |||||||||
| MOV | AL,10H | |||||||||
| OUT | DX,AL | ;CLK1/1000 | ||||||||
| JMP | $ | ;OUT1输出1S的方波 | ||||||||
| END | START | |||||||||
(一)实验结果
运行程序后,可以听到蜂鸣器发出声音。该实验用到了8253的两个计数器T0和T1,T0工作在模式2,为分频器,其输出口接到计数器T1的时钟信号输入端口,计数器T1工作在模式3,输出波形为方波,T1的输出端口接到蜂鸣器,这样就能听到有规律的响了。
(二)实验扩展及思考
1、8253还有其它五种工作方式,其它工作模式下,硬件如何设计?程序如何编写?
答:8253有六种工作模式(0~5),每种工作模式决定以下内容:
(1)计数初值何时起作用:计数初值写入计数初值寄存器(CR)后,要经过一个CLK输入后,计数执行部件(CE)才开始计数。
(2)门控信号的影响:门控信号是计数允许信号。高电平允许,即GATE=1,允许对CLK计数。上升沿允许这种情况需使用计数器内部的一个边沿触发器。只要当初边沿触发器置1后,计数器才对CLK计数。GATE上升沿使边沿触发器置1,GATE下降沿使边沿触发器自动清0.模式0,2,3,4,高电平允许,模式1、5,上升沿允许。
(3)OUT信号的状态:写入控制字后,OUT的状态。计数过程中,OUT的状态。计数终了,OUT的状态。
(4)技术操作是否可以重复,或称计数初值是否可以自动装入:a.不可重复b自动重复c条件重复
| (5)计数器的工作模式:计数器在CLK的下降沿使计数值减1,计数值减至0时,“计数到”。写入初值0时,代表最大初值65536。 |
实验名称 | 实验六 键盘显示实验 | ||||||
| 姓 名 | 姓名 | 系院专业 | 你的专业 | 班 级 | 你的专业 13-5班 | 学 号 | |
| 实验日期 | 2015.6.28 | 指导教师 | 成 绩 | ||||
| 一、实验目的和要求 1、进一步掌握8255的设计、编程方法。 2、掌握矩阵键盘的扫描方法 3、掌握动态扫描数码块的方法 | |||||||
| 二、实验内容(包括实验步骤和代码) (一)实验内容 1、编写程序:扫描键盘,如有按键,键号显示于数码管。 2、连接线路,验证8255的功能,熟悉它的使用方法。 (二)实验步骤 1、连线说明: D3区:CS、A0、A1 | —— | A3区:CS1、A0、A1 | |||||
| D3区:PC0、PC1 | —— | F5区:KL1、KL2 | |||||
| D3区:JP20(PB口)、JP16(B)、JP17(C) | —— | F5区:A、B、C | |||||
(三)实验代码
| .MODEL | TINY | |||||||||
| COM_8255 | EQU | 0273H | ;8255控制口 | |||||||
| PA_8255 | EQU | 0270H | ||||||||
| PB_8255 | EQU | 0271H | ||||||||
| PC_8255 | EQU | 0272H | ||||||||
| .STACK | 100 | |||||||||
| .DATA | ||||||||||
| buffer | DB | 8 DUP(?) | ;8个字节显示缓冲区 | |||||||
| SEG_TAB | DB | 0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H | ||||||||
| DB | 080H, 90H, 88H, 83H,0C6H,0A1H, 86H, 8EH,0FFH | |||||||||
| .CODE | ||||||||||
| START: | MOV | AX,@DATA | ||||||||
| MOV | DS,AX | |||||||||
| MOV | ES,AX | |||||||||
| NOP | ||||||||||
| CLD | ;0->DF, 地址自动递增 | |||||||||
| MOV | DX,COM_8255 | |||||||||
| MOV | AL,H | |||||||||
| OUT | DX,AL | ;PA、PB输出,PC输入 | ||||||||
| LEA | DI,buffer | |||||||||
| MOV | AL,10H | |||||||||
| MOV | CX,08H | |||||||||
| REP | STOSB | |||||||||
| CALL | DIR | |||||||||
| MAIN3: | LEA | DI,buffer | ||||||||
| MAIN2: | CALL | keyi | ||||||||
| STOSB | ||||||||||
| CALL | DIR | |||||||||
| CMP | DI,offset buffer+8 | |||||||||
| JNZ | MAIN2 | |||||||||
| JMP | MAIN3 | |||||||||
| DIR | PROC | NEAR | ||||||||
| PUSH | AX | |||||||||
| PUSH | BX | |||||||||
| PUSH | DX | |||||||||
| LEA | SI,buffer | ;置显示缓冲器初值 | ||||||||
| MOV | AH,0FEH | |||||||||
| LEA | BX,SEG_TAB | |||||||||
| LD0: | MOV | DX,PA_8255 | ||||||||
| LODSB | ||||||||||
| XLAT | ;取显示数据 | |||||||||
| OUT | DX,AL | ;段数据->8255 PA口 | ||||||||
| INC | DX | ;扫描模式->8255 PB口 | ||||||||
| MOV | AL,AH | |||||||||
| OUT | DX,AL | |||||||||
| CALL | DL1 | ;延迟1ms | ||||||||
| MOV | DX,PB_8255 | |||||||||
| MOV | AL,0FFH | |||||||||
| OUT | DX,AL | |||||||||
| TEST | AH,80H | |||||||||
| JZ | LD1 | |||||||||
| ROL | AH,01H | |||||||||
| JMP | LD0 | |||||||||
| LD1: | POP | DX | ||||||||
| POP | BX | |||||||||
| POP | AX | |||||||||
| RET | ||||||||||
| DIR | ENDP | |||||||||
| DL1 | PROC | NEAR | ;延迟子程序 | |||||||
| PUSH | CX | |||||||||
| MOV | CX,500 | |||||||||
| LOOP | $ | |||||||||
| POP | CX | |||||||||
| RET | ||||||||||
| DL1 | ENDP | |||||||||
| KEYI | PROC | NEAR | ||||||||
| PUSH | BX | |||||||||
| PUSH | DX | |||||||||
| LK: | CALL | AllKey | ;调用判有无闭合键子程序 | |||||||
| JNZ | LK1 | |||||||||
| CALL | DIR | |||||||||
| CALL | DIR | ;调用显示子程序,延迟6ms | ||||||||
| JMP | LK | |||||||||
| LK1: | CALL | DIR | ||||||||
| CALL | DIR | |||||||||
| CALL | AllKey | ;调用判有无闭合键子程序 | ||||||||
| JNZ | LK2 | |||||||||
| CALL | DIR | |||||||||
| JMP | LK | |||||||||
| LK2: | MOV | BL,0FEH | ;R2 | |||||||
| MOV | BH,0 | ;R4 | ||||||||
| LK4: | MOV | DX,PB_8255 | ||||||||
| MOV | AL,BL | |||||||||
| OUT | DX,AL | |||||||||
| INC | DX | |||||||||
| IN | AL,DX | |||||||||
| TEST | AL,01H | |||||||||
| JNZ | LONE | |||||||||
| XOR | AL,AL | ;0行有键闭合 | ||||||||
| JMP | LKP | |||||||||
| LONE: | TEST | AL,02H | ||||||||
| JNZ | NEXT | |||||||||
| MOV | AL,08H | ;1行有键闭合 | ||||||||
| LKP: | ADD | BH,AL | ||||||||
| LK3: | CALL | DIR | ;判断释放否 | |||||||
| CALL | AllKey | |||||||||
| JNZ | LK3 | |||||||||
| MOV | AL,BH | ;键号->AL | ||||||||
| POP | DX | |||||||||
| POP | BX | |||||||||
| RET | ||||||||||
| NEXT: | INC | BH | ;列计数器加1 | |||||||
| TEST | BL,80H | |||||||||
| JZ | KND | ;判是否已扫到最后一列 | ||||||||
| ROL | BL,01H | |||||||||
| JMP | LK4 | |||||||||
| KND: | JMP | LK | ||||||||
| KEYI | ENDP | |||||||||
| AllKey | PROC | NEAR | ||||||||
| MOV | DX,PB_8255 | |||||||||
| XOR | AL,AL | |||||||||
| OUT | DX,AL | ;全"0"->扫描口 | ||||||||
| INC | DX | |||||||||
| IN | AL,DX | ;读键状态 | ||||||||
| NOT | AL | |||||||||
| AND | AL,03H | ;取低二位 | ||||||||
| RET | ||||||||||
| AllKey | ENDP | |||||||||
| END | START | |||||||||
(一)实验结果
运行程序,通过键盘输入76543210或13217277使之显示在数码管上,如图6.1、图6.2所示。8255工作在方式0,C口为输入口,用来采集信号。PB口为输出口,向键盘送入扫描信号。实验主程序中键盘扫描程序在执行时首先向PB口输入全低电平,然后通过C口采集KL0和KL1来粗判有无按键按下,若有按键按下,则进入细判程序来判断哪个按键按下,然后将键值送入缓冲器中并在LED灯上显示出相应的键值。键盘的细判程序中是向PB口中分行来输入低电平,然后通过分别测试KL0和KL1来具体判断是那个键按下。
图6.1
图6.2
(二)实验扩展及思考
1、显示程序中延时函数起什么作用
| 答:数码管的显示是不断刷新的,延时函数能使数码管显示的时间长一点,这样方能被人眼识别出来。 |
| 实验名称 | 实验七 8259A(2)中断(优先级)实验 | ||||||
| 姓 名 | 姓名 | 系院专业 | 你的专业 | 班 级 | 你的专业 13-5班 | 学 号 | |
| 实验日期 | 2015.6.28 | 指导教师 | 成 绩 | ||||
| 一、实验目的和要求 1、了解8259A的内部结构、工作原理;了解8259A与8086的接口逻辑;掌握对8259A的初始化编程方法,了解8086是如何响应中断、退出中断的;体会8259A的中断优先级处理方法。 | |||||||
| 二、实验内容(包括实验步骤和代码) (一)实验内容 1、编制程序:拨动单脉冲开关,“”送给8259A的IR0,“” 送给8259A的IR7,F5区的最左边数码管对应IR7中断:没有触发中断或中断处理完毕,显示“0”,正在响应中断,显示“1”;F5区的最右边数码管对应IR0中断:没有触发中断或中断处理完毕,显示“0”,正在响应中断,显示“1”,如果IR0中断IR7,显示“2” (二)实验步骤 1、连线说明: B3区:CS、A0 | —— | A3区:CS3、A0 | |||||
| B3区:INT、INTA | —— | A3区:INTR、INTA | |||||
| B3区:IR0 | —— | B2区:单脉冲 | |||||
| B3区:IR7 | —— | B2区:单脉冲 | |||||
| D3区:CS、A0、A1 | —— | A3区:CS1、A0、A1 | |||||
| D3区:PC0、PC1 | —— | F5区:KL1、KL2 | |||||
| D3区:JP20、B、C | —— | F5区:A、B、C | |||||
3、拨动单脉冲开关,“”送给8259A的IR0,“” 送给8259A的IR7,F5区的最左边数码管对应IR7中断:没有触发中断或中断处理完毕,显示“0”,正在响应中断,显示“1”;F5区的最右边数码管对应IR0中断:没有触发中断或中断处理完毕,显示“0”,正在响应中断,显示“1”,如果IR0中断IR7,显示“2”。
(三)实验代码
| .MODEL | TINY | ||||
| EXTRN | InitKeyDisplay:NEAR, Display8:NEAR | ||||
| IO8259_0 | EQU | 0250H | |||
| IO8259_1 | EQU | 0251H | |||
| .STACK | 100 | ||||
| .DATA | |||||
| BUFFER | DB | 8 DUP(?) | |||
| IRQ0_INT | DB | 0 | |||
| IRQ7_INT | DB | 0 | |||
| .CODE | |||||
| START: | MOV | AX,@DATA | |||
| MOV | DS,AX | ||||
| MOV | ES,AX | ||||
| NOP | |||||
| CALL | InitKeyDisplay | ;对键盘、数码管扫描控制器8255初始化 | |||
| MOV | IRQ0_INT,00H | ||||
| MOV | IRQ7_INT,00H | ||||
| CALL | Init8259 | ||||
| CALL | WriIntver | ||||
| CALL | LedDisplay | ||||
| STI | ;开中断 | ||||
| START1: | LEA | SI,Buffer | |||
| CALL | Display8 | ||||
| JMP | START1 | ||||
| LedDisplay | PROC | NEAR | |||
| PUSH | AX | ||||
| MOV | AL,IRQ0_INT | ||||
| OR | AL,IRQ0_INT | ||||
| JZ | LedDisplay1 | ||||
| ADD | AL,IRQ7_INT | ;如果CPU正在处理IR7,显示2 | |||
| LedDisplay1: | MOV | Buffer, AL | ;显示1或2,IR0在中断 | ||
| MOV | Buffer + 1,10H | ||||
| MOV | Buffer + 2,10H | ||||
| MOV | Buffer + 3,10H | ||||
| MOV | Buffer + 4,10H | ||||
| MOV | Buffer + 5,10H | ||||
| MOV | Buffer + 6,10H | ||||
| MOV | AL,IRQ7_INT | ||||
| MOV | Buffer + 7,AL | ;显示1,IR7在中断 | |||
| POP | AX | ||||
| RET | |||||
| LedDisplay | ENDP | ||||
| Init8259 | PROC | NEAR | |||
| MOV | DX,IO8259_0 | ||||
| MOV | AL,13H | ||||
| OUT | DX,AL | ||||
| MOV | DX,IO8259_1 | ||||
| MOV | AL,08H | ||||
| OUT | DX,AL | ||||
| MOV | AL,09H | ||||
| OUT | DX,AL | ||||
| MOV | AL,7EH | ||||
| OUT | DX,AL | ||||
| RET | |||||
| Init8259 | ENDP | ||||
| DELAY | PROC | NEAR | |||
| PUSH | SI | ||||
| PUSH | CX | ||||
| PUSH | AX | ||||
| MOV | CX,100 | ||||
| A3: | LEA | SI,BUFFER | |||
| CALL | DISPLAY8 | ||||
| LOOP | A3 | ||||
| POP | AX | ||||
| POP | CX | ||||
| POP | SI | ||||
| RET | |||||
| DELAY | ENDP | ||||
| IRQ0: | PUSH | DX | |||
| PUSH | AX | ||||
| INC | IRQ0_INT | ;显示1,IR0在中断 | |||
| CALL | LedDisplay | ||||
| STI | |||||
| CALL | DELAY | ||||
| DEC | IRQ0_INT | ;显示0,IR0中断处理完毕 | |||
| CALL | LedDisplay | ||||
| MOV | DX,IO8259_0 | ||||
| MOV | AL,20H | ||||
| OUT | DX,AL | ||||
| POP | AX | ||||
| POP | DX | ||||
| IRET | |||||
| IRQ7: | PUSH | DX | |||
| PUSH | AX | ||||
| INC | IRQ7_INT | ;显示1,IR7在中断 | |||
| CALL | LedDisplay | ||||
| STI | |||||
| CALL | DELAY | ||||
| DEC | IRQ7_INT | ;显示0,IR7中断处理完毕 | |||
| CALL | LedDisplay | ||||
| MOV | DX,IO8259_0 | ||||
| MOV | AL,20H | ||||
| OUT | DX,AL | ||||
| POP | AX | ||||
| POP | DX | ||||
| IRET | |||||
| WriIntver | PROC | NEAR | |||
| PUSH | ES | ||||
| MOV | AX,0 | ||||
| MOV | ES,AX | ||||
| MOV | DI,20H | ||||
| LEA | AX,IRQ0 | ||||
| STOSW | |||||
| MOV | AX,CS | ||||
| STOSW | |||||
| MOV | DI,20H+7*4 | ||||
| LEA | AX,IRQ7 | ||||
| STOSW | |||||
| MOV | AX,CS | ||||
| STOSW | |||||
| POP | ES | ||||
| RET | |||||
| WriIntver | ENDP | ||||
| END | START | ||||
(一)实验结果
F5区的最左边数码管对应IR7中断:没有触发中断或中断处理完毕,显示“0”(如图7.1),正在响应中断,显示“1”(如图7.2);F5区的最右边数码管对应IR0中断:没有触发中断或中断处理完毕,显示“0”(如图7.1),正在响应中断,显示“1”(如图7.3),如果IR0中断IR7,显示“2”(如图7.4)。
图7.1
图7.2
图7.3
| 图7.4 |
