由于上個月丟了家鑰匙,今天無聊中沒啥事兒,就想自己動手設計個自己用的門禁來玩,至少鑰匙丟了也不愁了,還可以一卡通。由于基本上目前沒硬件來設計,那就先用軟件來模擬一下吧,到時感覺不錯再買元器件。
今天估計也做不了什么,就大概分析下機器的一些東東吧。
首先考慮使用的卡的類型,是使用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;
}
