北邮微原硬件实验
北邮 电子科学与技术 ASIC专业实验 实验报告

指导老师:刘雯
电子工程学院
ASIC 专业实验
实验报告
班 级:2012211205 姓 名:翁雪妍 学 号:2012210961 指导老师:刘雯
ASIC 专业实验
指导老师:刘雯
一、课程任务
1.完整完成一个 CPU 芯片的功能设计并通过验证(包括前端逻辑设计和仿真),主要对应课 程的 LAB 1 – LAB 8 部分 2.熟悉综合的过程,并验证综合后的电路(逻辑综合) 3.对关键部件进行布局布线(版图设计)
end 3'b011://3
begin {sel,rd,ld_ir,inc_pc,halt,ld_pc,data_e,ld_ac,wr}<=9'b1_1_1_0_0_0_0_0_0;
end 3'b100://4
begin {sel,rd,ld_ir,inc_pc,halt,ld_pc,data_e,ld_ac,wr}<=9'b1_1_1_0_0_0_0_0_0;
end 3'b101://5
begin {sel,rd,ld_ir,inc_pc,ld_pc,data_e,ld_ac,wr}<=8'b0_0_0_1_0_0_0_0; halt<=opcode==`HLT;
end 3'b110://6
begin {sel,ld_ir,inc_pc,halt,ld_pc,data_e,ld_ac,wr}<=8'b0_0_0_0_0_0_0_0; rd<=alu_op;
总的来说,我们完成的是 Top-down 自顶向下的 CPU 设计,一个基本的 CPU 要包括三部 分功能:数据存储、数据运算和控制部分。与之相对应的硬件结构也分为三部分:存储器、 数据通路和控制器。
北邮微机原理与接口技术硬件实验报告

微原硬件实验报告班级:07118 班学号:070547班内序号:26姓名:杨帆实验一熟悉实验环境及IO的使用一,实验目的1. 通过实验了解和熟悉实验台的结构,功能及使用方法。
2. 通过实验掌握直接使用Debug 的I、O 命令来读写IO 端口。
3. 学会Debug 的使用及编写汇编程序二,实验内容1. 学习使用Debug 命令,并用I、O 命令直接对端口进行读写操作,2.用汇编语言编写跑马灯程序。
(使用EDIT 编辑工具)实现功能A.通过读入端口状态(ON 为低电平),选择工作模式(灯的闪烁方式、速度等)。
B.通过输出端口控制灯的工作状态(低电平灯亮)三,实验步骤1.实验板的IO 端口地址为EEE0H在Debug 下,I 是读命令。
(即读输入端口的状态---拨码开关的状态)O 是写命令。
(即向端口输出数据---通过发光管来查看)进入Debug 后,读端口拨动实验台上八位拨码开关输入I 端口地址回车屏幕显示xx 表示从端口读出的内容,即八位开关的状态ON 是0,OFF 是 1 写端口输入O 端口地址xx (xx 表示要向端口输出的内容)回车查看实验台上的发光二极管状态,0 是灯亮,1 是灯灭。
2. 在Debug 环境下,用a 命令录入程序,用g 命令运行C>Debug -amov dx, 端口地址mov al,输出内容out dx, almov ah, 0bhint 21hor al, aljz 0100int 20h-g运行查看结果,修改输出内容再运行查看结果分析mov ah, 0bhint 21hor al, aljz 0100int 20h该段程序的作用3.利用EDIT 工具编写汇编写跑马灯程序程序实现功能A.通过读入端口状态(ON 为低电平),选择工作模式(灯的闪烁方式、速度等)。
B.通过输出端口控制灯的工作状态(低电平灯亮) C>EDIT 文件名.asm录入程序按Alt 键打开菜单进行存盘或退出编译文件C>MASM 文件名.asm连接文件C>LINK 文件名.obj运行文件或用Debug 进行调试。
(完整版)北邮电子院专业实验报告

