汇编语言-多功能密码锁

更新时间:2024-06-18 01:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

自动化科学与工程学院

《微机原理与应用》课程设计报告

多功能密码锁的设计

专业: 自动化科学与工程学院 班级: 09级(4)班 姓名:

学号: 200930614012 序号: 12号 指导老师: 杜娟 提交日期: 2012-1-13

报告评分 评阅老师 1

目录

一、目的············································3 二、内容············································3 三、设计任务········································3 四、方案选择及原理··································3 五、所用器件········································3 主要器件简介·····································4 六、原理图··········································7 1、8086与8255A连接·····························7 2、 8255A的A口、C口与矩阵键盘连接··············7 3、8255A的A口、B口与数码管的连接···············7 4、8086与8253连接······························8 5、完整电路图····································9 七、软件设计思路···································10 八、流程图·········································11 1、主程序·······································11 2、子程序·······································12 九、程序代码·······································14 十、设计中的难点···································23 十一、收获及体会···································24 十二、参考文献·····································25

2

多功能密码锁

一、目的

1、 了解和掌握8086、8255及8253,等接口芯片以及LED显示器的原理和功能; 2、 能用这些接口芯片构建一个简单的系统控制对象, 3、 掌握接口电路的综合设计与使用; 4、 通过自己动手,进一步了解计算机得工作原理,接口技术,提高计算机硬件,

软件综合应用能力,即对微机原理,接口技术,汇编语言程序设计进行综合训练。

二、内容

密码锁在输入密码正确的条件下输出开锁电平,控制电控锁开启,同

显示00字样。当输入密码错误时,发出错误警告声音,同时显示FF字样。当六次误码输入的条件下,产生报警电平报警。还可以实现对密码的修改,修改成功后,蜂鸣器发出确认音。

三、设计任务

1、选用8086和适当的存储器及接口芯片完成相应的功能。 2、用LED显示器显示电子锁的当前状态。 3、画出详细的硬件连接图。

4、给出程序设计思路、画出软件流程图。 5、给出地址分配表。

6、给出所有程序清单并加上必要注释。

7、完成设计说明书(列出参考文献,所用器件型号)。

四、方案选择及原理

这次的设计要求是在密码输入正确时输出开锁电平和显示“00”,密码错误时显示“FF”和蜂鸣器发出报警声音等,我们采用8255A的A口低四位和C口的低三位组成4x3的矩阵键盘,同时A口的低六位为选管;B口作为显示器的输出;C口高四位的PC4口输出开锁电平,对于6次密码错误输入,PC5口输出报警电平。用8253计数器产生警告音和确认音。用蜂鸣器发声次数来区分确认和警告声音,一声表示确认,三声表示警告。采用Proteus自带的键盘元件

KEYPAD-PHONE,0-9为数字键,#为确认/返回键和*为密码修改键,每次对键盘扫描,获得对应的键值。

五、所用器件

CPU8086、并行接口8255A、地址锁存器74LS273、4 线-16 线译码器

74HCT154、石英晶振,可编程定时/计数器8253、共阴极数码管、各类逻辑门、蜂鸣器,电阻、键盘等。

3

主要器件简介

CPU8086

8086是Inter系列的16位微处理器,芯片上有2.9万个晶体管,采用 HMOS工 艺制造,用单一的+5V电源,时钟频率为5MHz~10MHz。 8086有16根数据线和20根地址线,它既能处理16位数据,也能处理8位数据。可 寻址的内存空间为1MB。

并行接口8255

4

Intel 8086/8088 系列的可编程外设接口电路(Programmable Peripheral Interface)简称 PPI,型号为8255(改进型为8255A及8255A-5),具有24条输入/输出引脚、可编程的通用并行输入/输出接口电路。它是一片使用单一+5V电源的40脚双列直插式大规模集成电路。8255A的通用性强,使用灵活,通过它CPU可直接与外设相连接。

可编程定时/计数器8253

8253可编程定时器/计数器是8086微机系统常用的定时/计数器芯片,它具有定时与计数两大功能。8253可编程定时器/计数器具有3个独立的16位计数器通过编程可选择六种工作方式 ,可选择二进制或十进制计数,最高计数速率可达2.6MHz。所有的输入、输出电平都与TTL兼容。

地址锁存器74LS273

