由于上个月丢了家钥匙,今天无聊中没啥事儿,就想自己动手设计个自己用的门禁来玩,至少钥匙丢了也不愁了,还可以一卡通。由于基本上目前没硬件来设计,那就先用软件来模拟一下吧,到时感觉不错再买元器件。
今天估计也做不了什么,就大概分析下机器的一些东东吧。
首先考虑使用的卡的类型,是使用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;
}
