1、用户数目YN db 0 ;发送缓存user db 0 ;存放接收的用户名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
2、,Error password!密码错误提示buferr db 0ah,0dh,Can not identify the card!不可识别的卡bufexit db 0ah,0dh,Press any key within 3 seconds to exit!data endsstack segment stack db 200 dup(0)stack endscode segment assume cs:code,ds:data,ss:stackhh macro ;回车换行的宏 mov dl,0ah mov ah,2 int 21h mov dl,0dh endmint51 proc nea
3、r ;8251A初始化子程 mov dx,ctr151 ;8251A命令口 mov al,0 ;空操作 out dx,al mov al,40h ;内部复位 out dx,al mov al,4Eh ;8251A方式命令 mov al,27h ;8251A工作命令 retint51 endpdelay1 proc ;延时子程1 push bx mov bx,tdl1: dec bx jnz dl1 pop bxdelay1 endp quit proc ;3秒钟之内按任意键退出程序 push cx lea dx,bufexit mov ah,9 mov cx,05fffhqxx: cmp cx
4、,0 je qx mov ah,1 ;检测是否有键按下,有则退出 int 16h jnz qnext mov t,0ffffh call delay1 dec cx jmp qxxqnext: mov ah,4chqx: pop cx retquit endpsend macro a;发送一个字符的宏,首先必须将要发送的字符送入变量YN mov dx,ctr151 a: in al,dx test al,01 ;发送准备好?TXRDY=1? jz a ;未准备好,则等待 mov dx,data51 ;已准备好,则发送Y给下位机 mov al,YNreceive macro b ;接收一个字符的
5、宏,接收到alb: mov dx,ctr151 ;检测接收准备好没 in al,dx test al,02 ;接收数据准备好?RXRDY=1? jz b ;未准备好则继续检测 mov dx,data51;已准备好,即有数据传送过来,则接收1个字符 endm begin: mov ax,data mov ds,ax call int51 ;调用8251A子程序,初始化8251A k: call quit ;延时3秒退出 hh lea dx,bufb ;系统提示 receive o ;接收插卡信号 cmp al,O jne error mov YN,Y ;发送卡确认信息 send yyy lea
6、dx,bufu ;用户名提示信息 mov al,0 receive a ;接收一个字符,用户信息 mov user,al ;保存接收的用户信息 mov dl,user ;显示接收的字符 mov ah,02h int 21h jmp cmpusererror: lea dx,buferr ;无法识别的卡 mov ah,9 int 21h hh jmp kover: mov ax,4c00h int 21h cmpuser: mov al,user lea si,defuser ;取用户名数组的首地址 mov cx,userno ;取用户数目cu: cmp cx,0 je sendnu cmp a
7、l,si je sy ;和某一个用户名相等则发送Y确认信号 inc si jmp cusy: push si ;保存该用户名的地址 send y lea dx,bufp ;密码提示信息 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 send yy lea dx,bufr ;显示正确 jmp k ;重新开始 sendnp:
8、 mov YN,N send n lea dx,bufpd ;显示密码错误重新开始sendnu: send n lea dx,bufus ;显示用户名错误code ends end begin4.下位机源程序程序开始时,提示在3秒钟内按任意键退出,否则继续执行。若继续执行,首先按sw4表示插卡,再由开;关状态设置用户名,按sw1发送之,显示提示信息仍然用开关状态设置密码,按sw2发送之,显示提示信息,回程序开始.data51 equ 308h ;ctr151 equ 309h ;ctr155 equ 303h ;8255命令口ctr155a equ 300h ;8255数据口actr155b
9、equ 301h ;8255数据口bun 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 0buf1 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 i
10、t! ;提示录入和发送用户名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,成功登录信息stack segment stack DB 200 DUP(0) mov dx,data51 ;已准备好,则发送一个字符给下位机 clear macro c ;置口c某一位,c为置位控
11、制字 mov dx,303h mov al,creceive macro b ; mov dx,ctr151 ; test al,02 ; jz b ; mov dx,data51 ; endm delay2 proc ;延时子程2 mov cx,00fffhxx: je x jmp xxx: pop cxdelay2 endp mov cx,07fffhflutter proc ;灯闪烁函数,8个灯依次亮,循环3次 lea di,light mov f,3wyyy: cmp f,0 je wy mov cx,8l: je wyy mov al,di ;灯亮 mov dx,ctr155a ou
12、t dx,al call delay2 ;延时2 mov al,0ffh ;灯灭 out dx,al inc di jmp lwyy: lea di,light dec f jmp wyyy wy:flutter endpnoise proc ;声音报警子函数,3次长鸣 jj: je ejj产生一定频率的方波,使喇叭发声 mov cx,00dffhxxkk1: je xkk mov dx,ctr155 ;pc6置1 mov al,0dh call delay1 ;延时pc6置0 mov al,0ch jmp xxkk1 xkk: call delay2 ;不产生方波,停止发声 jmp jjej
13、j: pop cxnoise endp mov ds,ax mov dx,ctr155 ;初始化8255A mov al,10000011bww: lea dx,hh ;延时退出程序 lea dx,hh ; lea dx,buf1 ;提示按sw4表示插卡检测sw4是否按下 clear 08h ;清sw4状态wait4: mov dx,302 in al,dx ;sw4按下? pc3=0? test al,08h ;否,则继续检测 jnz wait4是则发送卡插入信号 send o mov al,0 ;接收主控机反馈信息 receive i cmp al, ;确认则继续,否则重新开始 jne w
14、w lea dx,buf2 ;提示设置用户名并发送之检测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口 mov un,al ;保存用户名 mov YN,al ;发送用户名 send us jmp receiv mov ax,4c00h ;程序退出 receiv: receive y接收的字符和比较 jne wrong ;不合法就提示错误信息 lea dx,
15、buf3 ;合法则提示设置密码并发送之 mov ah,09h clear 02h ;清sw2状态wait2:检测sw2是否按下 test al,02h ;sw2按下? pc1=0? jnz wait2 ;按下则读开关状态(口b),得到密码 mov dx,ctr155b ;读口b mov pd,al ;保存密码 发送密码 send pd接收主控机反馈回来的信息 receive yy不相等就提示错误信息,相等则提示登录成功 lea dx,buf5 ;提示登录成功此处亮灯提示 call flutter jmp ww ;准备第二次刷卡wrong: lea dx,buf4 ;显示错误提示信息此处声音报警
16、 call noise 准备第二次刷卡 code ends四心得体会本次接口实验的课程设计历时一周,由我们一个小组共5人合作完成。在此次实验中,小组的各个成员由汪野同学负责总体的规划架构和主要程序的设计并向我们阐述设计的思路;而我则负责对程序设计的测试、调试以及进一步的完善功能;而周远则负责程序界面的设计还有硬件的设计,张仲容同学主要负责硬件上的监测以及流程图设计。所有软件设计用到的程序语言都是汇编语言。这五天中,我们的设计流程思路在一开始就整理的相当清楚:1. 首先完成下位机从实验面板接受信号的输入;2. 接下来进行主控机设计,主要是对用户名和密码的验证;3. 然后完成异步全双工传输;4.
17、根据实验需求逐步调整、完善核心代码;5. 进行判断对错的处理模块,正确则闪烁指示灯,错误则声音报警;6. 程序界面的设计。我们按照流程一步步的完成了本次实验,虽然在最后的程序界面设计环节中因为对汇编语言下的界面设计了解的实在是太少没有能够设计出美观、方便使用的界面(这也是本次实验的一个不足之处),但是核心功能则完成的相当好。汪野同学首先完成了主控机和下位机相应程序的编写,第一个版本的下位机是系统检测键盘输入用户名和密码,并按字符进行异步全双工通信。在这过程中,我负责代码的调试,解决了几个由于疏漏而导致的问题,比如说源目的寄存器类型不匹配,不常用的汇编命令不熟悉等等。另外在下位机输入密码的时建议下位机应该显示*号而不是字符,所以针对循环的内部代码做了一个分支,用户名和密码有不
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1