5

地址锁存器74LS273是带清除端的八D触发器,只有清除端为高电平时才具有锁存功能,锁存控制端为11脚CLK,在上升沿锁存。8086的ALE端输出的锁存控制信号必须经反相器后才能连到74LS273的CLK端,以满足CLK在上升沿锁存的要求。

4 线-16 线译码器74HCT154

74HCT154 为4 线-16 线译码器,将4 个二进制编码输入译成16 个彼独立的输出

之一,并能将数据从一个输入线分配到16 个输出的任意一个而实现解调功能,与大部分TTL 和DTL 电路完全兼容。其工作原理如下:这种单片4 线—16 线译码器非常适合用于高性能存储器的译码器。当两个选通输入G1 和G2 为低时,它可将4 个二进制编码的输入译成16 个互相独立的输出之一。实现解调功能的办法是:用4 个输入线写出输出线的地址,使得在一个选通输入为低时数据通过另一个选通输入。当任何一个选通输入是高时,所有输出都为高。

6

六、原理图

1、8086和8255A连接

8255A地址分配:PA:200H PB:202H PC:204H 控制寄存器:206H

为了满足8255A的四个端口地址必须为偶地址这一要求,将8255A的A1、A0分别与8086系统地址总线的A2、A1相连,并且,CPU在对8255A的端口进行访问时,总是将地址中的A0设置为0。

2、8255A的A口、C口与矩阵键盘连接

7

键盘元件KEYPAD-PHONE,0-9为数字键,#为确认/返回键和*为密码修改键。 数字键1-9的键值为相应的数值,数字键0的键值为0BH,功能键*的键值为0AH,能键#的键值为0CH。

3、8255A的A口、B口与数码管的连接

8255A的B口输出数码管的段码,A口输出数码管的位码。

4、8086与8253连接

8

8253地址分配:计数器0:400H 计数器1:402H 计数器2:404H控制寄存器:406H 为了满足8255A的四个端口地址必须为偶地址这一要求,将8255A的A1、A0分别与8086系统地址总线的A2、A1相连,并且,CPU在对8255A的端口进行访问时,总是将地址中的A0设置为0。

5、 完整电路图

9

七、软件设计思路

整个硬件设计,主要采用器件CPU8086、并行接口8255和可编程定时/计数器8253。由并行接口8255控制键盘扫描、数码管显示、开锁电平以及报警电平,8255的工作方式是A口输出,B口输出,C口高四位输出,C口低四位输入。通过键盘扫描获得对应的键值,通过对键值判断,判断按键是功能键或数字键,达到输入密码,修改密码,确认输入,返回等功能。由可编程定时/计数器8253产生方波,控制蜂鸣器产生“滴”声。8253工作在计数器0方式3,产生方波,通过延时,是蜂鸣器产生“滴”。8253在每次调用发声子程序中初始化。

根据条件要求,程序首先需要实现的是输入密码。为了区别输入密码和修改密码,当数码管显示都显示“—”,是输入密码。当数码管全灭时,是修改密码。当密码输入完且按下确认键,则输入数字与密码比对。密码正确,则输出开锁电平(高电平有效)。在此时,则可以通过功能键修改密码,密码修改成功发出“滴”声。若不需要,按返回键返回。若密码错误,则发出三声“滴”声,密码错误次数加1,并判断是否已经输入六次错误,是则输出报警电平(高电平有效),并置密码错误次数置0,等待返回键返回;否则等待返回按键返回。

为了实现上述程序,首先要初始化8086、8255,接着进入键盘扫描。每次有按键输入后,还应判断按键是否弹起,可以实现键盘消抖。无论密码正确与否,均需要通过返回键才能返回,所以每次显示完后都要对键盘扫描,判断是否按下返回键,有则退出键盘扫描,没有则继续扫描。开锁电平以及报警电平均在返回时置低电平。

10

八、流程图

主程序流程图

否 是否按下确初始化8255 开始 初始化8086 输入密码 认键?

密码比对子程序 闭锁子程序

密 码 是 否 否 正

确? 是

开锁子程序 结束 11

修改密码子程序流程图 开锁子程序流程图

开始 键盘扫描 存入密码空间

保存键值 是 否 按 否 下确认 键?

是 调用发声子程序

结束

