由于上個月丟了家鑰匙,今天無聊中沒啥事兒,就想自己動手設計個自己用的門禁來玩,至少鑰匙丟了也不愁了,還可以一卡通。由于基本上目前沒硬件來設計,那就先用軟件來模擬一下吧,到時感覺不錯再買元器件。
今天估計也做不了什么,就大概分析下機器的一些東東吧。
首先考慮使用的卡的類型,是使用id卡還是ic卡還是二代身份證呢?身份證嘛怕丟,不能老是隨身帶。id卡和ic卡都行,不過ic卡的讀頭要貴很多又不方便自做,所以最后決定用id卡吧,就算自己做也沒什么,大不了買個芯片讀曼徹斯特*碼也應該容易,況且讀卡器,卡片也便宜嘛。
id讀卡器到時買最便宜的就行了,不用多想什么了,只要記得到時搞清楚到手的參數就行,不要拿個維根32的當成維根26的來用,就可能走很多彎路了。
主控芯片就用89s52吧,二個外部中斷,二個定時中斷,32個I/O應該夠用了。
存儲器的話只存開門卡號和密碼等數據,不用太大,就用24c02夠了,幾十個用戶容量夠家里用了。
其他的配件都是小件散件,用到時再考慮吧。
用電腦做上位機進行聯網遠程開門,加卡刪卡等操作,電腦軟件以后做好下位機后再寫了,唉,英語不行,VB,DP等流行軟件都不能用,看來只能用易語言了。
現在到晚上了,今天白天已經畫好了proteus圖,大概說一一分布:1,電源12v輸入12v/5v輸出。2,主控P3口控制繼電器蜂鳴器LED輸出和曼碼,IIC,中斷(讀卡器輸入)輸入和串口通訊。P2,P1口留做讀卡器輸入(用查詢法來讀數據)和信號輸出。P0口做鍵盤輸入了。主控就暫時就樣分布到時需要時再改吧。
今天就先做到就里,任務才剛剛開始,單片機程序估計要幾天才能寫好吧。
制作自用門禁第1個程序
今天開始寫下位機也就是89s52的程序。一個早上才搞定鍵盤掃描程序,程序基本上正確,只是明明加了松開檢測了,怎么有時在按下時會發送呢。實在是檢查不出哪兒的問題,也許是模擬軟件的問題吧。
現在突然想到怎么先寫鍵盤程序呢,應該寫重要的先才對啊,不然到最后重要的部分沒寫成那不是浪費很多精力?但是沒有實際硬件做起來費勁,串口通訊不知怎么用軟件模擬,也就是因為這樣早上的鍵盤程序都是*軟件調試和蜂鳴器來提示來叛斷是否正確,所以做起來很慢。如果有終端來顯示那就方便多了。不想買液晶顯示,雖然1602液晶應該沒多少錢但是怕以后用不到還是用電腦來做顯示吧,接上串口來通訊就行。但問題是現在要有芯片,數據線,基本外圍元件和洞洞板等等才行。家里街上和工業城市不一樣,東西應該不好買,到市區里去看看吧,不行再淘寶了,馬上去了……
貼上我的鍵盤程序:
/*//////////////////////////////////// 函數原型: uchar key(void) 函數說明:鍵盤掃描 版本:V1.0.0 程序員:LIY12586 ////////////////////////////////////*/ uchar key(void) { uchar temp,number; P0=0x0f; if(P0!=0x0f) { P0=0xfe; if(P0!=0xfe) { temp=P0; switch (temp) { //11110000 case 0xee: //01111110 number=4; break; case 0xde: number=3; break; case 0xbe: number=2; break; case 0x7e: number=1; break; } while(P0!=0xfe); sound(1); return number; } P0=0xfd; if(P0!=0xfd) { temp=P0; switch (temp) { case 0xed: number=8; break; case 0xdd: number=7; break; case 0xbd: number=6; break; case 0x7d: number=5; break; } while(P0!=0xfd); sound(1); return number; } P0=0xfb; //temp=P0; //temp=temp|0xf0; if(P0!=0xfb) { temp=P0; switch (temp) { case 0xeb: number=12; break; case 0xdb: number=11; break; case 0xbb: number=10; break; case 0x7b: number=9; break; } while(P0!=0xfb); sound(1); return number; } P0=0xf7; //temp=P0; //temp=temp|0xf0; if(P0!=0xf7) { temp=P0; switch (temp) { case 0xe7: number=16; break; case 0xd7: number=15; break; case 0xb7: number=14; break; case 0x77: number=13; break; } while(P0!=0xf7); sound(1); return number; } }return 0; }