找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3299|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

基于AT89C51單片機(jī)電子密碼鎖設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:500398 發(fā)表于 2019-5-31 10:52 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
1.利用單片機(jī)設(shè)計(jì)一個(gè)簡單的以8位邏輯電平開關(guān)K0~K7作為8位密碼輸入,設(shè)兩路密碼鎖,第一路密碼為10101010,第二路密碼為11110000。
2.以8個(gè)發(fā)光二極管作為輸出,當(dāng)輸入的密碼與第一路密碼相同時(shí),第一個(gè)發(fā)光二極管點(diǎn)亮。當(dāng)輸入的密碼與第二路密碼相同時(shí),第二個(gè)發(fā)光二極管點(diǎn)亮。如果輸入的密碼與兩路密碼都不同,則8個(gè)發(fā)光二極管全部點(diǎn)亮。

3.必須先輸入第一路密碼,然后輸入第二路密碼才能使第二個(gè)發(fā)光二極管點(diǎn)亮。
不知道為啥程序輸入進(jìn)去后沒法實(shí)現(xiàn)上面這些功能,請(qǐng)大佬幫忙看看

DATA_IN EQU  8000H
DATA_OUT EQU  8100H

ORG    0100H
MOV A,#0FFH
MOV DPTR,#DATA_OUT
MOVX @DPTR,A
LOOP:
MOV DPTR,#DATA_IN
MOVX A,@DPTR

CJNE A,#10101010B,LOOP1
MOV DPTR,#DATA_OUT
MOV A,#0FEH
MOV B,A
MOVX @DPTR,A
LOOP1:
CJNE A,#11110000B,LOOP
MOV A,B
CJNE A,#0FEH,LOOP
MOV DPTR,#DATA_OUT
MOV A,#0FDH
ANL A,B
MOVX @DPTR,A
SJMP LOOP
END


電子密碼鎖.png (174.45 KB, 下載次數(shù): 75)

電子密碼鎖.png
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1080331 發(fā)表于 2023-5-29 18:22 | 只看該作者
經(jīng)過查看你提供的程序,發(fā)現(xiàn)有一些問題:

1.在程序一開始,將 A 寄存器設(shè)置為 FFH 后,存儲(chǔ)到 DATA_OUT 地址對(duì)應(yīng)的內(nèi)存中,這樣會(huì)使 8 個(gè)發(fā)光二極管全部點(diǎn)亮。但是,在后面的程序中并沒有進(jìn)行清零操作,因此需要在程序一開始,將 A 寄存器設(shè)置為 00H 或者其他任意值,以保證 8 個(gè)發(fā)光二極管初始狀態(tài)為熄滅。

2.第一個(gè)密碼輸入正確后,程序進(jìn)入了 LOOP1 標(biāo)簽處,但是循環(huán)內(nèi)部沒有加入等待第二個(gè)密碼輸入的語句。因此程序會(huì)直接跳回 LOOP 標(biāo)簽處,從而導(dǎo)致第二個(gè)密碼輸入無法進(jìn)行判斷。

3.在第二個(gè)密碼判斷處,需要使用 ANL 指令進(jìn)行按位與操作,并且需要先將 A 寄存器與 B 寄存器進(jìn)行交換,再進(jìn)行 ANL 操作。這樣才能正確的判斷第二個(gè)密碼是否輸入正確。

下面是修改后的代碼:

DATA_IN EQU  8000H
DATA_OUT EQU  8100H

ORG    0100H
MOV A,#00H ; 將 A 寄存器設(shè)置為 00H
MOV DPTR,#DATA_OUT
MOVX @DPTR,A ; 將 A 寄存器存儲(chǔ)到 DATA_OUT 地址對(duì)應(yīng)的內(nèi)存中
LOOP:
MOV DPTR,#DATA_IN
MOVX A,@DPTR

CJNE A,#10101010B,LOOP1
MOV DPTR,#DATA_OUT
MOV A,#0FEH
MOVX @DPTR,A
; 等待第二個(gè)密碼輸入
LOOP2:
MOVX A,@DPTR
CJNE A,#10101010B,LOOP2
MOV B,#0FFH ; 將 B 寄存器設(shè)置為 FFH,準(zhǔn)備進(jìn)行第二個(gè)密碼判斷
SJMP LOOP1
LOOP1:
CJNE A,#11110000B,LOOP
XCH A,B ; 交換 A 和 B 的值
ANL A,#11110000B ; 按位與操作,判斷第二個(gè)密碼是否正確
MOV DPTR,#DATA_OUT
JZ RIGHT_TWO ; 如果按位與結(jié)果為0,則說明第二個(gè)密碼輸入正確,跳到 RIGHT_TWO 標(biāo)簽處
MOV A,B
CJNE A,#0FEH,LOOP2 ; 如果第一個(gè)密碼輸入正確,但第二個(gè)密碼輸入不正確,則重新等待第二個(gè)密碼輸入
MOV DPTR,#DATA_OUT
MOV A,#0FDH
MOVX @DPTR,A ; 如果兩個(gè)密碼都不正確,則將 8 個(gè)發(fā)光二極管全部點(diǎn)亮
SJMP LOOP

RIGHT_TWO:
MOV DPTR, #DATA_OUT
MOV A, #0FDH
SWAP A ; 將 A 寄存器高低4位交換
ANL A, #00000011B ; 取出當(dāng)前應(yīng)該點(diǎn)亮的發(fā)光二極管,并將其對(duì)應(yīng)的位設(shè)為0
MOVX @DPTR, A ; 將結(jié)果存儲(chǔ)到 DATA_OUT 地址對(duì)應(yīng)的內(nèi)存中
SJMP LOOP

END

評(píng)分

參與人數(shù) 1黑幣 +60 收起 理由
admin + 60 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表