开始 输出开锁电平,显示“00” 键盘扫描 是 返回键是否按下? 否 否 修改键是否按下? 是 调用修改密码子程序 关开锁电平 结束 12

闭锁子程序流程图是 开始 显示“FF” 发出警告音

密码错误次数增1

是 否 已 达 到 六 否 次错误?

是 输出报警电平 密码错误次数置0 按键扫描

返回按键是否按

下? 是 结束

13

九、程序代码

IOY0 EQU 0200H ;8255片选端口始地址 MY8255_A EQU IOY0+00H*2 ;8255的A口地址 MY8255_B EQU IOY0+01H*2 ;8255的B口地址 MY8255_C EQU IOY0+02H*2 ;8255的C口地址

MY8255_MODE EQU IOY0+03H*2 ;8255的控制寄存器地址 IOY1 EQU 0400H ;8253片选端口始地址 MY8253_COUNT0 EQU IOY1+00H*2 ;8253计数器0端口地址 MY8253_COUNT1 EQU IOY1+01H*2 ;8253计数器1端口地址 MY8253_COUNT2 EQU IOY1+02H*2 ;8253计数器2端口地址 MY8253_MODE EQU IOY1+03H*2 ;8253控制寄存器端口地址

DATA SEGMENT

COUNT1 DB 00H

COUNT2 DB 00H ;错误密码次数 DTABLE

DB

3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,3FH,39H,5EH,79H,71H,00H,40H ;键值表,0~F对应的7段数码管的段位值

;DTABLE[11]=3FH对应键值11,显示\

;DTABLE[16]=00H,数码管熄灭

;DATABLE[17]=04H,显示数码管\

STRING DB 01H,02H,03H,04H,05H,06H ;初始密码,密码内存空间 DATA ENDS

STACK1 SEGMENT STACK DW 256 DUP(?) STACK1 ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA,SS:STACK1

START: MOV AX,DATA

MOV DS,AX

START1:MOV DX,MY8255_MODE ;初始化8255工作方式

MOV AL,81H ;方式0,A口、B口输出,C口高四位输出,C口低4位输入

14

OUT DX,AL

MOV DX,MY8255_C ;开锁电平、报警电平置0 MOV AL,00H OUT DX,AL

MOV SI,0200H ;建立缓冲区,存放要显示的键值 MOV AL,11H ;先初始化键值为11H,显示“-” MOV [SI],AL MOV [SI+1],AL MOV [SI+2],AL MOV [SI+3],AL MOV [SI+4],AL MOV [SI+5],AL MOV DI,0205H

BEGIN:

CALL KEYPAD ; CMP AL,0CH ; JZ RENZ

CMP AL,0AH ; JZ BEGIN

CALL PUTBUF ; CALL KEYLS ; JMP BEGIN

RENZ: CALL KEYLS

CALL CRCMP ; CMP CX,0FFH JZ SHOW1

JMP SHOW2

SHOW1: CALL SHOWC ; JMP START1

SHOW2: CALL SHOWO ; ; JMP START1

QUIT: HLT

KEYPAD PROC NEAR ; 键盘扫描 确认键

修改密码键,此处不用,返回键盘扫描 保存按键值

按键未弹起则继续循环等待弹起 密码比对 密码错误 密码正确 键盘扫描程序

15

BEGINk:

CALL DIS ;显示刷新 CALL CLEAR ;清屏 CALL CCSCAN ;扫描按键 JNZ GETKEY1 ;有键按下则跳置GETKEY1

GETKEY1:CALL DIS ;显示刷新 CALL CLEAR ;清屏 CALL CCSCAN ;再次扫描按键 JNZ GETKEY2 ; JMP BEGINk ;

GETKEY2:MOV CH,0FEH MOV CL,00H

COLUM: MOV AL,CH ; MOV DX,MY8255_A

OUT DX,AL

MOV DX,MY8255_C ; IN AL,DX

L1: TEST AL,01H ; JNZ L2 ; MOV AL,01H ; JMP KCODE

L2: TEST AL,02H ; JNZ L3 ; MOV AL,02H ; JMP KCODE

L3: TEST AL,04H ; JNZ NEXT ; MOV AL,03H ; JMP KCODE

KCODE: ADD AL,CL

JMP QUITk ;

NEXT: ADD CL,3 MOV AL,CH