电子工程学院ASIC专业实验报告班级:姓名:学号:班内序号:第一局部语言级仿真LAB1:简单的组合逻辑设计一、实验目的掌握根本组合逻辑电路的实现方法。
二、实验原理本实验中描述的是一个可综合的二选一开关,它的功能是当sel=0否那么给出结果out=b。
在Verilog HDL 中,描述组合逻辑时常使用时,给出out=a,assign结构。
equal=(a==b)?1:0是一种在组合逻辑实现分支判断时常用的格式。
parameter定义的参数决定位宽。
测试模块用于检测模块设计的是否正确,它给出模块的输入信号,模块的内部信号和输出信号。
size观察三、源代码mux.vmodulescale_mux(out,sel,b,a);parametersize=1;output[size-1:0]out;input[size-1:0]b,a;inputsel;assignout=(!sel)?a:(sel)?b:{size{1'bx}};endmodulemux_test.v`definewidth8`timescale1ns/1nsmodulemux_test;reg[`width:1]a,b;wire[`width:1]out;regsel;scale_mux#(`width)m1(.out(out),.sel(sel),.b(b),.a(a)); initialbegin$monitor($stime,,"sel=%ba=%bb=%bout=%b",sel,a,b,out); $dumpvars(2,mux_test);sel=0;b={`width{1'b0}};a={`width{1'b1}};#5sel=0;b={`width{1'b1}};a={`width{1'b0}};#5sel=1;b={`width{1'b0}};a={`width{1'b1}};#5sel=1;b={`width{1'b1}};a={`width{1'b0}};#5$finish;endendmodule四、仿真结果与波形LAB2:简单时序逻辑电路的设计一、实验目的掌握根本时序逻辑电路的实现。
北邮研究生嵌入式系统实验课程——第4-2节 VxWorks任务间通信

