版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、<p> 《微機(jī)原理及接口技術(shù)》</p><p><b> 課程設(shè)計(jì)說明書</b></p><p> 課題: 門禁電子密碼鎖 </p><p> 專業(yè): 通信工程 </p><p> 班級(jí): **** <
2、/p><p> 姓名: *** </p><p> 學(xué)號(hào): ********* </p><p> 指導(dǎo)老師: </p><p><b> 設(shè)計(jì)任務(wù)</b></p><
3、p> 設(shè)計(jì)題目:門禁電子密碼鎖</p><p> 設(shè)計(jì)目的:通過小型微機(jī)應(yīng)用產(chǎn)品的設(shè)計(jì)與調(diào)試過程,運(yùn)用《微機(jī)原理及接口技術(shù)》課程所學(xué)的基本知識(shí),在設(shè)計(jì)中加以應(yīng)用,進(jìn)而得到理解、鞏固和提高發(fā)展,通過實(shí)踐的過程學(xué)習(xí)掌握分析與解決實(shí)際問題的方法與手段,提高設(shè)計(jì)、編程與調(diào)試的實(shí)際動(dòng)手能力,作為工程技術(shù)工作的一次基本訓(xùn)練。</p><p> 設(shè)計(jì)任務(wù):設(shè)計(jì)一個(gè)以單片機(jī)為核心的門禁密碼鎖。
4、具有密碼開鎖,不同權(quán)限的密碼修改、密碼輸入安全設(shè)置、開門時(shí)段管理等功能。編程并在單片機(jī)實(shí)驗(yàn)板上模擬調(diào)試實(shí)現(xiàn)。</p><p><b> 4、設(shè)計(jì)基本要求:</b></p><p> 1、開機(jī)進(jìn)行接口部件及數(shù)碼顯示器、指示燈、訊響器等自檢。</p><p> 2、密碼分為管理員密碼和用戶密碼:管理員密碼為8位0~9的數(shù)字,而用戶密碼為6位0
5、~9的數(shù)字。</p><p> 3、設(shè)置“0”~“9”的數(shù)字鍵及“ESC”和“ENT”等功能鍵。對按鍵輸入信號(hào)須進(jìn)行軟件消抖處理。</p><p><b> 4、工作模式:</b></p><p> (1)常態(tài):數(shù)碼管顯示時(shí)鐘。</p><p> ?。?)開鎖模式:需輸入6位數(shù)字為0~9的密碼進(jìn)行開鎖。密碼數(shù)字可以
6、由管理員事先設(shè)置保存共普通用戶使用。</p><p> ?。?)管理員操作模式:需輸入8位0~9的密碼,可以進(jìn)行修改用戶密碼、修改管理員密碼、修改進(jìn)門時(shí)段等功能。</p><p> 5、常態(tài)下,八位LED 7段數(shù)碼管顯示時(shí)鐘信息可包括小時(shí)、分鐘、秒鐘。</p><p> 6、只要按下0~9的數(shù)字鍵則轉(zhuǎn)入開鎖狀態(tài),每按一個(gè)數(shù)字鍵使數(shù)碼管從左到右逐次顯示“—”。&l
7、t;/p><p> 7、如果輸入的密碼為6位則和用戶密碼進(jìn)行匹配,匹配一致則開鎖,如果輸入的密碼為8位則和管理員密碼進(jìn)行匹配,匹配一致則進(jìn)入管理員操作模式。</p><p> 8、在密碼輸入狀態(tài)下,輸入滿6位或8位密碼數(shù)據(jù)后,按“ENT”鍵才能進(jìn)行密碼匹配,如果沒滿6位或8位數(shù)字密碼,按“ENT”則不作響應(yīng)。</p><p> 9、輸入的用戶密碼如果匹配則相應(yīng)指示
8、燈亮并且電動(dòng)開門電磁鐵線圈通電1S開門后返回常態(tài);如果輸入不正確,則提示“E”,3S后返回常態(tài),等待下一輪的密碼輸入。</p><p> 10、開鎖模式下可以按“ESC”鍵取消開鎖模式返回常態(tài)。</p><p> 11、管理員操作模式下,管理員可以選擇功能,01功能代表設(shè)置用戶密碼、02功能代表重置管理員密碼、03功能代表設(shè)置進(jìn)門時(shí)間、04功能設(shè)置實(shí)時(shí)鐘。利用ESC鍵返回常態(tài)。<
9、/p><p> 12、管理員操作模式下,01功能可以設(shè)置用戶密碼,輸入新密碼時(shí)需要進(jìn)行確認(rèn)。</p><p> 功能擴(kuò)展提示:(選做)</p><p> 1、管理員操作模式下,02功能重置管理員密碼;</p><p> 2、管理員操作模式下,03功能可以設(shè)置進(jìn)門的開始時(shí)間和結(jié)束時(shí)間。只有在進(jìn)門時(shí)間段輸入用戶密碼才能開鎖。如果開始時(shí)間和結(jié)束
10、時(shí)間均設(shè)置為00:00,則為全天可以按密碼開門;</p><p> 3、管理員操作模式下,04功能實(shí)時(shí)鐘的設(shè)置,利用數(shù)字3和數(shù)字4按鍵實(shí)現(xiàn)對時(shí)和分鐘的調(diào)校,按鍵操作時(shí)實(shí)現(xiàn)快調(diào)功能;</p><p> 4、如果在開鎖模式下12S后沒有按鍵操作則進(jìn)入常態(tài);</p><p> 5、如果在開鎖狀態(tài)下用戶密碼輸入十次均錯(cuò)誤則報(bào)警鎖鍵15分鐘;</p>&l
11、t;p><b> 6、其他功能擴(kuò)展。</b></p><p><b> 總體方案設(shè)計(jì)與論證</b></p><p><b> 1、總體方案設(shè)計(jì):</b></p><p> 以微處理器AT90C51為核心,利用P0,P1和P2.4、P2.5、P2.6、P2.7這些I/O口實(shí)現(xiàn)數(shù)據(jù)的傳送;利
12、用I2C總線通信協(xié)議和24C02芯片進(jìn)行密碼的核對和修改;4×4矩陣鍵盤用于密碼的輸入與修改以及時(shí)鐘值的修改;數(shù)碼管用于顯示時(shí)間和密碼輸入和修改狀態(tài);密碼輸入正確后通過P2.4口控制繼電器工作打開門;P1口用與讀入按鍵狀態(tài)來判斷是否有按鍵按下然后執(zhí)行相應(yīng)的按鍵功能;P0口控制數(shù)碼管的段碼輸出,P2.5,P2.6,P2.7連接到74ls138譯碼器來控制數(shù)碼管的位選碼輸出。</p><p> 2、按鍵消
13、抖方案設(shè)計(jì)與論證:</p><p> 2.1、軟件延時(shí)消抖法</p><p> 軟件延時(shí)消抖通過調(diào)用延時(shí)子程序來判斷按鍵是否是抖動(dòng),若是抖動(dòng),則延時(shí)后按鍵狀態(tài)和無按鍵按下時(shí)狀態(tài)一樣,若不是抖動(dòng),則按鍵狀態(tài)和無按鍵按下時(shí)狀態(tài)不一樣,確定為按鍵按下。</p><p> 2.2、滾動(dòng)濾波法消抖</p><p> 滾動(dòng)濾波法通過采集按鍵最近的
14、5次狀態(tài)來判斷是否有抖動(dòng),用5個(gè)連續(xù)的存數(shù)單元分別存按鍵最近的5次狀態(tài),再用2個(gè)單元來存放穩(wěn)定時(shí)的狀態(tài)值,每次掃描按鍵時(shí)把上一次的狀態(tài)值都存入后一個(gè)單元,然后把當(dāng)前按鍵的狀態(tài)值存入第一個(gè)單元,這樣依次進(jìn)行下去,若不是抖動(dòng),則5個(gè)單元的值都相等,若是抖動(dòng),則5個(gè)單元的值不全相等;之后把5個(gè)單元相等時(shí)的值存入其中一個(gè)穩(wěn)定狀態(tài)存儲(chǔ)單元,另一個(gè)則是存上一次的穩(wěn)定值,當(dāng)上一次穩(wěn)定值是無按鍵按下時(shí)的值,當(dāng)前穩(wěn)定值不等于無按鍵按下時(shí)的值時(shí),則判定為按
15、鍵按下。</p><p> 軟件延時(shí)會(huì)有一個(gè)等待按鍵釋放的過程,因此按下按鍵數(shù)碼管會(huì)滅一小段時(shí)間,結(jié)果不太理想,但滾動(dòng)濾波法只判斷按鍵按下的那個(gè)狀態(tài)(下降沿),因此不會(huì)出現(xiàn)數(shù)碼管滅的情況,因此采用滾動(dòng)濾波法。</p><p> 3、按鍵掃描方案設(shè)計(jì)與論證:</p><p> 3.1、逐行(列)掃描法</p><p> 逐行掃描法把行(
16、列)線其中一位置為0,然后觀察列(行)線電平變化,若為0了,則把行首值+列值得到鍵值確定哪顆按鍵按下,若沒變化在把后一行(列)線置為0,依次掃描過去。</p><p><b> 3.2、線反轉(zhuǎn)法</b></p><p> 線反轉(zhuǎn)法先把行線設(shè)為輸入,列線設(shè)為輸出且輸出0,然后讀取行線的狀態(tài)值暫存寄存器,然后行列線互換,列先設(shè)為輸入,行線設(shè)為輸出,讀取列線的值之后和之
17、前行線的值相或得到每個(gè)鍵的狀態(tài)值,查表找出哪顆鍵被按下即可。</p><p> 逐行(列)掃描法比較麻煩,因此采用線反轉(zhuǎn)法。</p><p> 4、數(shù)碼管顯示方案設(shè)計(jì):</p><p> 數(shù)碼管顯示數(shù)字時(shí)是把每個(gè)數(shù)字的段碼送到數(shù)碼管段選口,然后選通數(shù)碼管位選碼,則數(shù)碼管就顯示對應(yīng)的數(shù)字,每個(gè)數(shù)字的段碼采用查表的方式查找,把每個(gè)數(shù)字的段碼都寫在一個(gè)數(shù)組,通過數(shù)組
18、下標(biāo)查找到對應(yīng)段碼送出去顯示。輸入密碼時(shí)數(shù)碼管要顯示輸入的狀態(tài)‘-’,采用一個(gè)數(shù)組存儲(chǔ)‘-’,初始數(shù)組內(nèi)容全0,數(shù)碼管全滅,每輸入一個(gè)密碼,該數(shù)組對應(yīng)位置就存入‘-’的段碼,然后通過緩沖單元輸出到數(shù)碼管。</p><p> 總框圖及總體軟件設(shè)計(jì)說明</p><p><b> 系統(tǒng)總框圖:</b></p><p><b> 圖1&
19、lt;/b></p><p> 2、硬件模塊功能說明</p><p> 鍵盤模塊:鍵盤共16個(gè)按鍵,10個(gè)是0~9數(shù)字鍵,1個(gè)返回鍵(ESC),1個(gè)確認(rèn)件(ENT),1個(gè)設(shè)置用戶密碼鍵,1個(gè)設(shè)置管理員密碼鍵,1個(gè)調(diào)整時(shí)鐘鍵。當(dāng)數(shù)字鍵是輸入對應(yīng)的0~9數(shù)字的,返回鍵是取消所有調(diào)整返回到常態(tài)顯示時(shí)間的,確認(rèn)鍵是對用戶或管理員的操作進(jìn)行確認(rèn)的,管理員模式下修改密碼按鍵才有效,調(diào)時(shí)鐘按鍵
20、按下則暫停時(shí)鐘走時(shí)進(jìn)行時(shí)間修改。</p><p><b> 按鍵的分配如圖:</b></p><p><b> 注:</b></p><p><b> U:設(shè)置用戶密碼;</b></p><p> A:設(shè)置管理員密碼;</p><p><b
21、> ESC:返回;</b></p><p><b> ENT:確認(rèn);</b></p><p><b> 圖2</b></p><p> 數(shù)碼管模塊:常態(tài)下顯示時(shí)間值,開鎖模式下顯示輸入的密碼狀態(tài),以‘-’來顯示,管理員模式下全部顯示’-’,調(diào)整時(shí)間時(shí)顯示所調(diào)整的時(shí)間值。</p>&l
22、t;p> 繼電器模塊:當(dāng)用戶密碼輸入正確時(shí)由單片機(jī)發(fā)出指令讓繼電器工作打開門。</p><p> 24C02模塊:保存用戶密碼和管理員密碼,與單片機(jī)通過I2C總線協(xié)議進(jìn)行通信,I2C通信只有一根數(shù)據(jù)線SDA和一根時(shí)鐘線SCL,通信前由單片機(jī)發(fā)出一個(gè)起始信號(hào),之后在時(shí)鐘線SCL高電平期間把數(shù)據(jù)線SDA上的數(shù)據(jù)發(fā)送給24C02,在時(shí)鐘線高電平期間數(shù)據(jù)先上的數(shù)據(jù)必須保持,SCL為低電平是SDA上的數(shù)據(jù)才能發(fā)生
23、改變,當(dāng)發(fā)送完一個(gè)字節(jié)后從器件24C02會(huì)向單片機(jī)發(fā)送一個(gè)應(yīng)答信號(hào),單片機(jī)接收到應(yīng)答信號(hào)后可以發(fā)出終止信號(hào)終止通信。</p><p><b> 3、軟件設(shè)計(jì)說明</b></p><p><b> 主程序:</b></p><p> 主程序是整個(gè)程序的主體,可以對各個(gè)子程序進(jìn)行調(diào)用,協(xié)調(diào)各個(gè)子程序之間的聯(lián)系,控制著整個(gè)
24、系統(tǒng)的工作流程。系統(tǒng)上電后進(jìn)入主程序,先對系統(tǒng)各個(gè)模塊自檢,后對系統(tǒng)初始化,之后就循環(huán)進(jìn)行主流程工作。</p><p><b> 主程序流程圖:</b></p><p><b> 圖3</b></p><p><b> 局部程序設(shè)計(jì)說明</b></p><p><b
25、> 按鍵檢測程序</b></p><p><b> 代碼如下:</b></p><p> void sm_key() </p><p><b> {</b></p><p> int i=0,j;</p><p> uchar a,b,c,k;&
26、lt;/p><p><b> key=0x0f;</b></p><p> lb[4]=lb[3];</p><p> lb[3]=lb[2];</p><p> lb[2]=lb[1];</p><p> lb[1]=lb[0];</p><p> lb[0]=k
27、ey; //滾動(dòng)濾波存儲(chǔ)</p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><p> if(lb[j]!=lb[j+1]) //還要有兩個(gè)單元不相等則退出函數(shù)</p><p><b> return;</b></p><
28、;p> k=lb[j+1];</p><p><b> }</b></p><p> pd[1]=pd[0];</p><p> pd[0]=k; //穩(wěn)定狀態(tài)的值存入pd[1]和pd[0]</p><p> if((pd[1]==0x0f)&&(pd[0]!=0x0f)) //pd[1]
29、是0x0f,pd[0]不是0x0f則按下</p><p><b> {</b></p><p> key=0x0f; a=key&0x0f;</p><p> key=0xf0; b=key&0xf0;</p><p> c=a|b; //線反轉(zhuǎn)后鍵狀態(tài)值存入c</p><p&
30、gt; while(c!=key_code[i]) i++; //查找第幾個(gè)按鍵按下</p><p> keyvalue=i;</p><p><b> if(y==0)</b></p><p><b> {</b></p><p> seg=sdm[keyvalue]; //按鍵對應(yīng)段碼
31、送出顯示</p><p> x++; //記錄按鍵按下次數(shù)</p><p><b> return;</b></p><p><b> }</b></p><p> switch(keyvalue) //執(zhí)行相應(yīng)按鍵功能</p><p><b> {<
32、;/b></p><p> case(0):k0(); break;</p><p> case(1):k1(); break;</p><p> case(2):k2(); break;</p><p> case(3):k3(); break; </p><p> case(4):k4(); bre
33、ak;</p><p> case(5):k5(); break;</p><p> case(6):k6(); break;</p><p> case(7):k7(); break;</p><p> case(8):k8(); break;</p><p> case(9):k9(); break;&l
34、t;/p><p> case(10):k10(); break;</p><p> //case(11):k11(); break;</p><p> case(12):k12(); break;</p><p> case(13):k13(); break;</p><p> case(14):k14(); b
35、reak;</p><p> case(15):k15(); break;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> 程序開始先進(jìn)行滾動(dòng)存儲(chǔ),lb[5]這
36、個(gè)數(shù)組用來存儲(chǔ)最近5次按鍵狀態(tài)值的,接著判斷這5個(gè)單元內(nèi)容是否相等,如果不等則退出該函數(shù),相等則接著判斷是否是按下,若pd[1]為0x0f且pd[0]不為0x0f則是按鍵按下,然后查表找到與當(dāng)前按下的鍵狀態(tài)值相等的位置,記錄得到鍵值,執(zhí)行對應(yīng)鍵功能。</p><p><b> 程序流程如圖:</b></p><p><b> 否</b><
37、;/p><p><b> 是</b></p><p><b> 圖4</b></p><p><b> 拆字程序</b></p><p><b> 代碼如下:</b></p><p><b> void cz()&l
38、t;/b></p><p><b> {</b></p><p> if(y==1&&(ms==0||ms==4)) //常態(tài)和繼電器工作下拆時(shí)間單元</p><p><b> {</b></p><p> seg_disp[0]=sdm[clk_value[0]/10
39、];</p><p> seg_disp[1]=sdm[clk_value[0]%10];</p><p> seg_disp[2]=0x40;</p><p> seg_disp[3]=sdm[clk_value[1]/10];</p><p> seg_disp[4]=sdm[clk_value[1]%10];</p>
40、<p> seg_disp[5]=0x40;</p><p> seg_disp[6]=sdm[clk_value[2]/10];</p><p> seg_disp[7]=sdm[clk_value[2]%10];</p><p><b> }</b></p><p> if(y==2||y==
41、3) //開鎖模式和管理員模式把jm_disp[8]的內(nèi)容給緩沖單元</p><p><b> {</b></p><p> seg_disp[0]=jm_disp[0];</p><p> seg_disp[1]=jm_disp[1];</p><p> seg_disp[2]=jm_disp[2];</
42、p><p> seg_disp[3]=jm_disp[3];</p><p> seg_disp[4]=jm_disp[4];</p><p> seg_disp[5]=jm_disp[5];</p><p> seg_disp[6]=jm_disp[6];</p><p> seg_disp[7]=jm_dis
43、p[7];</p><p><b> }</b></p><p><b> }</b></p><p> 拆字程序在常態(tài)不做任何調(diào)整下和打開門時(shí)把時(shí)間值存儲(chǔ)數(shù)組里面的內(nèi)容拆到數(shù)碼管顯示緩沖單元里面暫存,當(dāng)處于開鎖模式或管理員模式下則把jm_disp[8]數(shù)組里面的內(nèi)容一一對應(yīng)賦給數(shù)碼管顯示緩沖單元,開鎖模式下,每輸入
44、一個(gè)密碼,jm_disp[8]單元里面就回存一個(gè)‘-’的段碼,在界面上顯示出密碼輸入的位數(shù),管理員模式下,jm_disp[8]里面全部存一個(gè)相同的段碼,讓數(shù)碼管顯示當(dāng)前是管理員操作界面。</p><p><b> 程序流程如圖:</b></p><p><b> 否</b></p><p><b> 是&l
45、t;/b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 圖5</b></p><p><b> 顯示程序</b></p><p><b> 代碼如下
46、:</b></p><p> void disp()</p><p><b> {</b></p><p><b> int i;</b></p><p> for(i=0;i<8;i++) //8個(gè)數(shù)碼管逐個(gè)點(diǎn)亮</p><p><b>
47、 {</b></p><p> switch(i) //送出位選碼</p><p><b> {</b></p><p> case(0):LSA=0; LSB=0; LSC=0; break;</p><p> case(1):LSA=1; LSB=0; LSC=0; break;</p&g
48、t;<p> case(2):LSA=0; LSB=1; LSC=0; break;</p><p> case(3):LSA=1; LSB=1; LSC=0; break;</p><p> case(4):LSA=0; LSB=0; LSC=1; break;</p><p> case(5):LSA=1; LSB=0; LSC=1; br
49、eak;</p><p> case(6):LSA=0; LSB=1; LSC=1; break;</p><p> case(7):LSA=1; LSB=1; LSC=1; break;</p><p><b> }</b></p><p><b> if(y==0)</b></p&
50、gt;<p><b> {</b></p><p> seg=0xff; //剛啟動(dòng)時(shí)數(shù)碼管段碼全1逐個(gè)檢測數(shù)碼管</p><p> Delay1ms(500); //亮0.5秒</p><p><b> }</b></p><p><b> else</b&
51、gt;</p><p><b> {</b></p><p> seg=seg_disp[i]; //數(shù)碼管顯示緩沖單元的段碼點(diǎn)亮數(shù)碼管</p><p> Delay1ms(1);</p><p><b> }</b></p><p> seg=0x00; //消除
52、竄顯</p><p><b> }</b></p><p><b> }</b></p><p> 剛啟動(dòng)系統(tǒng)時(shí),顯示程序逐個(gè)檢測數(shù)碼管,把數(shù)碼管8段全部點(diǎn)亮,自檢完成后,顯示程序把數(shù)碼管顯示緩沖單元里的內(nèi)容送出到數(shù)碼管段碼口點(diǎn)亮數(shù)碼管,使之顯示相應(yīng)的數(shù)據(jù),該程序里是8個(gè)數(shù)碼管逐個(gè)點(diǎn)亮過去,每顯示完一個(gè)數(shù)碼管都會(huì)滅掉
53、數(shù)碼管,等下一次循環(huán)在點(diǎn)亮下一個(gè)數(shù)碼管,目的是為了消除數(shù)碼管之間的竄擾顯示。</p><p><b> 程序流程如圖:</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 是</b><
54、/p><p><b> 否</b></p><p><b> 是</b></p><p><b> 圖6</b></p><p><b> 核對密碼程序</b></p><p><b> 代碼如下:</b>
55、;</p><p> void open_lock()</p><p><b> {</b></p><p> uint i,i1;</p><p><b> uchar j;</b></p><p> if((y==2&&w==1)&&am
56、p;v<8)</p><p><b> {</b></p><p> mima[v]=keyvalue; //開鎖模式下把輸入的密碼逐個(gè)存入輸入緩沖單元</p><p> jm_disp[v]=0x40; //界面顯示‘-’</p><p> w=0; v=v+1; //指向下一位數(shù)碼管</p>
57、<p><b> }</b></p><p> if((ent==1)&&((lock==6)||(lock==8))) //進(jìn)行密碼的核對</p><p><b> {</b></p><p> for(i=0;i<lock;i++)</p><p>&
58、lt;b> {</b></p><p> if(lock==6) //判斷是用戶密碼還是管理員密碼</p><p><b> {</b></p><p><b> j=0x00;</b></p><p> tmima[i]=At24c02Read(j); //從24C02
59、讀取用戶密碼存入讀取緩沖單</p><p><b> //元</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p><b>
60、 j=0x06;</b></p><p> tmima[i]=At24c02Read(j); //從24C02讀取管理員密碼存入讀取緩沖</p><p><b> //單元</b></p><p><b> }</b></p><p> j=j+1; </p>
61、;<p><b> }</b></p><p> for(i=0;i<lock;i++)</p><p><b> {</b></p><p> if(mima[i]!=tmima[i]) //核對密碼是否正確</p><p><b> {</b>
62、</p><p> seg=0x79; LSA=1; LSB=1; LSC=1; //密碼錯(cuò)誤數(shù)碼管顯示‘E’提示</p><p> Delay1ms(3000); //顯示3s</p><p> y=1; ent=0; v=0; lock=0; //進(jìn)入常態(tài),標(biāo)志變量恢復(fù)</p><p> for(i1=0;i1<8;i1++
63、)</p><p><b> {</b></p><p> jm_disp[i1]=0x00; </p><p> mima[i1]=0x00; //恢復(fù)初始狀態(tài)后退出函數(shù)</p><p><b> }</b></p><p><b> return;&l
64、t;/b></p><p><b> }</b></p><p><b> }</b></p><p> if(lock==6) //用戶密碼輸入正確</p><p><b> {</b></p><p> OP=0; ms=4;<
65、/p><p> y=1; v=0; lock=0; //繼電器工作打開門</p><p> for(i1=0;i1<8;i1++)</p><p><b> {</b></p><p> jm_disp[i1]=0x00;</p><p> mima[i1]=0x00; //恢復(fù)初始狀
66、態(tài)后返回</p><p><b> }</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> y=3; v=0; lock=0;
67、//管理員密碼輸入正確進(jìn)入管理員模式</p><p> for(i=0;i<8;i++)</p><p><b> {</b></p><p> jm_disp[i]=0x08; //恢復(fù)初始狀態(tài)后返回</p><p> mima[i]=0x00;</p><p><b>
68、 }</b></p><p><b> }</b></p><p><b> lock=0;</b></p><p><b> }</b></p><p> ent=0; //密碼沒輸完,確認(rèn)標(biāo)志重新清零</p><p><b
69、> }</b></p><p><b> 程序流程如圖:</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><
70、b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b>
71、 圖7</b></p><p> 核對密碼程序先判斷密碼是否輸入完成,用戶密碼6位,管理員密碼8位,若輸入完成則判斷是用戶密碼還是管理員密碼,然后從24C02讀取所存的正確密碼進(jìn)行核對,若密碼是6位則進(jìn)行用戶密碼的核對,若是8位則進(jìn)行管理員密碼的核對,用戶密碼正確則繼電器工作開門,管理員密碼正確則進(jìn)入管理員模式,管理員模式下可進(jìn)行用戶密碼和管理員密碼的修改,若密碼輸入錯(cuò)誤則數(shù)碼管提示錯(cuò)誤信息‘E’
72、,3s后返回常態(tài)。</p><p><b> 中斷服務(wù)程序</b></p><p><b> 代碼如下:</b></p><p> void time0() interrupt 1</p><p><b> {</b></p><p><b
73、> n1=n1-1;</b></p><p> if(n1==0) //是否滿1s?</p><p><b> {</b></p><p> n1=16; //n1重裝初值</p><p> clk_value[2]=clk_value[2]+1; //秒單元加1</p><
74、;p> if(y==2) //開鎖模式下長時(shí)間不輸密碼則開始計(jì)數(shù)</p><p> count=count+1;</p><p> if(clk_value[2]==60) //滿1分?</p><p><b> {</b></p><p> clk_value[2]=0; //秒單元清零</p&g
75、t;<p> clk_value[1]=clk_value[1]+1; //分單元加1</p><p> if(clk_value[1]==60) //滿1小時(shí)?</p><p><b> {</b></p><p> clk_value[1]=0; //分單元清零</p><p> clk_va
76、lue[0]=clk_value[0]+1; //時(shí)單元加1</p><p> if(clk_value[0]==24) //滿一天?</p><p><b> {</b></p><p> clk_value[0]=0; //時(shí)單元清零</p><p><b> }</b></p&g
77、t;<p><b> }</b></p><p><b> } </b></p><p><b> } </b></p><p><b> }</b></p><p> T0計(jì)數(shù)中斷一次時(shí)間還達(dá)不到1s,通過n1變量循環(huán)控制達(dá)
78、到1s后再執(zhí)行中斷服務(wù)程序,秒單元加1,滿60s后分單元又加1,滿60小時(shí)時(shí)單元加1,滿24小時(shí)時(shí)單元清零。</p><p><b> 程序流程如圖:</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b>
79、 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是</b></p><p><b> 否</b></p><p><b> 是<
80、;/b></p><p><b> 圖8</b></p><p><b> 系統(tǒng)資源分配</b></p><p><b> 表1:</b></p><p><b> 表2:</b></p><p><b>
81、 系統(tǒng)功能與操作說明</b></p><p> 該門禁電子密碼鎖系統(tǒng)通過輸入數(shù)字密碼來控制門的打開,常態(tài)下顯示時(shí)間,當(dāng)0~9數(shù)字鍵被按下時(shí)則進(jìn)入開鎖模式,數(shù)碼管顯示當(dāng)前所輸入的密碼的狀態(tài),其中用戶密碼是6位,管理員密碼是8位。輸入6位的用戶密碼且按確認(rèn)鍵后則進(jìn)行開門的操作,若密碼輸入正確,門則打開,輸入錯(cuò)誤則顯示密碼錯(cuò)誤信息‘E’,3s后返回常態(tài);輸入8位的管理員密碼且按確認(rèn)鍵后進(jìn)行管理員密碼的核對
82、,若輸入正確則進(jìn)入管理員模式,錯(cuò)誤則提示錯(cuò)誤信息‘E’,3S后返回常態(tài)。若輸入密碼時(shí)長時(shí)間無按鍵動(dòng)作則6秒后自動(dòng)退出,返回常態(tài)。該系統(tǒng)有設(shè)置用戶密碼、設(shè)置管理員密碼、設(shè)置時(shí)間和控制門的打開等功能。以下是每個(gè)功能的具體操作方法:</p><p> 控制門打開功能:鍵盤上通過0~9數(shù)字鍵輸入6位密碼,按下確認(rèn)鍵(ENT)則進(jìn)行密碼的核對,密碼正確門打開;返回鍵(ESC)則取消操作,返回常態(tài)。</p>
83、<p> 設(shè)置用戶密碼:鍵盤上通過0~9數(shù)字鍵輸入8位管理員密碼,按下確認(rèn)鍵(ENT),正確則進(jìn)入管理員模式,此時(shí)按下設(shè)置用戶密碼按鍵(U)則進(jìn)行用戶密碼的修改,輸入新的用戶密碼后確定則修改成功;返回鍵(ESC)取消所有操作返回常態(tài)。</p><p> 設(shè)置管理員密碼:鍵盤上通過0~9數(shù)字鍵輸入8位管理員密碼,按下確認(rèn)鍵(ENT),正確則進(jìn)入管理員模式,此時(shí)按下設(shè)置管理員密碼按鍵(A)則進(jìn)行管理員密
84、碼的修改,輸入新的管理員密碼后確定則修改成功;返回鍵(ESC)取消所有操作返回常態(tài)。</p><p> 設(shè)置時(shí)間:按下調(diào)時(shí)按鍵則暫停時(shí)鐘走時(shí)進(jìn)行時(shí)間的調(diào)整,此時(shí)通過鍵盤上0~9數(shù)字鍵就可以修改時(shí)間,修改順序:從時(shí)間的小時(shí)到分鐘再到秒,最后按下確認(rèn)則完成時(shí)間的修改;返回鍵(ESC)取消操作返回常態(tài)。</p><p><b> 調(diào)試記錄及調(diào)試結(jié)果</b></p&
85、gt;<p> 調(diào)試中出現(xiàn)了一下問題:</p><p> 開鎖模式下密碼輸入位數(shù)大于8位則按下確定鍵無反應(yīng),返回鍵也無法返回常態(tài)</p><p> 修改密碼時(shí)輸入6位和8位密碼時(shí)不按確認(rèn)鍵再多按幾次數(shù)字鍵后再按確認(rèn)鍵系統(tǒng)運(yùn)行也亂掉</p><p> 在修改時(shí)間時(shí)當(dāng)時(shí)間輸入完成不按確認(rèn)鍵再多按幾次數(shù)字鍵后再按確認(rèn)系統(tǒng)也運(yùn)行亂掉</p>
86、<p> 出現(xiàn)以上問題的原因是程序中沒有加入容錯(cuò)處理,之后加入容錯(cuò)處理后,開鎖模式下密碼最多只能輸入8位,滿8位后再按數(shù)字鍵則不進(jìn)行鍵功能處理,密碼就只存前8次所輸入的,后面的一律不管,修改密碼和修改時(shí)間時(shí)也是一樣的做法。修復(fù)后程序運(yùn)行正常,不在出現(xiàn)以上錯(cuò)誤,其他錯(cuò)誤暫時(shí)沒發(fā)現(xiàn)。</p><p><b> 課程設(shè)計(jì)總結(jié)</b></p><p> 通
87、過這次單片機(jī)的課程設(shè)計(jì),讓我對單片機(jī)有了更深一步的了解,能夠更加熟練的用單片機(jī)控制外部器件去完成相應(yīng)的功能,之前課堂上一直在用匯編寫程序,用匯編是為了讓我們對單片機(jī)內(nèi)部寄存器有更深的了解,但這次課設(shè)我采用C語言編寫程序,也體會(huì)到了兩種語言各自的優(yōu)缺點(diǎn),也懂得了C對51單片機(jī)的一些操作方法,老師平時(shí)強(qiáng)調(diào)的程序模塊化在這次的程序中也體現(xiàn)了出來,模塊化思想也進(jìn)一步加深。同時(shí),對編寫這種較長的程序也有了自己的思路,就是先搭起程序的框架,然后進(jìn)行
88、模塊化的編寫,然后整個(gè)程序就由這些模塊組合起來,這樣調(diào)試也方便,易于找錯(cuò)。要是想以前想起什么寫什么會(huì)讓程序的邏輯看起來很亂,調(diào)試起來也特別不方便,而且可讀性也不高,只要程序進(jìn)行模塊化編寫,運(yùn)行時(shí)哪里出問題很容易知道是哪個(gè)模塊的,然后找到相應(yīng)模塊去找錯(cuò)誤,這樣效率也大大提高了。</p><p> 這次設(shè)計(jì)用到了片外存儲(chǔ)器24C02,里所存內(nèi)容掉電不丟失,所以用來存儲(chǔ)密碼,單片機(jī)和24C02通信時(shí)用I2C總線進(jìn)行的
89、,這個(gè)模塊之前也沒接觸過,在這次課設(shè)中也學(xué)習(xí)并懂得了I2C總行通信協(xié)議,也增加了自己在這方面的知識(shí),學(xué)習(xí)了單片機(jī)更多的功能的使用。</p><p> 在之后的時(shí)間里我會(huì)更加努力,讓自己在單片機(jī)方面更加熟練,對單片機(jī)的應(yīng)用懂得更多。在最后這一段時(shí)間里,我會(huì)不斷提升自己,朝著自己的目標(biāo)發(fā)展。</p><p><b> 附錄:</b></p><p&
90、gt;<b> 源程序代碼:</b></p><p> //主函數(shù)main()</p><p> #include<reg51.h></p><p> #include"e_lock.h"</p><p> #include"I2C.h"</p>
91、<p> uchar code </p><p> sdm[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //0~f段碼</p><p> uchar code</p><p> key_code[16]={0xee,0
92、xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}; //按鍵碼</p><p> uchar clk_value[3]={0,0,0}; //時(shí),分,秒存儲(chǔ)單元</p><p> uchar seg_disp[8]; //數(shù)碼管顯示單元</p><p> uch
93、ar mima[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //密碼緩沖存放單元</p><p> uchar tmima[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //密碼讀取存放單元</p><p> uchar jm_disp[8]={0x00,0x00,0x00,0x00,0x00
94、,0x00,0x00,0x00}; //界面顯示密碼狀態(tài)單元</p><p> uchar lb[5],pd[2]; //滾動(dòng)濾波按鍵檢測法存儲(chǔ)數(shù)組</p><p> uchar keyvalue,count=0,x=0,y=0,w=0,n1=16,n2=50,ent=0,lock=0,v=0,ms=0;</p><p> /*****************
95、*************************************************************</p><p> n1用于控制中斷循環(huán)達(dá)到定時(shí)1s,n2控制繼電器工作時(shí)間,ent用于標(biāo)記確認(rèn)鍵是否按下, ms=0是不進(jìn)行任何調(diào)整,ms=1調(diào)時(shí)間,ms=2改用戶密碼,ms=3改管理員密碼,ms=4繼電器工作,剛啟動(dòng)(y=0),常態(tài)(y=1),開鎖模式(y=2),管理
96、員模式(y=3),keyvalue記錄鍵值,count控制輸密碼時(shí)間,v用于密碼和時(shí)間逐個(gè)賦值,x用于記錄開機(jī)自檢時(shí)按鍵次數(shù),w=1是0~9密碼鍵有按下,lock標(biāo)記是幾位密碼 *</p><p> ******************************************************************************/</p><p> void
97、main()</p><p><b> {</b></p><p> check(); //開機(jī)自檢</p><p> sys_start(); //初始化函數(shù)</p><p><b> while(1)</b></p><p><b> {</
98、b></p><p> sm_key(); //按鍵檢測</p><p> cz(); //拆字函數(shù)</p><p> disp(); //顯示數(shù)碼管</p><p> open_lock(); //核對密碼</p><p> control();</p><p><
99、;b> }</b></p><p><b> }</b></p><p> /************ T0定時(shí)中斷函數(shù) *************/</p><p> void time0() interrupt 1</p><p><b> {</b></p&g
100、t;<p><b> n1=n1-1;</b></p><p><b> if(n1==0)</b></p><p><b> {</b></p><p><b> n1=16;</b></p><p> clk_value[2]=
101、clk_value[2]+1;</p><p> if(y==2) //開鎖模式下長時(shí)間不輸密碼則開始計(jì)數(shù)</p><p> count=count+1;</p><p> if(clk_value[2]==60) //滿1分?</p><p><b> {</b></p><p> c
102、lk_value[2]=0; //滿1分,秒單元清零</p><p> clk_value[1]=clk_value[1]+1; //分單元加1</p><p> if(clk_value[1]==60) //滿1小時(shí)?</p><p><b> {</b></p><p> clk_value[1]=0; //
103、分單元清零</p><p> clk_value[0]=clk_value[0]+1; //時(shí)單元加1</p><p> if(clk_value[0]==24) //滿1天?</p><p><b> {</b></p><p> clk_value[0]=0; //時(shí)單元清零</p><p
104、><b> }</b></p><p><b> }</b></p><p><b> } </b></p><p><b> } </b></p><p><b> }</b></p><p
105、> /************** 初始化函數(shù) ***************/</p><p> void sys_start()</p><p><b> {</b></p><p> SP=0x60; //堆棧指針初始化</p><p> TMOD=0x11; //T0定時(shí)中斷,工作方式2</
106、p><p><b> TL0=0x00;</b></p><p> TH0=0x00; //裝初值</p><p> EA=1; //總中斷打開</p><p> ET0=1; //T0計(jì)數(shù)中斷打開</p><p> TR0=1; //T0計(jì)數(shù)器開始計(jì)數(shù)</p><p&g
107、t;<b> }</b></p><p> /************** 顯示函數(shù) ****************/</p><p> void disp()</p><p><b> {</b></p><p><b> int i;</b></p>
108、<p> for(i=0;i<8;i++) //循環(huán)點(diǎn)亮8個(gè)數(shù)碼管</p><p><b> {</b></p><p><b> switch(i)</b></p><p><b> {</b></p><p> case(0):LSA=0; L
109、SB=0; LSC=0; break;</p><p> case(1):LSA=1; LSB=0; LSC=0; break;</p><p> case(2):LSA=0; LSB=1; LSC=0; break;</p><p> case(3):LSA=1; LSB=1; LSC=0; break;</p><p> case
110、(4):LSA=0; LSB=0; LSC=1; break;</p><p> case(5):LSA=1; LSB=0; LSC=1; break;</p><p> case(6):LSA=0; LSB=1; LSC=1; break;</p><p> case(7):LSA=1; LSB=1; LSC=1; break;</p><
111、;p><b> }</b></p><p><b> if(y==0)</b></p><p><b> {</b></p><p> seg=0xff; //剛啟動(dòng)模式數(shù)碼管8段全亮</p><p> Delay1ms(500);</p><
112、;p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> seg=seg_disp[i];</p><p> Delay1ms(1);</p><p><b>
113、; }</b></p><p> seg=0x00; //消除躥顯</p><p><b> }</b></p><p><b> }</b></p><p> /**************** 拆字函數(shù) ****************/</p><p&
114、gt;<b> void cz()</b></p><p><b> {</b></p><p> if(y==1&&(ms==0||ms==4)) //常態(tài)下拆字</p><p><b> {</b></p><p> seg_disp[0]=sdm
115、[clk_value[0]/10];</p><p> seg_disp[1]=sdm[clk_value[0]%10];</p><p> seg_disp[2]=0x40;</p><p> seg_disp[3]=sdm[clk_value[1]/10];</p><p> seg_disp[4]=sdm[clk_value[1
116、]%10];</p><p> seg_disp[5]=0x40;</p><p> seg_disp[6]=sdm[clk_value[2]/10];</p><p> seg_disp[7]=sdm[clk_value[2]%10];</p><p><b> }</b></p><p&g
117、t; if(y==2||y==3) //開鎖模式下拆字</p><p><b> {</b></p><p> seg_disp[0]=jm_disp[0];</p><p> seg_disp[1]=jm_disp[1];</p><p> seg_disp[2]=jm_disp[2];</p>
118、<p> seg_disp[3]=jm_disp[3];</p><p> seg_disp[4]=jm_disp[4];</p><p> seg_disp[5]=jm_disp[5];</p><p> seg_disp[6]=jm_disp[6];</p><p> seg_disp[7]=jm_disp[7];&
119、lt;/p><p><b> }</b></p><p><b> }</b></p><p> /**************** 控制函數(shù) ****************/</p><p> void control()</p><p><b> {&l
120、t;/b></p><p> if(count==6) //6秒內(nèi)沒繼續(xù)輸入密碼,返回常態(tài)</p><p><b> {</b></p><p><b> int i;</b></p><p> y=1; v=0; lock=0;</p><p> for(i
121、=0;i<8;i++)</p><p><b> {</b></p><p> jm_disp[i]=0x00;</p><p> mima[i]=0x00;</p><p><b> }</b></p><p><b> }</b>&l
122、t;/p><p><b> if(ms==4)</b></p><p> n2=n2-1; //控制繼電器工作1s</p><p><b> if(n2==0)</b></p><p><b> {</b></p><p> OP=1; n2=50
123、; ms=0; //關(guān)閉繼電器</p><p><b> } </b></p><p><b> }</b></p><p> /****************** 1毫秒延時(shí)函數(shù) ********************/</p><p> void Delay1ms(int c)<
124、;/p><p><b> {</b></p><p> unsigned char a, b;</p><p> for (;c>0;c--)</p><p><b> {</b></p><p> for (b=38;b>0;b--)</p>
125、<p><b> {</b></p><p> for (a=13;a>0;a--);</p><p><b> } </b></p><p><b> } </b></p><p><b> }</b>&l
126、t;/p><p> /******************* 開機(jī)自檢函數(shù) *******************/</p><p> void check() </p><p><b> {</b></p><p> c_led(); //自檢led</p><p> disp(); //
127、自檢數(shù)碼管</p><p> while(x<16)</p><p><b> {</b></p><p> sm_key(); //按鍵檢測</p><p><b> }</b></p><p> Delay1ms(500);</p><
128、p><b> seg=0x00;</b></p><p> OP=0; //自檢繼電器</p><p> Delay1ms(500);</p><p><b> OP=1;</b></p><p> y=1; //自檢完成,進(jìn)入常態(tài)</p><p><b
129、> }</b></p><p> /**************** 開機(jī)自檢led子函數(shù) ******************/</p><p> void c_led() </p><p><b> {</b></p><p> unsigned char b;</p>&l
130、t;p><b> int bb=0;</b></p><p><b> b=0x01;</b></p><p> while(bb<8) //逐個(gè)移動(dòng)點(diǎn)亮led</p><p><b> {</b></p><p><b> P0=b;</
131、b></p><p> Delay1ms(500);</p><p><b> b=b<<1;</b></p><p><b> bb++;</b></p><p><b> } </b></p><p><b
132、> }</b></p><p> /**************** 按鍵檢測函數(shù) *****************/</p><p> void sm_key() </p><p><b> {</b></p><p> int i=0,j;</p><p> u
133、char a,b,c,k;</p><p><b> key=0x0f;</b></p><p> lb[4]=lb[3];</p><p> lb[3]=lb[2];</p><p> lb[2]=lb[1];</p><p> lb[1]=lb[0];</p><
134、p> lb[0]=key; //滾動(dòng)濾波存儲(chǔ)</p><p> for(j=0;j<4;j++)</p><p><b> {</b></p><p> if(lb[j]!=lb[j+1])</p><p> return; //5次值不等,退出函數(shù)</p><p> k=
135、lb[j+1]; //相等,當(dāng)前穩(wěn)定值暫存k</p><p><b> }</b></p><p> pd[1]=pd[0]; //前一次穩(wěn)定值存入pd[1]</p><p> pd[0]=k; 當(dāng)前穩(wěn)定值存入pd[0]</p><p> if((pd[1]==0x0f)&&(pd[0]!=0x0
136、f)) //pd[1]為0x0f且pd[0]不為0x0f則按鍵按下</p><p><b> {</b></p><p> key=0x0f; a=key&0x0f;</p><p> key=0xf0; b=key&0xf0;</p><p> c=a|b; //線反轉(zhuǎn)后得到按鍵狀態(tài)值</
137、p><p> while(c!=key_code[i]) i++; //查找第幾個(gè)按鍵按下</p><p> keyvalue=i; //得到鍵值</p><p> if(y==0) //剛啟動(dòng)模式下檢測鍵盤</p><p><b> {</b></p><p> seg=sdm[keyva
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 單片機(jī)課程設(shè)計(jì)--電子密碼鎖
- 單片機(jī)課程設(shè)計(jì)--電子密碼鎖
- 單片機(jī)課程設(shè)計(jì)電子密碼鎖
- 門禁電子密碼鎖單片機(jī)課程設(shè)計(jì)說明書
- 單片機(jī)課程設(shè)計(jì)報(bào)告--電子密碼鎖
- 單片機(jī)課程設(shè)計(jì)--電子密碼鎖報(bào)告
- 單片機(jī)課程設(shè)計(jì)---電子密碼鎖報(bào)告
- 單片機(jī)課程設(shè)計(jì)----電子密碼鎖報(bào)告
- 單片機(jī)-密碼鎖課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-密碼鎖
- 單片機(jī)課程設(shè)計(jì)--密碼鎖
- 單片機(jī)課程設(shè)計(jì)-密碼鎖
- 單片機(jī)課程設(shè)計(jì)---密碼鎖
- 密碼鎖單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)-密碼鎖
- 基于單片機(jī)的電子密碼鎖設(shè)計(jì) 單片機(jī)課程設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)的電子密碼鎖設(shè)計(jì)
- 單片機(jī)課程設(shè)計(jì)---基于單片機(jī)的電子密碼鎖設(shè)計(jì)
- 課程設(shè)計(jì)----單片機(jī)電子密碼鎖
- 單片機(jī)電子密碼鎖課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論