TEST AL,08H ; JZ KERR ; ROL AL,1 ; 有键按下则跳置GETKEY2 否则跳回开始继续循环

选取一行 读C口,用于判断是哪一列按键闭合是否为第1列

不是则继续判断

设置第1行第1列的对应的键值 是否为第2列 不是则继续判断

设置第1行第2列的对应的键值 是否为第3列

不是则继续判断

设置第1行第3列的对应的键值 确定按键值 检测是否扫描到第4行 是则跳回到开始处

没检测到第4行则准备检测下一列

16

MOV CH,AL

JMP COLUM KERR: JMP BEGINk QUITk: RET KEYPAD ENDP

CCSCAN PROC NEAR ;扫描是否有按键闭合子程序 MOV AL,00H MOV DX,MY8255_A ;将4行全选通,

OUT DX,AL MOV DX,MY8255_C

IN AL,DX ; NOT AL

AND AL,0FH ; RET CCSCAN ENDP

KEYLS PROC NEAR ; PUSH AX KON:

CALL DIS ; CALL CLEAR ; CALL CCSCAN ; JNZ KON ; POP AX

RET

KEYLS ENDP

CLEAR PROC NEAR ; MOV DX,MY8255_B ; MOV AL,00H OUT DX,AL RET CLEAR ENDP

DIS PROC NEAR ; PUSH AX ; MOV SI,0200H MOV DL,0DFH

MOV AL,DL

AGAIN: PUSH DX

MOV DX,MY8255_A

OUT DX,AL ; 读C口

取出C口值的反值 按键是否弹起子程序 显示刷新 清屏 扫描按键,判断按键是否弹起 未弹起则继续循环等待弹起 清除数码管显示子程序

段位置0即可清除数码管显示 显示键值子程序

以缓冲区存放的键值为键值表偏移找到键值并显示 选通一个数码管

17

MOV AL,[SI] ;取出缓冲区中存放键值 MOV BX,OFFSET DTABLE AND AX,00FFH ADD BX,AX MOV AL,[BX] ;将键值作为偏移和键值基地址相加得到相应的键值

MOV DX,MY8255_B OUT DX,AL ;写入数码管A~Dp CALL DALLY

INC SI ; POP DX MOV AL,DL

TEST AL,01H ; JZ OUT1 ; ROR AL,1

MOV DL,AL

JMP AGAIN ;OUT1: POP AX RET DIS ENDP

PUTBUF PROC NEAR ;

MOV SI,DI MOV [SI],AL DEC DI CMP DI,01FFH JNZ GOBACK

MOV DI,0205H

GOBACK: RET

PUTBUF ENDP

CRCMP PROC NEAR ;密码比对子程序

MOV SI,0205H

MOV DI,OFFSET STRING MOV CX,0 ; MOV AL,[SI] MOV BL,[DI] CMP AL,BL JZ NEXT1 JMP NEXT6

取下一个键值

判断是否显示完? 显示完,返回 未显示完,跳回继续 保存键值子程序 密码正确,则输出CX=00H,为密码正确的标志18

NEXT1: MOV SI,0204H

MOV DI,OFFSET STRING MOV AL,[SI] MOV BL,[DI+1] CMP AL,BL JZ NEXT2 JMP NEXT6 NEXT2:

MOV SI,0203H

MOV DI,OFFSET STRING MOV AL,[SI] MOV BL,[DI+2] CMP AL,BL JZ NEXT3 JMP NEXT6 NEXT3:

MOV SI,0202H

MOV DI,OFFSET STRING MOV AL,[SI] MOV BL,[DI+3] CMP AL,BL JZ NEXT4 JMP NEXT6 NEXT4:

MOV SI,0201H

MOV DI,OFFSET STRING MOV AL,[SI] MOV BL,[DI+4] CMP AL,BL JZ NEXT5 JMP NEXT6 NEXT5:

MOV SI,0200H

MOV DI,OFFSET STRING MOV AL,[SI] MOV BL,[DI+5] CMP AL,BL JZ QUITER JMP NEXT6

NEXT6: MOV CX,0FFH ;QUITER:RET CRCMP ENDP

密码错误,则CX=0FFH为密码错误的标志 19