创建信号量
SEM_ID semBCreate( options, initialState)
– Options 为阻塞在该信号量的任务规定排队的类 型(SEM_Q_PRIORTY或SEM_Q_FIFO) – initialState 初始化信号量为可用(SEM_FULL)或 不可用(SEM_EMPTY)
VxWorks提供三种类型的信号量
–二进制信号量:最快和常用的信号量,提供阻塞方式,用 于实现同步或互斥 –互斥信号量:用于实现互斥问题的特殊的二进制信号量, 解决具有互斥、优先级继承、删除安全和递归等情况 –计数信号量:类似于二进制信号量,记录信号量被释放的 次数。适合于一个资源的多个实例需要保护的情况
LOCAL SEM_ID fooBinSemId, fooMutexId; LOCAL FOO_BUF fooBuffer; fooSet(); 互斥信号量 … 共享内存 fooGet(); …
链表
lstLib库提供对双向链表进行操作的函数
List Descriptor Header Tail User node1 User node2 NODE
任务锁的使用
taskLock()/taskUnlock()
– 禁止所有其它任务执行 – 当非常频繁地做某事时使用 – 注意要保持critical region短
funcA () {
taskLock (); . . /* critical region of code that cannot be interrupted */ . taskUnlock ();
等待事件的任务调用semTake(),并一直阻塞 到得到信号量 检测到事件的任务或中断调用semGive();解锁 了等待事件的任务
北邮研究生嵌入式系统实验课程——第4-4节 VxWorks网络编程

VxWorks网络组件
basic network initialization components: 基本的网络初始化组件
– VxWorks基本网络支持 – 网络设备的启动
network devices:网络设备
– 网络设备的类型
networking protocols:网络协议
– TCP/IP组件 – 应用及路由协议
2
1、网络基础
OSI七层协议 TCP/IP协议 路由 Internet Protocol(IP)
– 数据报(Datagram)通信协议 – 是一种尽力而为业务(Best-effort ) 数据丢失(Loss) 重新排序(Reordering) 数据重复(Duplication) 延时(Delay) – 主机到主机的数据传送
Block until connection established
Socket() Connect()
Connection establishment
send()
Communication message (request)
recv()
Process request
send()
Communication message (reply)
传输协议(Transport Protocols)
用户数据报协议( User Datagram Protocol (UDP))
– 对数据进行校验 – 仍然是尽力而为的服务
传输控制协议(Transmission Control Protocol (TCP))
– 对数据进行校验 – 可靠的字节流传送 – 流量和拥塞控制
3
IP地址
32-bit的识别符 (IPv4, IPv6=128 bits) 点分方式的四个十进制数来表示: 192.118.56.25 -> 167.208.101.28
北邮通原硬件实验报告材料

信息与通信工程学院通信原理硬件实验报告指导教师:实验日期:实验一双边带抑制载波调幅(DSB-SC AM)一、实验目的1) 了解DSB-SC AM信号的产生及相干解调的原理和实现方法。
2) 了解DSB-SC AM的信号波形及振幅频谱的特点,并掌握其测量方法。
3) 了解在发送DSB-SC AM信号加导频分量的条件下,收端用锁相环提取载波的原理及实现方法。
4) 掌握锁相环的同步带和捕捉带的测量方法,掌握锁相环提取载波调试方法。
二、实验内容及步骤1. DSB-SC AM 信号的产生1) 按照指导书图示,连接实验模块。
2) 示波器观察音频振荡器输出调制信号m(t),调整频率10kHz03) 示波器观察主振荡器输出信号波形和频率;观察乘法器输出,注意相位翻转。
4) 测量已调信号的振幅频谱,调整加法器的G和g,使导频信号的振幅频谱的幅度为已调信号的编带频谱幅度的0.8倍。
2、DSB-SC AM 信号的相干解调及载波提取1) 调试锁相环a) 单独测试VCO的性能 Vin暂不接输入,调节f0旋钮,改变中心频率,频率范围约为 70~130kHz。
V in接直流电压,调节中心频率100kHz-2~2V变化,观察VCO 线性工作范围;由GAIN调节VCO灵敏度,使直流电压变化正负1V时VCO频偏为10kHzb) 单独测试相乘和低通滤波工作是否正常。
锁相环开环,LPF输出接示波器。
两VCO经过混频之后由LPF输出,输出信号为差拍信号。
c) 测试同步带和捕捉带:锁相环闭环,输出接示波器,直流耦合。
将信号源VCO的频率f0调节到比100kHz小很多的频率,使锁相环失锁,输出为交变波形。
调节信号源VCO频率缓慢升高,当波形由交流变直流时说明VCO锁定,记录频率f2=96.8kHz,继续升高频率,当直流突变为交流时再次失锁,记录频率 f4=115.6kHz。
缓慢降低输入VCO频率,记录同步时频率f3=106.9kHz和再次失锁时频率f1=90.7kHz。
北邮 嵌入式 实验报告

北邮嵌入式实验报告北邮嵌入式实验报告一、引言嵌入式系统是将计算机技术与其他工程领域相结合的一种综合应用技术,广泛应用于各个领域。
本实验旨在通过对北邮嵌入式系统的学习与实践,深入了解嵌入式系统的原理和应用。
二、实验背景北邮嵌入式实验是计算机科学与技术专业的一门重要实践课程。
通过该实验,学生可以掌握嵌入式系统的基本原理、设计方法和调试技巧,提高对计算机硬件和软件的综合应用能力。
三、实验内容1. 硬件平台本实验使用的硬件平台为北邮嵌入式系统开发板,该开发板集成了ARM Cortex-M3内核的处理器,具有丰富的外设接口和扩展能力。
2. 软件开发环境本实验使用的软件开发环境包括Keil MDK-ARM集成开发环境和ST-Link调试工具。
Keil MDK-ARM提供了一套完整的软件开发工具链,包括编译器、汇编器、链接器和调试器等,方便学生进行嵌入式软件的开发和调试工作。
3. 实验任务本实验主要包括以下几个任务:(1) 学习嵌入式系统的基本原理和架构,了解处理器的工作原理和寄存器的使用方法。
(2) 学习嵌入式软件开发的基本流程,包括编译、烧写和调试。
(3) 编写简单的嵌入式应用程序,实现对外设的控制和数据处理功能。
(4) 调试和测试嵌入式应用程序,验证程序的正确性和稳定性。
四、实验过程1. 学习嵌入式系统的基本原理和架构在实验开始前,我们首先学习了嵌入式系统的基本原理和架构。
了解了处理器的工作原理,包括指令执行过程、寄存器的使用方法等。
同时,我们还了解了嵌入式系统的外设接口和扩展能力,为后续的实验任务做好准备。
2. 学习嵌入式软件开发的基本流程在掌握了嵌入式系统的基本原理后,我们开始学习嵌入式软件开发的基本流程。
首先,我们安装了Keil MDK-ARM集成开发环境,并配置了相应的编译器和调试器。
然后,我们学习了嵌入式软件的编译、烧写和调试方法,掌握了如何将编写的程序烧写到开发板上,并通过调试工具进行程序的调试和测试。
北邮计算机系统结构-WINDLX模拟器实验 报告

