自动化科学与工程学院
《微机原理与应用》课程设计报告
多功能密码锁的设计
专业: 自动化科学与工程学院
目录
一、目的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
一、目的 - 了解和掌握8086、8255及8253,等接口芯片以及LED显示器的原理和功能;
- 能用这些接口芯片构建一个简单的系统控制对象,
- 掌握接口电路的综合设计与使用;
- 通过自己动手,进一步了解计算机得工作原理,接口技术,提高计算机硬件,软件综合应用能力,即对微机原理,接口技术,汇编语言程序设计进行综合训练。
二、内容 密码锁在输入密码正确的条件下输出开锁电平,控制电控锁开启,同 显示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、共阴极数码管、各类逻辑门、蜂鸣器,电阻、键盘等。 主要器件简介 CPU8086
8086是Inter系列的16位微处理器,芯片上有2.9万个晶体管,采用 HMOS工 艺制造,用单一的+5V电源,时钟频率为5MHz~10MHz。 8086有16根数据线和20根地址线,它既能处理16位数据,也能处理8位数据。可 寻址的内存空间为1MB。
并行接口8255 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 地址锁存器74LS273是带清除端的八D触发器,只有清除端为高电平时才具有锁存功能,锁存控制端为11脚CLK,在上升沿锁存。8086的ALE端输出的锁存控制信号必须经反相器后才能连到74LS273的CLK端,以满足CLK在上升沿锁存的要求。 4 线-16 线译码器74HCT154 74HCT154 为4 线-16 线译码器,将4 个二进制编码输入译成16 个彼独立的输出之一,并能将数据从一个输入线分配到16 个输出的任意一个而实现解调功能,与大部分TTL 和DTL [url=]电路[/url]完全兼容。其工作原理如下:这种单片4 线—16 线译码器非常适合用于高性能存储器的译码器。当两个选通输入G1 和G2 为低时,它可将4 个二进制编码的输入译成16 个互相独立的输出之一。实现解调功能的办法是:用4 个输入线写出输出线的地址,使得在一个选通输入为低时数据通过另一个选通输入。当任何一个选通输入是高时,所有输出都为高。 六、原理图 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口与矩阵键盘连接 键盘元件KEYPAD-PHONE,0-9为数字键,#为确认/返回键和*为密码修改键。 数字键1-9的键值为相应的数值,数字键0的键值为0BH,功能键*的键值为0AH,能键#的键值为0CH。 3、8255A的A口、B口与数码管的连接 8255A的B口输出数码管的段码,A口输出数码管的位码。 4、8086与8253连接 8253地址分配:计数器0:400H 计数器1:402H 计数器2:404H控制寄存器:406H 为了满足8255A的四个端口地址必须为偶地址这一要求,将8255A的A1、A0分别与8086系统地址总线的A2、A1相连,并且,CPU在对8255A的端口进行访问时,总是将地址中的A0设置为0。
七、软件设计思路 整个硬件设计,主要采用器件CPU8086、并行接口8255和可编程定时/计数器8253。由并行接口8255控制键盘扫描、数码管显示、开锁电平以及报警电平,8255的工作方式是A口输出,B口输出,C口高四位输出,C口低四位输入。通过键盘扫描获得对应的键值,通过对键值判断,判断按键是功能键或数字键,达到输入密码,修改密码,确认输入,返回等功能。由可编程定时/计数器8253产生方波,控制蜂鸣器产生“滴”声。8253工作在计数器0方式3,产生方波,通过延时,是蜂鸣器产生“滴”。8253在每次调用发声子程序中初始化。 根据条件要求,程序首先需要实现的是输入密码。为了区别输入密码和修改密码,当数码管显示都显示“—”,是输入密码。当数码管全灭时,是修改密码。当密码输入完且按下确认键,则输入数字与密码比对。密码正确,则输出开锁电平(高电平有效)。在此时,则可以通过功能键修改密码,密码修改成功发出“滴”声。若不需要,按返回键返回。若密码错误,则发出三声“滴”声,密码错误次数加1,并判断是否已经输入六次错误,是则输出报警电平(高电平有效),并置密码错误次数置0,等待返回键返回;否则等待返回按键返回。 为了实现上述程序,首先要初始化8086、8255,接着进入键盘扫描。每次有按键输入后,还应判断按键是否弹起,可以实现键盘消抖。无论密码正确与否,均需要通过返回键才能返回,所以每次显示完后都要对键盘扫描,判断是否按下返回键,有则退出键盘扫描,没有则继续扫描。开锁电平以及报警电平均在返回时置低电平。 八、流程图 主程序流程图
修改密码子程序流程图开锁子程序流程图
否
是
是
否
否
是
闭锁子程序流程图是
十、设计中的难点
1.硬件
虽然是第一次接触proteus,在硬件接线方面遇到种种困难。特别是总线的接法,因为以前没有接触过,完全无从下手。但是经过几天的找资料以及学习,通过多次的尝试,终于把硬件接线完成。
2.软件
软件设计基于我们这学期微机实验课上的键盘扫描程序。整个系统中,我觉得最重要的同时最难的就是键盘扫描程序的设计。一开始,对于键盘扫描还未完全搞懂,还没有对键盘赋键值这个概念,导致前期一直都在探索中。接着,程序可以获得相应的键值,可是获得按键值后就很不稳定,比如,我想通过#键来达到确认和返回两个功能,但是总是一确认以后就马上执行返回功能。程序逻辑没有错误,后来参考书本的程序,原来每次获得键值后都要对键盘进行再次扫描,判断按键是否弹起,未弹起则跳到下一步。 如此,#键就能完美执行这两个功能。
十一、收获及体会
1、下面就以硬件方面我做一下总结:
硬件部分主要是设计原理图跟连接线路,这次主要是用到Proteus这个软件,这个软件之前没接触过,所以在下载下来以后第一件事就是上网看教程,看了两三个教程之后大概就明白了它的大体操作,开始自己动手绘图。
在绘图之前,根据需要实现的功能,选定要用到的元件,最后初步定下来一个图样,但是在实际绘图过程中发现太过复杂了,又重新制定了一个图样。因为是第一次用这个软件,里面很多功能都不懂,经常点出很多不懂得文件,最后不得不重新设计,导致绘图时间大大增加。在多次实践后我终于较为熟练的掌握里面的工具了,后面的绘图过程也就相对来说比较轻松,找出了自己绘制元件的时候有些麻烦,不过碰到不会的就上网百度或者问问同学,其实这个绘图过程还是挺有意思的。线路图终于接好了,这里可以总结为三点:
第一,在绘图之前一定要先熟练掌握Proteus这个软件;第二,一点要把程序看懂,这样才可以合理布线路图;第三,在搜索元件的过程中可以大量的求助百度,里面有很多元件库表,这样可以大大缩短查找时间。
通过这一两个星期的学习,掌握了Proteus一些基本的操作以及仿真,相信对以后的学习生活中都大有帮助。
2、软件设计总结:
这次课程设计中,最重点的部分应该属于软件部分。刚刚学习了《微机原理与接口技术》这么课程,一切都觉得那么新鲜。自己一些想法,可以通过实践来实现。软件设计之前,自己大概想好了大体的思路,但是程序需要严格的逻辑,严格的语法,有时按着自己的思路去写程序,却总是发现错误,或者程序不稳定,有时是达不到预期的效果。理论和实践还是有着很多的差距。这次课程设计中,收获最大的是如何确定一个程序的主线。以前写程序,就是想到哪就写哪,写完以后,才发现,有一个小的功能已经无法实现。如果要加入这个功能,却需要改动整个程序,导致程序的兼容性很差。在这次设计中,我先确定了整个程序的主线。输入密码,对比密码,密码正确或密码错误。然后其他程序皆在这几个部分中实现。
比如修改密码则在密码正确中实现,开锁电平也是在密码正确中输出;而报警电平则在密码错误部分实现。由此,我就确定了整个程序的框架,剩下的就是注意一些细节的问题,一些逻辑的问题。
经过一周的奋战,终于还是完成了整个程序的编写。在设计程序的过程中,我不仅对以前学过的汇编语言进行了重温和查漏补缺,而且对程序整体的把握和细节的处理能力得到了很大的提高。毕竟看程序和写程序是有很大区别的,只有实践才能真正将汇编语言学到家。看到仿真的结果和题目所要求的一样,心情倍感欣慰,同时也很有成就感。
整个程序完成了,虽然已经达到了题目的要求,但是自己觉得还可以继续改善。用句至理名言:好作文不是写出来的,是改出来的。我此刻只想说的是:好程序不是写出来的,也是改出来。在以后的日子了,有空的时候可以拿出自己的程序,好好修改完善,实现更多的功能,程序进一步优化。
单片机源程序如下:
- 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,显示"0"
- ;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位输入
- 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 ;键盘扫描程序
- BEGINk:
- CALL DIS ;显示刷新
- CALL CLEAR ;清屏
- CALL CCSCAN ;扫描按键
- JNZ GETKEY1 ;有键按下则跳置GETKEY1
- GETKEY1:CALL DIS ;显示刷新
- CALL CLEAR ;清屏
- CALL CCSCAN ;再次扫描按键
- JNZ GETKEY2 ;有键按下则跳置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 ;读C口,用于判断是哪一列按键闭合
- IN AL,DX
- L1: TEST AL,01H ;是否为第1列
- JNZ L2 ;不是则继续判断
- MOV AL,01H ;设置第1行第1列的对应的键值
- JMP KCODE
- L2: TEST AL,02H ;是否为第2列
- JNZ L3 ;不是则继续判断
- MOV AL,02H ;设置第1行第2列的对应的键值
- JMP KCODE
- L3: TEST AL,04H ;是否为第3列
- JNZ NEXT ;不是则继续判断
- MOV AL,03H ;设置第1行第3列的对应的键值
- JMP KCODE
- KCODE: ADD AL,CL
- JMP QUITk ;确定按键值
- NEXT: ADD CL,3
- MOV AL,CH
- TEST AL,08H ;检测是否扫描到第4行
- JZ KERR ;是则跳回到开始处
- ROL AL,1 ;没检测到第4行则准备检测下一列
- 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 ;读C口
- NOT AL
- AND AL,0FH ;取出C口值的反值
- 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 ;段位置0即可清除数码管显示
- 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 ;选通一个数码管
- 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 ; 密码正确,则输出CX=00H,为密码正确的标志
- MOV AL,[SI]
- MOV BL,[DI]
- CMP AL,BL
- JZ NEXT1
- JMP NEXT6
- 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 ;密码错误,则CX=0FFH为密码错误的标志
- QUITER:RET
- CRCMP ENDP
-
- 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 ;开锁电平置0
- MOV AL,00H
- OUT DX,AL
- RET
- SHOWO ENDP
- CHANGECR PROC NEAR ;修改密码子程序
- CHG1: CALL KEYPAD
- CMP AL,0CH
- JZ CHG2
- CALL PUTBUF
- CALL PUTBUFCR
- 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 ;放入密码内存空间STRING
- 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 ;显示FF
- 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 ;显示FF
- MOV AL,0CFH
- OUT DX,AL
- MOV DX,MY8255_B
- MOV AL,71H
- OUT DX,AL
- ;发出三声"滴"声
- CALL RING
- CALL DALLYS
- CALL DALLYS
- CALL DALLYS
- CALL RING
- CALL DALLYS
- CALL DALLYS
- CALL DALLYS
- CALL RING
- CALL DALLYS
- CALL DALLYS
- CALL DALLYS
-
- MOV BL,[COUNT2] ;取出密码错误次数,并判断是否已经达到6次
- 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 ;密码错误次数清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 ;初始化8253工作方式
- MOV AL,36H ;计数器0,方式3
- OUT DX,AL
-
- MOV AX,0020H
- MOV DX,MY8253_COUNT0
- OUT DX,AL ;装入计数初值
- 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
复制代码
所有资料51hei提供下载:
http://www.51hei.com/bbs/dpj-142463-1.html
|