SHOWO PROC NEAR ;开锁子程序 MOV SI,0200H ;显示00 MOV AL,00H MOV [SI],AL MOV [SI+1],AL MOV AL,10H MOV [SI+2],AL MOV [SI+3],AL MOV [SI+4],AL MOV [SI+5],AL MOV DI,0205H

MOV DX,MY8255_C ; MOV AL,010H OUT DX,AL

LOOP21:

CALL KEYPAD

CMP AL,0CH ; JZ LOOP22

CMP AL,0AH ; JZ LOOP23 JMP LOOP21 LOOP22: CALL KEYLS JMP QUITSHO

LOOP23: CALL KEYLS ; MOV SI,0200H

MOV AL,10H MOV [SI],AL MOV [SI+1],AL MOV DI,0205H

CALL CHANGECR ;QUITSHO: MOV DX,MY8255_C ; MOV AL,00H OUT DX,AL

RET SHOWO ENDP

CHANGECR PROC NEAR ;CHG1: CALL KEYPAD CMP AL,0CH JZ CHG2 CALL PUTBUF CALL PUTBUFCR

输出开锁电平 返回键,退出开锁子程序 修改密码键 修改密码,数码管全灭,用于与输入密码区别 调用修改密码子程序

开锁电平置0 修改密码子程序 20

CALL KEYLS

JMP CHG1 CHG2: CALL KEYLS

CALL RING ;确认则发出“滴”的确认音 CALL DALLYS RET CHANGECR ENDP

PUTBUFCR PROC NEAR ;保存修改后的密码子程序 XOR BX,BX MOV BL,[COUNT1]

MOV STRING[BX],AL ; MOV BL,[COUNT1] INC BL

MOV [COUNT1],BL CMP BL,06H JNZ GOBACKCR MOV BL,0

MOV [COUNT1],BL GOBACKCR: RET PUTBUFCR ENDP

SHOWC PROC NEAR ;

MOV SI,0200H ; MOV AL,0FH MOV [SI],AL MOV [SI+1],AL MOV AL,10H MOV [SI+2],AL MOV [SI+3],AL MOV [SI+4],AL MOV [SI+5],AL MOV DI,0205H

MOV DX,MY8255_A ; MOV AL,0CFH OUT DX,AL

MOV DX,MY8255_B MOV AL,71H

OUT DX,AL

; CALL RING CALL DALLYS

放入密码内存空间STRING 闭锁子程序 显示FF 显示FF

发出三声“滴”声 21

CALL DALLYS CALL DALLYS CALL RING CALL DALLYS CALL DALLYS CALL DALLYS CALL RING CALL DALLYS CALL DALLYS CALL DALLYS

MOV BL,[COUNT2] ; INC BL

CMP BL,06H

JZ LOOP31

MOV [COUNT2],BL

JMP LOOP32

LOOP31: MOV DX,MY8255_C ; MOV AL,020H OUT DX,AL

MOV BL,0 ; MOV [COUNT2],BL

LOOP32: CALL KEYPAD CMP AL,0CH JZ LOOP33

JMP LOOP32

LOOP33:CALL KEYLS ; RET SHOWC ENDP

RING PROC NEAR ; PUSH AX

MOV DX,MY8253_MODE ; MOV AL,36H ; OUT DX,AL

MOV AX,0020H MOV DX,MY8253_COUNT0

OUT DX,AL ; 取出密码错误次数,并判断是否已经达到6次

已达到六次,则输出报警电平 密码错误次数清0 未弹起则继续循环等待弹起 发音子程序 初始化8253工作方式 计数器0,方式3 装入计数初值

22

MOV AL,AH

OUT DX,AL CALL DALLYS POP AX

QUITRI: MOV DX,MY8253_MODE ;退出时设置8253为方式2,OUT0置1 MOV AL,34H OUT DX,AL RING ENDP

DALLYS PROC NEAR ;8253延时子程序

D1S: MOV AX,0FFFH D2S: DEC AX JNZ D2S RET DALLYS ENDP

DALLY PROC NEAR ;,8255软件延时子程序 PUSH CX MOV CX,000FH D1: MOV AX,000FH D2: DEC AX JNZ D2

LOOP D1 POP CX

RET DALLY ENDP

CODE ENDS

END START

十、设计中的难点

1.硬件

