资源描述
接口课程设计实验报告 宿舍安全系统设计报告 一 .实验目的及要求 目的:结合一个实际的接口技术问题在实验台上编程模拟实现。 要求: 结合实际应用,设计一微机应用系统,要求该系统综合应用并行接口、串行接口、其它接口(定时器接口、中断接口、模拟接口可选)、编制对应的程序,实现主控中心微机与下位机远距离传送以及远程控制或监测功能。 二 .系统功能 本系统是用来验证进入宿舍人员的身份的。用户从下位机刷卡,并录入用户名和密码。下位机分别将用户名和密码发送给主控机,主控机验证之后,发送相应的反馈信息给下位机。只有 当用户名和密码都被确认,用户身份才合法。合法时下位机控制发光部件逐个亮灯提示,不合法时则下位机控制发声部件鸣声警报。 三 .系统设计 1. 系统硬件由主控机(其中一台微机)、下位机(另一台位微机)和执行部件组成。主控机与下位机通过串行通信线连接。 2. 执行部件:由接口电路等组成,将接收的数据送入到下位机或将下位机输出的数据送到执行部件。 3. 下位机:与主控机通信,控制执行部件。 4主控机:与所有下位机进行数据交换,必要时需建数据库,进行数据处理等。 5主控机程序:串行( RS232/RS485)通信程 序,数据处理程序等。 6下位机程序:串行( RS232/RS485)通信程序,执行部件控制程序。 系统接口框图见下页所示: 下图中, 8255 是用来进行下位机控制部件的接口单元。 A 口的 8 个引脚和控制板上的 8个显示灯相连,其输出决定灯的状态; B 口 8 个引脚和控制板上的拨码开关的 8 位相连,编码开关的状态可由 B 口读入下位机; C 口的 PC0,PC1,PC3 分别和控制板上的 SW1,SW2,S24 相连,可由下位机读入各开关的状态, PC6 则和喇叭相连,由 PC6 输出方波控制喇叭发声。 四程序设计 本次课程设计的过程中,我主要负责下位机的程序的编写,以及导线在实验台上的连接这两部分的程序设计工作。 系统的模块框图由系统设计的内容可知,即 8255 芯片以上的部分是本系统的通讯模块框图,以下的部分为本程序的功能模块框图。 系统的程序设计是紧密围绕系统功能进行的,程序要实现的功能就是系统的功能。 流程框图如下: 1主控机程序流程图 程序设计过程中,为了模拟用户的刷卡进入,让下位机去测试控制板上的开关 sw4,其按下表示有用户刷卡进入,这时就可以发送插卡信号给主控机, 下图中“接收用户插卡信号”就是指这个信号。 主控机 8251 RS232 RS232 8251 下位机 8255 A 口 B 口 C 口 显示灯 sw1,sw2,sw4 和 喇叭 开关 总线 总线 2下位机程序流程图 下位机部分需要操作控制板,这里要用到控制板上的 8 位编码开关,以及开关 sw1, sw2,sw4。按下 sw4 表示用户插卡进入,然后拨动控制板上的编码开关,设置用户名编码,按下sw1 发送给主控机,若被主控机确认无误,则拨动控制板上的编码开关设置密码,再按下 sw2发送给主控机,等待主控机确认。 正确情况下的灯亮很好控制,只要 A 口输出数据到灯的引脚,再设计一段程序控制灯的闪烁方式即可。喇叭的发声 要说明的是,此处并不是用 8253 的 out 端输出方波来使之发声,而是将 C 口的 PC6 交替置位和复位产生方波,使之发声的。 开始 按键? 结束 接收用户插卡信号 合法? 发确认信号 接收用户密码信息 发确认信号 接收用户名信息 正确? 合法? 发确认信号 提示用户可以进入 初始化 提示用户名错误 发否认信号 提示密码错误 发否认信号 提示卡非法 Y Y Y Y N N N N 3.主控机源程序 ;每次验证用户名和密码之前,都有退出提示,即 3 秒钟内按任意键退出,此时 ;按任意键方可退出 data segment data51 equ 308h ;8251A 数据口 ctr151 equ 309h ;8251A 命令 /状态口 defuser db 65h,81h,24h,37h,02ah,54h ;依次为各用户名 defpwd db 20h,17h,34h,25h,04ch,44h ;依次为各用户对应的密码 userno dw 6 ;用户数目 YN db 0 ;发送缓存 user db 0 ;存放接收的用户名 开始 按键? 结束 发送用户插卡信号 接收 确认信号 合法? 发用户密码信息 接收确认信号 发送用户名信息 接收确认信号 正确? 合法? 提示用户可以进入 灯亮 初始化 声音报警 提示用户名错误 接收否认信号 声音报警 提示密码错误 接收否认信号 提示卡非法 Y Y Y Y N N N N pwd db 0 ;存放接收的密码 t dw 0 ;延时初值 bufb db 0ah,0dh,The domitory system is running.!$ bufu db 0ah,0dh,username(4 characters):$ ;接收用户名提示 bufp db 0ah,0dh,password(6 characters):$ ;接收密码提示 bufr db 0ah,0dh,You can get in!$ ;正确提示 bufus db 0ah,0dh,Error username!$ ;用户名错误提示 bufpd db 0ah,0dh,Error password!$ ;密码错误提示 buferr db 0ah,0dh,Can not identify the card!$ ;不可识别的卡 bufexit db 0ah,0dh,Press any key within 3 seconds to exit!$ data ends stack segment stack db 200 dup(0) stack ends code segment assume cs:code,ds:data,ss:stack hh macro ;回车换行的宏 mov dl,0ah mov ah,2 int 21h mov dl,0dh mov ah,2 int 21h endm int51 proc near ;8251A 初始化子程 mov dx,ctr151 ;8251A 命令口 mov al,0 ;空操作 out dx,al mov al,40h ;内部复位 out dx,al mov al,4Eh ;8251A 方式命令 out dx,al mov al,27h ;8251A 工作命令 out dx,al ret int51 endp delay1 proc ;延时子程 1 push bx mov bx,t dl1: dec bx jnz dl1 pop bx ret delay1 endp quit proc ;3 秒钟之内按任意键退出程序 push cx lea dx,bufexit mov ah,9 int 21h mov cx,05fffh qxx: cmp cx,0 je qx mov ah,1 ;检测是否有键按下,有则退出 int 16h jnz qnext mov t,0ffffh call delay1 dec cx jmp qxx qnext: mov ah,4ch int 21h qx: pop cx ret quit endp send macro a;发送一个字符的宏,首先必须将要发送的字符送入变量 YN mov dx,ctr151 a: in al,dx test al,01 ;发送准备好? TXRDY=1? jz a ;未准备好,则等待 mov dx,data51 ;已准备好,则发送 Y 给下位机 mov al,YN out dx,al endm receive macro b ;接收一个字符的宏 ,接收到 al b: mov dx,ctr151 ;检测接收准备好没 in al,dx test al,02 ;接收数据准备好? RXRDY=1? jz b ;未准备好则继续检测 mov dx,data51;已准备好,即有数据传送过来,则接收 1 个字符 in al,dx endm begin: mov ax,data mov ds,ax call int51 ;调用 8251A 子程序,初始化 8251A k: call quit ;延时 3 秒退出 hh lea dx,bufb ;系统提示 mov ah,9 int 21h receive o ;接收插卡信号 cmp al,O jne error mov YN,Y ;发送卡确认信息 send yyy lea dx,bufu ;用户名提示信息 mov ah,9 int 21h mov al,0 receive a ;接收一个字符,用户信息 mov user,al ;保存接收的用户信息 mov dl,user ;显示接收的字符 mov ah,02h int 21h jmp cmpuser error: lea dx,buferr ;无法识别的卡 mov ah,9 int 21h hh jmp k over: mov ax,4c00h int 21h cmpuser: mov al,user lea si,defuser ;取用户名数组的首地址 mov cx,userno ;取用户数目 cu: cmp cx,0 je sendnu cmp al,si je sy ;和某一个用户名相等则发送 Y 确认信号 inc si dec cx jmp cu sy: push si ;保存该用户名的地址 mov YN,Y send y lea dx,bufp ;密码提示信息 mov ah,9 int 21h ;接收密码 receive pp mov pwd,al ;保存接收的密码 pop si mov ax,si add ax,userno ;得到该用户名对应的密码在密码数组中的地址 mov si,ax mov bl,si cmp pwd,bl ;和密码比较 jne sendnp ;不相等则发送 N,相等则发送 Y mov YN,Y send yy lea dx,bufr ;显示正确 mov ah,9 int 21h hh jmp k ;重新开始 sendnp: mov YN,N send n lea dx,bufpd ;显示密码错误 mov ah,9 int 21h hh jmp k ;重新开始 sendnu: mov YN,N send n lea dx,bufus ;显示用户名错误 mov ah,9 int 21h hh jmp k ;重新开始 code ends end begin 4.下位机源程序 ;程序开始时,提示在 3 秒钟内按任意键退出,否则继续执行。若继续执行,首 ;先按 sw4 表示插卡,再由开 ;关状态设置用户名,按 sw1 发送之,显示提示信息 ;仍然用开关状态设置密码,按 sw2 发送之,显示提示 ;信息,回程序开始 . data segment data51 equ 308h ;8251A 数据口 ctr151 equ 309h ;8251A 命令 /状态口 ctr155 equ 303h ;8255 命令口 ctr155a equ 300h ;8255 数据口 a ctr155b equ 301h ;8255 数据口 b un db 0 ;存放读入的用户名 pd db 0 ;存放读入的密码 hh db 0ah,0dh,$ ;回车换行 light db 0feh,0fdh,0fbh,0f7h,0efh,0dfh,0bfh,07fh ;闪烁灯状态 t dw 0 ;延时初值 f db 0 ;计数初始值 j db 0 ;计数初始值 YN db 0 bufexit db 0ah,0dh,Press any key within 3 seconds to exit!$ buf1 db 0ah,0dh,Press sw4 instand of inserting the card!$ buf2 db 0ah,0dh,Change the state of the switch to set username! Press sw1 to send it!$ ;提示录入和发送用户名 buf3 db 0ah,0dh,Change the state of the switch to set password! Press sw2 to send it!$ ;提示录入和发送密码 buf4 db 0ah,0dh,The user is not existed or you have the wrong password!$ ;错误提示信息 buf5 db 0ah,0dh,You can get in!$ ;成功登录信息 data ends stack segment stack DB 200 DUP(0) stack ends code segment assume cs:code,ds:data,ss:stack int51 proc near ;8251A 初始化子程 mov dx,ctr151 ;8251A 命令口 mov al,0 ;空操作 out dx,al mov al,40h ;内部复位 out dx,al mov al,4Eh ;8251A 方式命令 out dx,al mov al,27h ;8251A 工作命令 out dx,al ret int51 endp send macro a;发送一个字符的宏,首先必须将要发送的字符送入变量 YN mov dx,ctr151 a: in al,dx test al,01 ;发送准备好? TXRDY=1? jz a ;未准备好,则等待 mov dx,data51 ;已准备好,则发送一个字符给下位机 mov al,YN out dx,al endm clear macro c ;置口 c 某一位 ,c 为置位控制字 mov dx,303h mov al,c out dx,al endm receive macro b ;接收一个字符的宏 ,接收到 al b: mov dx,ctr151 ;检测接收准备好没 in al,dx test al,02 ;接收数据准 备好? RXRDY=1? jz b ;未准备好则继续检测 mov dx,data51 ;已准备好,即有数据传送过来,则接收 1 个字符 in al,dx endm delay1 proc ;延时子程 1 push bx mov bx,t dl1: dec bx jnz dl1 pop bx ret delay1 endp delay2 proc ;延时子程 2 push cx mov cx,00fffh xx: cmp cx,0 je x mov t,0ffffh call delay1 dec cx jmp xx x: pop cx ret delay2 endp quit proc ;3 秒钟之内按任意键退出程序 push cx lea dx,bufexit mov ah,9 int 21h mov cx,07fffh qxx: cmp cx,0 je qx mov ah,1 ;检测是否有键按下,有则退出 int 16h jnz qnext mov t,0ffffh call delay1 dec cx jmp qxx qnext: mov ah,4ch int 21h qx: pop cx ret quit endp flutter proc ;灯闪烁函数, 8 个灯依次亮,循环 3 次 lea di,light mov f,3 wyyy: cmp f,0 je wy mov cx,8 l: cmp cx,0 je wyy mov al,di ;灯亮 mov dx,ctr155a out dx,al call delay2 ;延时 2 mov al,0ffh ;灯灭 mov dx,ctr155a out dx,al inc di dec cx jmp l wyy: lea di,light dec f jmp wyyy wy: ret flutter endp noise proc ;声音报警子函数, 3 次长鸣 push cx mov f,3 jj: cmp f,0 je ejj ;产生一定频率的方波,使喇叭发声 mov cx,00dffh xxkk1: cmp cx,0 je xkk mov dx,ctr155 ;pc6 置 1 mov al,0dh out dx,al mov t,0ffffh call delay1 ;延时 mov dx,ctr155 ;pc6 置 0 mov al,0ch out dx,al mov t,0ffffh call delay1 ;延时 dec cx jmp xxkk1 xkk: call delay2 ;不产生方波,停止发声 dec f jmp jj ejj: pop cx ret noise endp begin: mov ax,data mov ds,ax call int51 ;调用 8251A 子程序,初始化 8251A mov dx,ctr155 ;初始化 8255A mov al,10000011b out dx,al ww: lea dx,hh ;回车换行 mov ah,9 int 21h call quit ;延时退出程 序 lea dx,hh ;回车换行 mov ah,9 int 21h lea dx,buf1 ;提示按 sw4 表示插卡 mov ah,9 int 21h ;检测 sw4 是否按下 clear 07h ;清 sw4 状态 wait4: mov dx,302 in al,dx ;sw4 按下 ? pc3=0? test al,08h ;否,则继续检测 jnz wait4 ;是则发送卡插入信号 mov YN,O send o mov al,0 ;接收主控机反馈信息 receive i cmp al,Y ;确认则继续,否则重新开始 jne ww lea dx,buf2 ;提示设置用户名并发送之 mov ah,9 int 21h ;检测 sw1 状态 clear 01h ;清 sw1 状态 wait1: mov dx,302h ;检测 sw1 是否按下 in al,dx test al,01h ;sw1 按下 ? pc0=0? jnz wait1 ;否则继续检测 ;按下则读开关状态(口 b),得到用户名 mov dx,ctr155b ;读 b 口 in al,dx mov un,al ;保存用户名 mov YN,al ;发送用户名 send us jmp receiv over: mov ax,4c00h ;程序退出 int 21h ;接收主控机反馈信息 receiv: receive y cmp al,Y ;接收的字符和 Y比较 jne wrong ;不合法就提示错误信息 lea dx,buf3 ;合法则提示设置密码并发送之 mov ah,09h int 21h clear 02h ;清 sw2 状态 wait2: mov dx,302h ;检测 sw2 是否按下 in al,dx test al,02h ;sw2 按下 ? pc1=0? jnz wait2 ;否则继续检测 ;按下则读开关状态(口 b),得到密码 mov dx,ctr155b ;读口 b in al,dx mov pd,al ;保存密码 mov YN,al ;发送密码 send pd ;接收主控机反馈回来的信息 receive yy cmp al,Y ;接收的字符和 Y比较 jne wrong ;不相等就提示错误信息,相等则提示登录成功 lea dx,buf5 ;提示登录成功 mov ah,9 int 21h ;此处亮灯提示 call flutter jmp ww ;准备第二次刷卡 wrong: lea dx,buf4 ;显示错误提示信息 mov ah,9 int 21h ;此处声音报警 call noise jmp ww ;准备第二次刷卡 code ends end begin 五心得体会 此次程序设计我们小组同心协力,通过三天多的时间,终于完成了接口的课程设计。通过这个课程设计,我真正掌握了 8255, 8251 等芯片的功能和使用方法,以前在课堂上一知半解的知识通过这次课程设计都彻底弄清楚了。通过写 8255, 8251 等芯片的命令口,可以使得各种芯片工作在不同的状态,这可以发挥这些芯片的使用范围,特别是拨码开关的地方,通过拨码开关可以设置 8255 的 PB 口的值,而这些值可以通过 8251 发送出去,这就是卡号和车费输入的地方。通过这次课程设计,我认识到了汇编语言的强大功能,汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能直接控制硬件 的唯一语言。但是,汇编语言作为一种低级语言,有他自身无法克服的缺点,他的图形用户界面效果,远远不能和 C 语言或者 C语言相提并论,最好的方法是汇编语言和 C/C混合编程,高级语言编程方便简洁,汇编语言能充分发挥计算机硬件特性并且程序运行效率高,二者相结合,效果胜过单独一门语言体现出来的效果。 我还想提一个建议,那就是实验室最好为我们的控制板提供一本使用说明或指南,这样我们就可以彻底抛弃控制板的束缚,灵活地从单个接口芯片的功能特性出发,设计出更好更精彩的程序。
展开阅读全文