资源描述
超市存物箱模拟装置
作者:汤伟 单位:南京信息职业技术学院
一、 设计的任务与要求
利用单片机制作超市存物箱模拟装置,模拟的内容包括:用户存物,用户取物,满箱提示,管理员取物,管理员修改密码,存物时用户密码通过数码管输出,存物箱状态指示灯,自动开关箱,有效按键提示音,密码输入提示,密码正确提示,密码错误提示。
二、 硬件电路设计及原理图
1、 存物箱模拟装置的面板设计:
图(1) 面板设计
2、 电路原理图如下:
图(2) 超市存物箱模拟装置原理图
如图(2)所示:P0.0~P0.7用于接4×4矩阵键盘;P1口作为四位数码管的数据端口,P3.0~P3.3分别作为四位数码管的位选;P2.0~P2.7作为存物箱是否存物的状态指示;P3.4接绿色的LED,提示“请输入密码”;P3.5接红色的LED,提示“密码错误”;P3.6接蜂鸣器作为按键提示音的输出。该模拟装置的输入量均来自4×4矩阵键盘,由程序对相应管脚进行查询并处理,运行结果通过其它管脚以不同的方式输出给用户。程序处理过程以下将详细介绍。
三、 存物箱程序流程图及实施细则
1、主程序(START):
40H单元的8个二进制位对应8个存物箱的存物状态,若某位为0,则说明此位对应的存物箱已存物,反之则为空箱。当40H的8个二进制位都为1(即40H的内容为FF)时,此时8个存物箱都为空箱,程序跳过查询“取”键,按此键无提示音。
10H、11H两个单元为四位随机密码产生单元,10H每经过1次查询后内容增1,11H在当10H的第5位为1时内容增1,这样是为了增加密码产生的随机性。若没有按键请求,则两个单元记满重新再记,不断循环计数,直至查询到按键请求计数才停止。
2、管理员程序(ADMIN):
将立即数00H放入R0中作为管理员使用存物箱的确定,因为本装置的程序多处用到“键盘查询”(KEY)程序,如:管理员密码的输入,用户密码的输入,管理员密码的修改。“键盘查询”为公用的程序段,设有不同的条件转移,(R0)=#00H就是作为管理员密码输入的功能条件。P1口为四位数码管的数据输入口,#40H就是0100 0000,其中的1对应的是八段码的g段。当输入密码的第一位后,CLR P3.3,控制四位数码管最高位显示的位选(2号管脚)从P3.3得到一低电平信号(数码管为共阴),最高位显示“-”;输入密码的第二位后,同理,CLR P3.2,四位数码管的前两位显示“- -”,四位输入完毕,即显示“- - - -”。
CLR P3.4将P3.4管脚清0,绿色的LED点亮,提示“请输入密码”。接下来就可以通过键盘查询(KEY)来输入管理员密码了。
键盘查询程序开始之前P0口全为高电平,然后先将P0.4管脚清零,依次查询P0.3,P0.2,P0.1(此行P0.0没有接按键),是否也为低电平,没有的话将P0.4置为高电平,接下来再将P0.5管脚清零,同样依次查询P0.3,P0.2,P0.1,P0.0是否也为低电平,假如P0.1为低电平,则确定为“6”号键被按下,将P0.5和P0.1至为高电平之后,程序将对此次按键进行相应的处理。
上面已经提到,键盘查询是公用的,(R0)=#00H为管理员密码输入的功能条件,当查询到第一个数字按键按下时,将按键值放在51H单元的高四位,51H的低四位为0000,按键值也放在52H单元的低四位中,52H单元的高四位为0000,这样做主要是方便使用逻辑“或”将四次按键的值装在两个单元中。45H单元是位数判断的标准,此单元在开始键盘扫描之前的初始值为#00H,当第一次查到按键时,先将45H的内容增1,这样便知道输入的数应该放到第一位(最高位),作为管理员密码输入的第一位数。再次有按键被按下,程序跳至位数判断时,45H内容再增1,45H内容为#02H,输入的数应该放到第二位,这样重复直至增到4,确定输入数为四位密码的最后一位,此后45H清0,由于功能条件(R0)=#00H为管理员密码输入,程序将跳转到四位数字密码输入位数判断,将输入的四位数密码整合到43H和44H两个单元(若(R0)≠#00H,可判断输入的密码为用户取物密码,则输入的四位数密码整合到30H和31H两个单元,进行用户密码校验)。
43H 和44H分别与41H和42H进行比较,41H和42H存放的是真正管理员密码,若四个单元对应的内容不相同,则点亮红色的D2提示“密码错误”并返回主程序。若四个单元对应的内容相同,说明管理员密码输入正确,数码管持续0.5S显示“0000”,表示密码正确。确定管理员身份后,程序执行到管理员的功能选择(CHOOSE),进行“取物”、“修改管理员密码”和“退出管理”的选择。
1)如有用户忘记密码,管理员可按下“取物”键,此时管理员取物功能条件为(R2)=#08H,依然通过公用的“键盘查询”程序段。管理员只要输入箱号,对应的箱子就会打开。与其他情况下的“键盘查询”不同的是在查过“8”之后,有个判断转移条件“CJNE R2,#03H,G3”,意思是:R2内容为#03H时将继续查询“9”号键,若R2内容不为#03H,则跳至G3(G3绕过了“9”号键和“0”号键的查询),显然R2内容为#08H而非#03H。因为没有“9”号和“0”号存物箱,所以在管理员取物的情况下要跳过“9”号键和“0”号键的查询。管理员按下1至8号键中的某个后,相应的存物箱将打开,完成之后关此存物箱并跳回管理员的功能选择(CHOOSE)。
2)按下“管理员修改密码”(简称“改密”)键后,功能条件为(R1)=#05H,此时通过“键盘查询”输入两次相同的4位的新密码,由功能条件的判断,将第一次输入的四位密码存入33H、34H单元,第二次输入的四位密码存入35H、36H单元。33H和35H比较,34H和36H比较,若对应单元的内容均相同,则将新密码存在41H和42H单元,这将作为管理员的新密码。若对应单元的内容有不同的,提示“密码错误”并返回管理员的功能选择(CHOOSE)。
3)管理员按此键即退出管理,跳回主程序(START)。
3、存物程序(SAVE):
程序由START跳转到SAVE时,10H和11H两个单元停止计数,将两个单元拆分成四位数,每位数用四个二进制位表示,拆分时只将大于9的数进行修正,修正值为初始值与十进制数10的差值,即将A修正为0,B修正为1,……F修正为5,小于或等与9的数经修正程序后不发生变化。
10H单元的高四位和低四位数修正后分别存放在54H和55H低四位中,11H单元的高四位和低四位数修正后分别存放在56H和57H低四位中。然后再将修正结果重新拼合在10H和11H单元中, 接着把10H单元的数据依次与8个存物箱对应的前两位密码存放单元20H、22H、24H、26H、28H、2AH、2CH、2EH进行比较,如果10H的值与某个单元的值相同,则将(10H)*2+1->(10H),然后返回到SAVE,重新对10H单元修正,如果修正后10H、11H两个单元的值为均等于#00H的情况,那么就将#50H和#21H分别存放在10H和11H中作为密码,然后再返回SAVE。直至10H内容与8个存物箱对应的前两位密码存放单元的内容均不相同为止,密码就确定了。
至此用户存物的密码已经确定,将54H、55H、56H和57H的内容依次赋值给A,通过A的值进行查表,将表中可让8段数码显示数字的8位二进制代码通过P1口传送给数码管,同时结合数码管位选信号的控制将四位密码输出给用户,动态显示时间持续3秒左右即停止。用户获取密码后,程序将对8个存物箱的存物状态依次进行查询,8个状态是通过P2口储存在40H单元中的,查询是从40H单元8个二进制位的最低位开始,查到第一个为“1”的二进制位时,即确定与该二进制位对应的箱子为此次存物箱。通过开关箱程序使该箱的指示灯闪烁,提示箱子已开,关箱后此箱的指示灯保持点亮状态,本制作中关箱不做重点设计,自动完成。
关箱后查询是否还有空箱,若没有空箱,即40H单元的8个二进制位均为0,此时跳转至“满箱提醒”;若有空箱,则返回“主程序”。“满箱提醒”时,只查询“管理员”和“取”这两个按键,没有按键按下数码管始终显示“FULL”,有则跳转处理。8个存物箱对应的密码存放单元有8组,每组两个单元,如下表:
箱号
密码存放单元
箱号
密码存放单元
1
20H、21H
5
28H、29H
2
22H、23H
6
2AH、2BH
3
24H、25H
7
2CH、2DH
4
26H、27H
8
2EH、2FH
*说明:为更方便程序查询,选了连续地址单元20H—2FH
4、取物程序(TAKE):
进入取物程序(TAKE)后,键盘查询后功能条件打乱,如:(R0)=#00H为管理员功能条件; (R1)=#05H为管理员修改密码功能条件;(R2)=#08H为管理员取物功能条件。在TAKE 程序的开始将他们重新赋值,这样在公用的“键盘查询”后便可判断出此次查询的目的是用户取物,键盘输入四位数字,由功能条件的判断,将输入的四位数密码整合到30H和31H两个单元中与8个存物箱对应的8组密码存放单元依次比较。当30H、31H单元与所有组对应的两个单元内容不同时,提示密码错误,然后自动返回主程序;当30H、31H单元与某一组的两个单元内容相同时,即确定该用户的存物箱的号码,接着转至开关箱程序,将用户存物的箱子打开。最后关上该箱,跳回主程序。
四、超市存物箱模拟装置汇编语言程序
ORG 0000H
MAIN:MOV P0,#0FFH
MOV P1,#0FFH
MOV P2,#0FFH
MOV P3,#0FFH
MOV 41H,#88H
MOV 42H,#88H
MOV 40H,P2
MOV 45H,#00H
;=======主程序=======
START:CLR P0.5
JB P0.0,N1
LCALL D1
JB P0.0,N1
LCALL RING
SETB P0.0
SETB P0.5
AJMP ADMIN
N1:SETB P0.5
CLR P0.7
JB P0.3,N2
LCALL D1
JB P0.3,N2
LCALL RING
SETB P0.3
SETB P0.7
LJMP SAVE
N2:MOV 60H,A
MOV A,40H
CJNE A,#0FFH,G1
MOV A,60H
SJMP N3
G1:MOV A,60H
JB P0.1,N3
LCALL D1
JB P0.1,N3
LCALL RING
SETB P0.1
SETB P0.7
LJMP TAKE
N3:SETB P0.7
INC 10H
MOV A,10H
JNB ACC.5,G2
INC 11H
G2:SJMP START
;======管理员程序=====
ADMIN:MOV R0,#00H
MOV P1,#40H
CLR P3.4
;======键盘查询======
KEY: CLR P0.4
JB P0.3,N4
LCALL D1
JB P0.3,N4
LCALL RING
SETB P0.3
SETB P0.4
AJMP K1
N4:JB P0.2,N5
LCALL D1
JB P0.2,N5
LCALL RING
SETB P0.2
SETB P0.4
AJMP K2
N5:JB P0.1,N6
LCALL D1
JB P0.1,N6
LCALL RING
SETB P0.1
SETB P0.4
AJMP K3
N6:SETB P0.4
CLR P0.5
JB P0.3,N7
LCALL D1
JB P0.3,N7
LCALL RING
SETB P0.3
SETB P0.5
AJMP K4
N7:JB P0.2,N8
LCALL D1
JB P0.2,N8
LCALL RING
SETB P0.2
SETB P0.5
AJMP K5
N8:JB P0.1,N9
LCALL D1
JB P0.1,N9
LCALL RING
SETB P0.1
SETB P0.5
AJMP K6
N9:JB P0.0,N10
LCALL D1
JB P0.0,N10
LCALL RING
SETB P0.0
SETB P0.5
AJMP START
N10:SETB P0.5
CLR P0.6
JB P0.3,N11
LCALL D1
JB P0.3,N11
LCALL RING
SETB P0.3
SETB P0.6
AJMP K7
N11:JB P0.2,N12
LCALL D1
JB P0.2,N12
LCALL RING
SETB P0.2
SETB P0.6
AJMP K8
N12:CJNE R2,#03H,G3
JB P0.1,N13
LCALL D1
JB P0.1,N13
LCALL RING
SETB P0.1
SETB P0.6
AJMP K9
N13:SETB P0.6
CLR P0.7
JB P0.2,G3
LCALL D1
JB P0.2,G3
LCALL RING
SETB P0.2
SETB P0.7
AJMP K0
G3:SETB P0.7
CLR P0.5
JB P0.0,N14
LCALL D1
JB P0.0,N14
LCALL RING
SETB P0.0
SETB P0.5
AJMP START
N14:SETB P0.5
AJMP KEY
K1:MOV 50H,#10H
MOV 51H,#01H
CJNE R1,#05H,N15
AJMP JUD2
N15:CJNE R2,#08H,N16
SETB P2.0
LJMP CLOSE1
N16:AJMP JUD1
K2:MOV 50H,#20H
MOV 51H,#02H
CJNE R1,#05H,N17
AJMP JUD2
N17:CJNE R2,#08H,N18
SETB P2.1
LJMP CLOSE1
N18:AJMP JUD1
K3:MOV 50H,#30H
MOV 51H,#03H
CJNE R1,#05H,N19
AJMP JUD2
N19:CJNE R2,#08H,N20
SETB P2.2
LJMP CLOSE1
N20:AJMP JUD1
K4:MOV 50H,#40H
MOV 51H,#04H
CJNE R1,#05H,N21
AJMP JUD2
N21:CJNE R2,#08H,N22
SETB P2.3
LJMP CLOSE1
N22:AJMP JUD1
K5:MOV 50H,#50H
MOV 51H,#05H
CJNE R1,#05H,N23
AJMP JUD2
N23:CJNE R2,#08H,N24
SETB P2.4
LJMP CLOSE1
N24:AJMP JUD1
K6:MOV 50H,#60H
MOV 51H,#06H
CJNE R1,#05H,N25
AJMP JUD2
N25:CJNE R2,#08H,N26
SETB P2.5
LJMP CLOSE1
N26:AJMP JUD1
K7:MOV 50H,#70H
MOV 51H,#07H
CJNE R1,#05H,N27
AJMP JUD2
N27:CJNE R2,#08H,N28
SETB P2.6
LJMP CLOSE1
N28:AJMP JUD1
K8:MOV 50H,#80H
MOV 51H,#08H
CJNE R1,#05H,N29
AJMP JUD2
N29:CJNE R2,#08H,N30
SETB P2.7
LJMP CLOSE1
N30:AJMP JUD1
K9:MOV 50H,#90H
MOV 51H,#09H
CJNE R1,#05H,N31
AJMP JUD2
N31:AJMP JUD1
K0:MOV 50H,#00H
MOV 51H,#00H
CJNE R1,#05H,N32
AJMP JUD2
N32:AJMP JUD1
;====4位密码位数判断==
JUD1: INC 45H
CLR CY
MOV A,45H
SUBB A,#01H
JZ T11
CLR CY
MOV A,45H
SUBB A,#02H
JZ T12
CLR CY
MOV A,45H
SUBB A,#03H
JZ T13
CLR CY
MOV A,45H
SUBB A,#04H
JZ T14
;===四位密码存入单元===
T11:CLR P3.3
CJNE R0,#00H,A11
MOV 43H,50H
AJMP KEY
A11:MOV 30H,50H
AJMP KEY
T12:CLR P3.2
CJNE R0,#00H,A12
MOV A,43H
ORL A,51H
MOV 43H,A
AJMP KEY
A12:MOV A,30H
ORL A,51H
MOV 30H,A
AJMP KEY
T13:CLR P3.1
CJNE R0,#00H,A13
MOV 44H,50H
AJMP KEY
A13:MOV 31H,50H
AJMP KEY
T14:MOV 45H,#00H
CLR P3.0
CJNE R0,#00H,A14
MOV A,44H
ORL A,51H
MOV 44H,A
AJMP TEXT1
A14:MOV A,31H
ORL A,51H
MOV 31H,A
AJMP TEXT2
;====管理员密码校验===
TEXT1:MOV A,41H
CLR CY
SUBB A,43H
JZ RIGHT1
AJMP WRONG1
RIGHT1:CLR CY
MOV A,42H
SUBB A,44H
JZ RIGHT2
WRONG1:SETB P3.4
CLR P3.5
LCALL D2
ORL P3,#0FH
SETB P3.5
AJMP START
RIGHT2:LCALL D2
MOV P1,#3FH
LCALL D2
SETB P3.4
ORL P3,#0FH
;====管理员功能选择===
CHOOSE:CLR P0.6
JB P0.0,N33
LCALL D1
JB P0.0,N33
LCALL RING
SETB P0.6
SETB P0.0
MOV R2,#08H
AJMP KEY
N33:SETB P0.6
CLR P0.7
JB P0.0,N34
LCALL D1
JB P0.0,N34
LCALL RING
SETB P0.7
SETB P0.0
MOV R1,#05H
AJMP KEY
N34:SETB P0.7
CLR P0.5
JB P0.0,N35
LCALL D1
JB P0.0,N35
LCALL RING
SETB P0.5
SETB P0.0
MOV R0,#01H
AJMP START
N35:SETB P0.5
AJMP CHOOSE
;===8位密码位数判断===
JUD2: INC 45H
CLR CY
MOV A,45H
SUBB A,#01H
JZ T21
CLR CY
MOV A,45H
SUBB A,#02H
JZ T22
CLR CY
MOV A,45H
SUBB A,#03H
JZ T23
CLR CY
MOV A,45H
SUBB A,#04H
JZ T24
CLR CY
MOV A,45H
SUBB A,#05H
JZ T25
CLR CY
MOV A,45H
SUBB A,#06H
JZ T26
CLR CY
MOV A,45H
SUBB A,#07H
JZ T27
CLR CY
MOV A,45H
SUBB A,#08H
JZ T28
;===新密码存入单元===
T21:CLR P3.3
MOV 33H,50H
AJMP KEY
T22:CLR P3.2
MOV A,33H
ORL A,51H
MOV 33H,A
AJMP KEY
T23:CLR P3.1
MOV 34H,50H
AJMP KEY
T24:CLR P3.0
MOV A,34H
ORL A,51H
MOV 34H,A
SETB P3.4
MOV P1,#3FH
LCALL D2
ORL P3,#0FH
CLR P3.4
AJMP KEY
T25:CLR P3.3
MOV 35H,50H
AJMP KEY
T26:CLR P3.2
MOV A,35H
ORL A,51H
MOV 35H,A
AJMP KEY
T27:CLR P3.1
MOV 36H,50H
AJMP KEY
T28:CLR P3.0
MOV A,36H
ORL A,51H
MOV 36H,A
SETB P3.4
MOV 45H,#00H
AJMP TEXT3
;=====修改新密码校验===
TEXT3:MOV A,33H
SUBB A,35H
JZ RIGHT3
AJMP WRONG2
RIGHT3:MOV A,34H
CLR CY
SUBB A,36H
JZ RIGHT4
WRONG2:CLR P3.5
LCALL D3
SETB P3.5
MOV R1,#00H
AJMP CHOOSE
RIGHT4:MOV 41H,33H
MOV 42H,34H
SETB P3.4
MOV P1,#3FH
LCALL D2
ORL P3,#0FH
MOV R1,#00H
AJMP CHOOSE
;======存物程序======
SAVE: MOV 52H,10H
MOV A,52H
ANL A,#0F0H
SWAP A
LCALL CHAGE
MOV 54H,A
MOV A,52H
ANL A,#0FH
LCALL CHAGE
MOV 55H,A
MOV 53H,11H
MOV A,53H
ANL A,#0F0H
SWAP A
LCALL CHAGE
MOV 56H,A
MOV A,53H
ANL A,#0FH
LCALL CHAGE
MOV 57H,A
;===10H\11H赋修正值===
MOV A,54H
SWAP A
ORL A,55H
MOV 62H,A
MOV A,56H
SWAP A
ORL A,57H
MOV 63H,A
MOV 10H,62H
MOV 11H,63H
;===查询密码是否存在==
G4:MOV 12H,R0
MOV 13H,R1
MOV R0,#20H
MOV R1,#08H
G5:MOV A,10H
SUBB A,@R0
JZ G6
INC R0
INC R0
DJNZ R1,G5
MOV R0,12H
MOV R1,13H
AJMP G7
G6:MOV A,10H
RL A
INC A
MOV 10H,A
SJMP SAVE
;===判断密码是否都为0==
G7:MOV A,54H
CLR CY
CJNEA,#00H,DISP
MOV A,55H
CLR CY
CJNE A,#00H,DISP
MOV A,56H
CLR CY
CJNE A,#00H,DISP
MOV A,57H
CLR CY
CJNE A,#00H,DISP
MOV 10H,#50H
MOV 11H,#21H
AJMP SAVE
;=====密码显示=======
DISPLAY:MOV R3,#150
DIS:MOV A,54H
LCALL TABLE
CLR P3.3
MOV P1,A
LCALL D0
SETB P3.3
MOV A,55H
LCALL TABLE
CLR P3.2
MOV P1,A
LCALL D0
SETB P3.2
MOV A,56H
LCALL TABLE
CLR P3.1
MOV P1,A
LCALL D0
SETB P3.1
MOV A,57H
LCALL TABLE
CLR P3.0
MOV P1,A
LCALL D0
SETB P3.0
DJNZ R3,DIS
;====寻找空箱======
ORL P3,#0FH
MOV A,40H
JB ACC.0,NO_1
JB ACC.1,NO_2
JB ACC.2,NO_3
JB ACC.3,NO_4
JB ACC.4,NO_5
JB ACC.5,NO_6
JB ACC.6,NO_7
JB ACC.7,NO_8
NO_1:MOV 20H,62H
MOV 21H,63H
CLR P2.0
AJMP CLOSE2
NO_2:MOV 22H,62H
MOV 23H,63H
CLR P2.1
AJMP CLOSE2
NO_3:MOV 24H,62H
MOV 25H,63H
CLR P2.2
AJMP CLOSE2
NO_4:MOV 26H,62H
MOV 27H,63H
CLR P2.3
AJMP CLOSE2
NO_5:MOV 28H,62H
MOV 29H,63H
CLR P2.4
AJMP CLOSE2
NO_6:MOV 2AH,62H
MOV 2BH,63H
CLR P2.5
AJMP CLOSE2
NO_7:MOV 2CH,62H
MOV 2DH,63H
CLR P2.6
AJMP CLOSE2
NO_8:MOV 2EH,62H
MOV 2FH,63H
CLR P2.7
AJMP CLOSE2
;======开关箱1======
CLOSE1:MOV R4,#6
MOV 32H,40H
CLOS1:LCALL D2
MOV 40H,P2
MOV P2,32H
LCALL D2
MOV P2,40H
DJNZ R4,CLOS1
LJMP CHOOSE
;=====开关箱2=======
CLOSE2:MOV R4,#6
MOV 32H,40H
CLO2:LCALL D2
MOV 40H,P2
MOV P2,32H
LCALL D2
MOV P2,40H
DJNZ R4,CLO2
MOV A,40H
CLR CY
SUBB A,#00H
JZ FULL
LJMP START
;======箱满提醒======
FULL:SETB P0.7
SETB P0.1
;=====显示FULL====
CLR P3.3
MOV P1,#71H
LCALL D0
SETB P3.3
CLR P3.2
MOV P1,#3EH
LCALL D0
SETB P3.2
CLR P3.1
MOV P1,#38H
LCALL D0
SETB P3.1
CLR P3.0
MOV P1,#38H
LCALL D0
SETB P3.0
;===查询“管”,“取”==
CLR P0.5
JB P0.0,N36
LCALL D1
JB P0.0,N36
LCALL RING
SETB P0.0
SETB P1.5
ORL P3,#0FH
LJMP ADMIN
N36:SETB P0.5
CLR P0.7
JB P0.1,FULL
LCALL D1
JB P0.1,FULL
LCALL RING
SETB P0.1
SETB P0.7
ORL P3,#0FH
LJMP TAKE
;=======取物程序=====
TAKE:MOV R0,#03H
MOV R1,#03H
MOV R2,#03H
MOV P1,#40H
CLR P3.4
LJMP KEY
;===用户取物密码校验===
TEXT2:MOV A,30H
展开阅读全文