虽然是第一次接触proteus,在硬件接线方面遇到种种困难。特别是总线的接法,因为以前没有接触过,完全无从下手。但是经过几天的找资料以及学习,通过多次的尝试,终于把硬件接线完成。

2.软件

软件设计基于我们这学期微机实验课上的键盘扫描程序。整个系统中,我觉得最重要的同时最难的就是键盘扫描程序的设计。一开始,对于键盘扫描还未完全搞懂,还没有对键盘赋键值这个概念,导致前期一直都在探索中。接着,程序可以获得相应的键值,可是获得按键值后就很不稳定,比如,我想通过#键来达到确认和返回两个功能,但是总是一确认以后就马上执行返回功能。程序逻辑没有错误,后来参考书本的程序,原来每次获得键值后都要对键

23

盘进行再次扫描,判断按键是否弹起,未弹起则跳到下一步。 如此,#键就能完美执行这两个功能。

十一、收获及体会

1、下面就以硬件方面我做一下总结:

硬件部分主要是设计原理图跟连接线路,这次主要是用到Proteus这个软件,这个软件之前没接触过,所以在下载下来以后第一件事就是上网看教程,看了两三个教程之后大概就明白了它的大体操作,开始自己动手绘图。

在绘图之前,根据需要实现的功能,选定要用到的元件,最后初步定下来一个图样,但是在实际绘图过程中发现太过复杂了,又重新制定了一个图样。因为是第一次用这个软件,里面很多功能都不懂,经常点出很多不懂得文件,最后不得不重新设计,导致绘图时间大大增加。在多次实践后我终于较为熟练的掌握里面的工具了,后面的绘图过程也就相对来说比较轻松,找出了自己绘制元件的时候有些麻烦,不过碰到不会的就上网百度或者问问同学,其实这个绘图过程还是挺有意思的。线路图终于接好了,这里可以总结为三点:

第一,在绘图之前一定要先熟练掌握Proteus这个软件;第二,一点要把程序看懂,这样才可以合理布线路图;第三,在搜索元件的过程中可以大量的求助百度,里面有很多元件库表,这样可以大大缩短查找时间。

通过这一两个星期的学习,掌握了Proteus一些基本的操作以及仿真,相信对以后的学习生活中都大有帮助。

2、软件设计总结:

这次课程设计中,最重点的部分应该属于软件部分。刚刚学习了《微机原理与接口技术》这么课程,一切都觉得那么新鲜。自己一些想法,可以通过实践来实现。软件设计之前,自己大概想好了大体的思路,但是程序需要严格的逻辑,严格的语法,有时按着自己的思路去写程序,却总是发现错误,或者程序不稳定,有时是达不到预期的效果。理论和实践还是有着很多的差距。这次课程设计中,收获最大的是如何确定一个程序的主线。以前写程序,就是想到哪就写哪,写完以后,才发现,有一个小的功能已经无法实现。如果要加入这个功能,却需要改动整个程序,导致程序的兼容性很差。在这次设计中,我先确定了整个程序的主线。输入密码,对比密码,密码正确或密码错误。然后其他程序皆在这几个部分中实现。 比如修改密码则在密码正确中实现,开锁电平也是在密码正确中输出;而报警电平则在密码错误部分实现。由此,我就确定了整个程序的框架,剩下的就是注意一些细节的问题,一些逻辑的问题。

经过一周的奋战,终于还是完成了整个程序的编写。在设计程序的过程中,我不仅对以前学过的汇编语言进行了重温和查漏补缺,而且对程序整体的把握和细节的处理能力得到了很大的提高。毕竟看程序和写程序是有很大区别的,只有实践才能真正将汇编语言学到家。看到仿真的结果和题目所要求的一样,心情倍感欣慰,同时也很有成就感。

整个程序完成了,虽然已经达到了题目的要求,但是自己觉得还可以继续改善。用句至理名言:好作文不是写出来的,是改出来的。我此刻只想说的是:好程序不是写出来的,也是改出来。在以后的日子了,有空的时候可以拿出自己的程序,好好修改完善,实现更多的功能,程序进一步优化。

24

十二、参考文献

《微型计算机原理及应用》 清华大学出版社 牟琦 聂建萍 著 《微型计算机原理及应用实验指导书》华南理工大学出版

25

本文来源:https://www.bwwdw.com/article/b5n3.html

Top