实验报告学院:计算机学院课程名称:计算机系统结构实验名称:WINDLX模拟器实验班级:姓名:学号:实验一 WINDLX模拟器安装及使用略实验二指令流水线相关性分析一.实验类别验证实验二.实验目的通过使用WINDLX模拟器,对程序中的三种相关现象进行观察,并对使用专用通路,增加运算部件等技术对性能的影响进行考察,加深对流水线和RISC处理器的特点的理解。
三.实验环境Windows XP操作系统WinDLX模拟器四.实验原理指令流水线中主要有结构相关、数据相关、控制相关。
相关影响流水线性能。
(1)数据相关定义:原有先后顺序的两条指令(I1,I2)在对共享变量(位置)进行读、写时,指令流水线中实际完成的读、写顺序与原有顺序不一致,导致流水线输出错误。
三类数据相关:写读(WR)相关读写(RW)相关写写(WW)相关解决方法技术:1. 使某些流水线指令延迟、停顿一或多个周期。
2. 双端口存储器:如果指令和数据放在同一个存储器。
3. 设置两个存储器:一个数据存储,一个为指令存储器。
4. 软件优化编译:通过指令重新排序,消除数据相关。
5. 定向技术:又称旁路技术或专用通路技术,是使后续指令提前得到前指令的运算结果(适合ALU类指令)(2)结构相关定义:如果某指令在流水线重叠执行过程中,硬件资源满足不了指令重叠执行的要求,会产生资源冲突或竞争,称为流水线结构相关解决方法技术:1. 延迟技术:使某些指令延迟、停顿一或多个时钟周期2. 双端口存储器:允许同时读两个数据或指令3. 设置双存储器(哈弗结构):一个数据存储,一个指令存储。
4软件优化编译:通过指令重新排序消除结构相关。
(3)控制相关定义:控制相关是指因程序执行转移类指令而引起的冲突相关。
包括无条件转移、条件转移、子程序调用、中断等,它们属于分支指令,执行中可能改变程序方向,造成流水线断流。
解决方法技术:1、静态分支技术静态转移预测技术(猜测法) ;延迟转移;提前形成条件码,生成转移目标地址;改进循环程序;2、动态分支预测技术转移历史表BHT;转移目标缓冲栈(BTB);转移目标指令缓冲栈BTIB;五.实验步骤(1)观察程序中出现的数据/控制/结构相关。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
信息与通信工程学院微原硬件实验报告姓名:班级:学号:班内序号:【一.基本的I/O实验】实验一 I/O地址译码一、实验目的掌握I/O地址译码电路的工作原理。
二、实验原理和内容1、实验电路如图1-1所示,其中74LS74为D触发器,可直接使用实验台上数字电路实验区的D触发器,74LS138为地址译码器。
译码输出端Y0~Y7在实验台上“I/O地址“输出端引出,每个输出端包含8个地址,Y0:280H~287H,Y1:288H~28FH,……当CPU执行I/O指令且地址在280H~2BFH范围内,译码器选中,必有一根译码线输出负脉冲。
例如:执行下面两条指令MOV DX,2A0HOUT DX,AL(或IN AL,DX)Y4输出一个负脉冲,执行下面两条指令MOV DX,2A8HOUT DX,AL(或IN AL,DX)Y5输出一个负脉冲。
图1-1利用这个负脉冲控制L7闪烁发光(亮、灭、亮、灭、……),时间间隔通过软件延时实现。
2、接线: Y4/IO地址接 CLK/D触发器Y5/IO地址接 CD/D触发器D/D触发器接 SD/D角发器接 +5VQ/D触发器接 L7(LED灯)或逻辑笔三、硬件接线图及软件程序流程图1.硬件接线图2.软件程序流程图四、源程序DATA SEGMENTDATA ENDSSTACK SEGMENT STACK 'STACK'DB 100H DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK ;基本框架;延时子程序DELAY1 PROC NEARMOV BX,500HPUSH CXLOOP2: MOV CX,0FFFHWAIT1: LOOP WAIT1DEC BXJNZ LOOP2POP CXRETDELAY1 ENDPSTART: MOV CX,0FFFFH ;L7闪烁控制LOOP1: MOV DX,2A0H ;灯亮OUT DX,ALCALL DELAY1MOV DX,2A8H ;灯灭OUT DX,ALCALL DELAY1LOOP LOOP1 ;循环闪烁CODE ENDSEND START五、实验结果灯L7闪烁实验二简单并行接口一、实验目的掌握简单并行接口的工作原理及使用方法。
(选择273进行实验)二、实验原理和内容1、按下面图1-2简单并行输出接口电路图连接线路(74LS273插通用插座,74LS32用实验台上的“或门”)。
74LS273为八D触发器,8个D输入端分别接数据总线D0~D7,8个Q输出端接LED显示电路L0~L7。
2、编程从键盘输入一个字符或数字,将其ASCⅡ码通过这个输出接口输出,根据8个发光二极管发光情况验证正确性。
3、接线:按图1-2-1接线(图中虚线为实验所需接线,74LS32为实验台逻辑或门)图1-2三、硬件接线图及软件程序流程图1.硬件接线图2.软件程序流程图四、源程序DATA SEGMENTDATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK ;基本框架START: MOV AH,1 ;键盘输入INT 21HCMP AL,27 ;判断是否为ESC键JZ EXITMOV DX,2A8HOUT DX,AL ;输出JMP STARTEXIT: MOV DX,2A8H ;返回DOSMOV AL,0OUT DX,AL ;所有灯灭MOV AX,4C00HINT 21HCODE ENDSEND START五、实验结果8个灯代表8位ASCII码,灯亮代表‘1’,灯灭代表‘0’。
当从键盘输入字母或字符时,8个灯显示与输入对应的ASCII码,按下ESC键则所有灯灭。
六、实验总结接线时注意各个端口名称不要接错,接线完成之后可以用HQFC中的演示实验验证接线是否正确。
实验一中需要加入合理的延时子程序来实现灯的亮灭交替。
七、实验收获与心得体会第一次微原硬件实验在参考讲义和询问老师的情况下了解到了基础的硬件试验箱操作方法,学会了通过电脑软件编写控制试验箱的简单步骤以及相关注意事项。
【二.可编程并行接口8255实验】实验三可编程并行接口8255实验四七段数码管一、实验目的实验三:通过实验,掌握8255工作于方式0以及设置A口为输出口,C 口为输入口的方法。
实验四:掌握数码管显示数字的原理。
二、实验原理和内容实验三:1、实验电路如图2-1,8255C口接逻辑电平开关K0~K7,A口接LED显示电路L0~L7。
2、编程从8255C口输入数据,再从A口输出。
图2-1实验四:静态显示:按图2-2连接好电路,将8255的A口PA0~PA7分别与七段数码管的段码驱动输入端a~dp相连,位码驱动输入端S0、S1 、S2、S3接PC0、PC1、PC2、PC3,编程在数码管显示学号的后四位0210。
三、硬件接线图及软件程序流程图1.硬件接线图实验三实验四2.软件程序流程图实验三实验四四、源程序(仅实验三代码)DATA SEGMENTDATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK ;基本框架START: MOV AX,DATAMOV DS,AXMOV DX,283H ;8255控制寄存器端口地址283H MOV AL,B ;工作方式为0OUT DX,AL ;初始化8255DIGITAL: MOV DX,28AH ;熄灭数码管MOV AL,00HOUT DX,ALMOV DX,288H ;A口显示0MOV AL,3FHOUT DX,ALMOV DX,28AH ;C口00000001(位码)MOV AL,01HOUT DX,ALMOV DX,28AH ;熄灭数码管MOV AL,00HOUT DX,ALMOV DX,288H ;A口显示2MOV AL,06HOUT DX,ALMOV DX,28AH ;C口00000010(位码)MOV AL,02HOUT DX,ALMOV DX,28AH ;熄灭数码管MOV AL,00HOUT DX,ALMOV DX,288H ;A口显示1MOV AL,5BHOUT DX,ALMOV DX,28AHMOV AL,04H ;C口00000100(位码)OUT DX,ALMOV DX,28AH ;熄灭数码管MOV AL,00HOUT DX,ALMOV DX,288H ;A口显示0MOV AL,3FHOUT DX,ALMOV DX,28AHMOV AL,08H ;C口00001000(位码)OUT DX,ALMOV DX,28AH ;熄灭数码管MOV AL,00HOUT DX,ALMOV AH,01HINT 16HJNZ EXIT ;有键盘输入,退出JMP DIGITALEXIT: MOV AX,4C00HINT 21HCODE ENDSEND START五、实验结果数码管显示了学号的后四位“0210”如图所示。
当键盘有按键输入时退出,数码管灭。
六、实验总结本次实验中控制数码管显示的主要有两个端口,A口和C口,C口控制哪一路数码管亮,A口控制一路数码管亮什么数字;工作方式的选择如下图所示,D7=1表示控制寄存器中存放的是工作方式选择字,工作在方式0,A、C均为输出,B口不使用,故AL为B或B均可。
七、实验收获与心得体会初步了解可编程并行接口8255的简单应用;在实验三中8255的工作方式选择字非常重要,要弄清A、C口为输入还是输出,其次在代码中设计按键退出模块,可以使得运行更加可靠。
学习了控制数码管显示的方法,即通过两路控制,一路负责扫描决定哪一路显示,一路负责决定显示什么数字。
这种思路与数电实验中VHDL语言控制数码管有异曲同工之处,让我体会到了编程思想的相同之处。
【三.可编程定时器/计数8253实验】实验八可编程定时器/计数器(8253/8254)一、实验目的学习掌握8253用作定时器的编程原理;二、实验原理和内容1.完成一个音乐发生器,通过喇叭或蜂鸣器放出音乐,并在数码管上显示乐谱。
2.扩展部分:利用小键盘实现弹琴功能,并显示弹奏的乐谱。
注意:8253输入频率应小于2MHz。
三、硬件接线图及软件程序流程图1.硬件接线图2.软件程序流程图四、源程序DATA SEGMENTFENPIN DW 0001H,3906,3472,3125,2932,2604,2344,2083,1953;分频比DIGITAL DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH;数码管MUSIC DB 0,3,2,1,2,3,3,3,0,2,2,2,0,3,5,5,0,3,2,1,2,3,3,3,1,2,2,3,2,1,0,5,0,1,0 ;存放播放的乐曲音符NUM DB 00H,070H,0B0H,0D0H,0E0H ;检测键盘输入(00h=00000000;070h=01110000;0b0h=;0d0h=;0e0h=)DATA ENDSSTACK SEGMENT STACK 'STACK'DB 100 DUP(?)STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK;延时子程序1DELAY PROC NEARPUSH CXMOV CX,100HWAIT0: LOOP WAIT0POP CXRETDELAY ENDP;延时子程序2DELAY1 PROC NEARPUSH CXMOV CX,0FFFFHWAIT1: LOOP WAIT1POP CXRETDELAY1 ENDP;获取键盘输入值的子程序KEY PROC NEARPUSH AX ;保护现场PUSH CXPUSH DXMOV CX,00H ;从第一行开始扫描CHECK: MOV DX,28AH ;C口地址给DXMOV BX,OFFSET NUMADD BX,CXMOV AL,[BX]OUT DX,AL;防抖IN AL,DX ;判断是否有键盘按下MOV AH,ALCALL DELAYIN AL,DXCMP AL,AHJNZ CHECK ;不相等说明为抖动,重新检测;判断按下的列AND AL,0FHCMP AL,0FHJZ NEXTCMP AL,0EHJZ NEXT1CMP AL,0DHJZ NEXT2CMP AL,0BHJZ NEXT3MOV BX,01HJMP GOTNEXT: INC CXCMP CX,05HJNZ JUMP1MOV CX,01H ;修改变量扫描下一行JUMP1: JMP CHECKNEXT1: MOV BX,04HJMP GOTNEXT2: MOV BX,03HJMP GOTNEXT3: MOV BX,02H;计算按下键盘的数值GOT: SUB CX,01HMOV AL,CLMOV DL,04HMUL DLADD BL,ALSUB BL,01H ;此时BX中所存即为对应的偏移量 POP DX ;恢复现场POP CXPOP AXRETKEY ENDP;主程序START: MOV AX,DATAMOV DS,AX;8253初始化MOV DX,283HMOV AL,36HOUT DX,AL;8255初始化MOV DX,28BHMOV AL,81H ;C口输入OUT DX,ALMOV DX,289H ;B口位选数码管MOV AL,01HOUT DX,AL;扫描键盘LOOP1: CALL KEYCMP BX,0 ;按0播放音乐JZ PLAY0CMP BX,9 ;按9退出JZ EXIT;按1~8发出对应音MOV CX,BXMOV BX,OFFSET DIGITAL ;数码管显示音符 ADD BX,CXMOV AL,[BX]MOV DX,288H ;A口输出OUT DX,AL;播放该音符MOV BX,OFFSET FENPINMOV AX,CXADD AX,AXADD BX,AX;计数,先低八位后高八位MOV AX,[BX]MOV DX,280HOUT DX,ALMOV AL,AHOUT DX,ALCALL DELAY1CALL DELAY1MOV DX,28AH ;C口输入IN AL,DX;检测键盘是否弹起MOV AH,ALLOOP2: CALL DELAYIN AL,DXCMP AL,AHJZ LOOP2;初始化8253,停止播放音乐MOV AX,0HMOV DX,283HMOV AL,36HOUT DX,ALJMP LOOP1;播放音乐PLAY0: MOV CX,01HPLAY: PUSH CX;读取音符,存于CX中MOV BX,OFFSET MUSICADD BX,CXMOV AL,[BX]MOV CL,ALMOV CH,0H;数码管显示MOV BX,OFFSET DIGITALADD BX,CXMOV AL,[BX]MOV DX,288HOUT DX,AL;播放该乐符MOV BX,OFFSET FENPINMOV AX,CXADD AX,AXADD BX,AX;计数,先低八位后高八位MOV AX,[BX]MOV DX,280HOUT DX,ALMOV AL,AHOUT DX,ALPOP CX;延时,持续播放MOV AX,90HLOOP3: CALL DELAY1DEC AXJNZ LOOP3;乐曲未结束时,CX加1INC CXCMP CX,28H;共40个音符JNZ JUMJMP LOOP1JUM: JMP PLAYEXIT: MOV AL,0MOV DX,288HOUT DX,ALMOV AX,4C00HINT 21HCODE ENDSEND START五、实验结果1.按小键盘的0,播放预置音乐,数码管显示音符对应的数字1~8;2.按小键盘的1~8,分别发出do,re,mi,fa,so,la,si,高音do,数码管显示按下的音符对应的1~8数字;3.按小键盘的9,数码管熄灭,放音停止,返回dos;六、实验总结1.在开始用MUSIC存乐谱实现了代码的多用性,可以直接在开头改变对应数字来实现不同乐曲的演奏;2.开头用DIGITAL存数码管需要显示的0~8数字,数码管显示原理参考实验三和四,不同点在于8255中C口为输入,B口位选数码管仅第一路亮;3.实验难点主要在小键盘与数码管,8254的连接控制。