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