切换到宽版
  • 1897阅读
  • 11回复

[C51]单片机作品1-密码锁 [复制链接]

上一主题 下一主题
离线cncooper
 

发帖
53
M币
1618
专家
2
粉丝
10
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2017-11-20

上菜之前,先吐个槽:


1.     对于单片机,只是兴趣,从小就有,但是我那个年代,物质还是比较匮乏的,那时候连个IC都不知道叫啥,也没地方查。。。没有相关资料,想学习都不知道该学什么,父母也不懂,所以与这些渐行渐远了。现在有条件了,可是没那么多时间折腾啦。看现在那么多年轻小伙子,搞了那么多东西,说实话,我并不羡慕,只是你们所处的这个时代,发达的网络购物、丰富的学习资源、充裕的课外时间、无忧的生活条件,可以给你想要的一切。放回我们那个年代,其实你们多数一样碌碌无为。所以,别骄傲,继续加油吧。
2.     貌似搞单片机的前辈们功底都深不可测,鄙人见过的绝大多数代码都是晦涩难懂的,一个变量名,就用个a、b、c表示,局部变量也就罢了,全局变量也这么表示,我擦,一点也不考虑阅读者的感受,我想问问这些前辈,若干年之后你再读自己的代码还会这么行云流水么???几乎没见到个规范点的代码,全都是那么随心所欲。。。而且Keil没有高级IDE那么多功能,无法智能重命名变量,太tm费劲了,尤其是从其他语言IDE转到Keil,仿佛回到了石器时代,虽然要阅读的代码不长,但是还是累得要命。。。既然打算开源,那就负责一点,认真点写代码,方便自己也方便别人不好么?
3.     我只是个菜鸟,以上吐槽,请勿较真,仅供娱乐,如有不服,敬请憋住,哈哈哈。

下面介绍一下鄙人第一个单片机作品,菜鸟出手,欢迎斧正,拒绝批评~~~

功能需求:


自从入手杜洋的《爱上单片机》已经3个多月了,按理说早应该交出第一个小作品了,但是每逢周末就tm有事,业余时间太少了。。。计划的作品排了四五个,但是都没时间尝试,很着急。
排在第一位的就是今天的《密码锁》,当然,很简单,就是输入密码,正确就驱动电机开锁,错误就不开,高级一点的就是错误几次锁定几分钟。但是作为一个菜鸟,要实现这一些功能就不是那么容易啦。

做这个,主要是为了不带钥匙,家里其他门上面都是成品的密码锁、指纹锁,唯独家里地下室的锁还是得带钥匙,网上看了一下,不用钥匙的锁都得至少200,而且还得用IC、ID卡或者遥控,还是得带东西,不符合实际需求。(顺便吐槽一下市面上的各种智能锁,价格就不说了,那些设计一点不考虑安全性、隐蔽性,应急充电或者应急钥匙空,能更明目张胆一点么?偷不了东西,搞破坏怎么办?锁也是我的财产啊,一点不考虑人民财产安全。。。)

所以分析一下,知道到底想要啥,得到下面的结果:
A.    不需要钥匙,除了指纹就是密码了。(当然还可以声音识别、面部识别、步态识别更方便,可这些对于我这个菜鸟来说太难太难,这辈子可能都不会。。。不开玩笑啦,不用指纹的原因是成本太高,露在外面,被破坏的话,损失太大,毕竟是地下室,人烟稀少。用薄膜键盘,就算破坏了,我可以再贴一个嘛,便宜)
B.     不影响钥匙开锁。没电了依然可以用钥匙开锁。(其实我也不大相信自己的作品,怕把自己锁门外了,哈哈哈)
C.    输入正确密码开锁,错误3次则锁定30秒。(4位密码,前后必须加干扰码才算正确【这里忘了,实际上是想做成即便是管理员密码,如果和上次密码一致的话,也认为是无效密码】)
D.    可修改密码。(目前只保存一个,多个密码的话得改动不少代码【用那个EEPROM保存,而不是用1302来保存,原谅我的无知。。。T_T】,太麻烦)
E.     可生成一次性访客密码。(逢年过节来送礼的,人不在家,让他直接搬地下室去,哈哈)
F.     按键声音以及各种声音提示。(比如门开着超过几分钟响铃提示啥的,可是现在声音太小了,没再修改电路,我也不会改= =!)

基本上就是上面的要求了。还有个重要的前提,就是我的地下室锁的时候,只是带上门,并不会钥匙捅进去转好几圈锁死,可能是习惯吧,感觉那样太麻烦了,所以基于现状进行密码锁的定制,也就是说,如果是每次锁门都把钥匙捅进去转好几圈那种锁法,得把电机换个方式连接到锁上,反正那就有点麻烦了。

硬件选型:


入门当然是89C52了,感觉资料会多些,接触过这个的人也多一些吧,到处请教也容易得到答案。然后用这个单片机驱动电机正反转,电机是买的个成套的可伸缩推拉的部件,但是对驱动电压电流有要求,单片机的输入不够驱动这个电机。所以一番搜索找到了H桥电路,但是自己搭建H桥电路太麻烦,貌似需要的知识水平也远高于我现在的能力,不过还好,找到了一个型号为L9110H的集成电路,使用非常方便,解决了我一个大问题。

剩下的就简单了,用Proteus画画图,画完了找个大牛点评一下有木有问题,没问题就开始写代码了。

实际上我做的时候是先写的程序,因为代码对我来说更简单一点,电子电路啥的对我来说太难,鄙人没啥电子电路基础,模电数电看了好多也不会。。。代码都写完了,而且Proteus仿真(只是仿真驱动两个led点亮,因为Proteus没有L9110H这个芯片)也正常了,最后做的时候才发现问题。

发现的问题就是:L9110H的驱动电流必须大于多少(具体多少我也不知道,看不懂那个说明书)而89C52的输出太弱了,不够啊。加三极管放大,在洞洞板上搞一顿也不好使(接三极管之类的感觉太麻烦了,而且ebc我都分不清,每次接一个脚就得再查一次资料,卧槽。。。别笑我菜)。想了想有个什么“推挽输出”(“推挽”?这么专业的词汇。。咋不推锅呢?)不就是为了电流不够的时候增加推动能力的么?于是修改代码,可是没效果啊,后来才知道,89C52没有推挽输出。没办法,只好查了查相关资料,找到带推挽输出的单片机:12C5A60S2。

换成这个之后,终于可以推动L9110H了。不过由于那个啥啥啥不同,专业词汇貌似叫机器周期还是啥的,反正大概就是速度不一样,因此给89C52用的延时函数没法直接拿到12C上用,所以得修改若干地方,比如1602显示模块,某些地方不加个延迟显示都不正常。

一开始没有加1602的,只是有个1个数字的数码管(貌似叫1位7段的数码管)来显示状态,但是很不方便,后来就加了1602模块,各个状态都很清晰了。1602只有在输入的时候才亮背光,省电。别的时候背光不亮。调试通过了其实可以拆掉了。

驱动电机运动,得有终点啊,不能一直通电运动不停啊,所以还得设计俩限位器。(最后发现,这个电机模块运动之后无法保持位置,会被门闩给拖回去 = =!导致有时候开门失败!)关于为啥不用步进电机,1是不会用,没研究过,2是到底运行多久是不知道的,最好是通过限位来停止,不是么?3是没有成品的模块啊,总不能自己做齿轮啥的吧。。。

门开关还得有个感应开关检测一下啊,就用了干簧管+磁铁。但是实测发现,貌似不靠谱啊,因为有些角度,干簧管是快速的切换导通状态啊(貌似位于临界点似的),导致电机反复上电。

总结一下:
12C5A60S2+L9110H+DS1302+1602+电机模块


软件设计:


个人理解,单片机是单线程执行的程序,不像其他语言程序支持多线程。很多地方需要转变思维角度。比较重要的是中断,中断之后原来的代码怎么执行我忘了 = =!。反正大佬们都建议,中断里只是设置标记,然后主循环里进行各种耗时操作,这样误差不会很大。
仔细分析一下门锁的开关等状态,定义了几个状态,所有操作都是围绕这几个状态进行的:
1.       等待
2.       密码输入中
3.       密码正确,开锁中,电机正向运动中
4.       锁打开了。
5.       门打开中,开门传感器检测到门开了
6.       关锁中,电机反向运动中
7.       密码多次错误,键盘锁定中
8.       修改系统时间
9.       修改密码

然后其他操作,就是在这几个状态间切换。屏幕也根据状态显示对应内容。
代码写好了,开始制作之前,用Keil+Proteus仿真跑跑程序,看看有没有问题,不然到时候上硬件之后,我不知道怎么调试。。。

可以修改的配置,都是通过宏定义的,修改配置无需到处找代码改,是不是更方便?
具体对原理感兴趣,可以阅读代码,个人感觉还是很易读的。

访客密码(临时密码),这个是单独写了个Android应用,直接在手机上生成密码,算法与C算法是一致的,但是生成的密码做了过滤,因为我也不确定到底是否会生成一些位数不够或者超出的密码。因为涉及到时间,所以锁端程序里做了判断,前后5分钟都算在内,防止由于误差过大导致密码无效。设计临时密码只能用一次,但是实际上是存在漏洞的:10分钟之内,密码生成之后输入开锁,然后关锁,然后使用其他密码开锁,然后关锁,然后再用第一个临时密码还是会打开锁的,因为还没有失效,并且程序内只记录了一个上次的有效密码。当然,这种漏洞被利用的可能性不大。


最终成品:


安装完成之后,测试可以开门,但是有时候却不行,导致开门失败的原因有两个:
I.        电机模块开门之后无法保持位置,门闩的弹簧会将电动机给拉回到锁闭状态,这就有点尴尬了,倒也不是没办法解决,要么拆开电机模块,想办法加点阻尼,让电机不那么容易被拉动,要么不拆模块,也加个弹簧与门闩的弹簧抵消一下。要么一开锁赶紧开门。。。囧
II.       有时候门和门闩的框接触的太紧了,电机拉不动门闩。。。开锁的时候稍微用点力顶一下门吧。。。

锁具虽然做好了,但是还有很多可以拓展的地方,比如目前还没有电量检测,开门之后电量低自动报警多方便。钥匙可以设置多个密码,就不用去记别人的密码了。其实声音识别更好,喊一声直接开门,哈哈,有点科幻了,而且单片机上要识别声音,貌似不是很容易吧,太高深的,我也不会不懂哇。不过作为入门级的,可以声控,有声音之后自动检测蓝牙模块,发现指定的模块(手机)直接开门,是不是更方便。

目前不知道这个锁的耗电量如何,之前是想设计成9V电池供电的,换电源比较方便,但是实测发现L9110H和单片机(9V接L7805转5V给单片机供电)都用这个9V电池的话工作不正常,电动机不转,断断续续的。没办法,不知道怎么弄。大佬说内阻太大,啥叫内阻,不懂。。。最后只好换成这个BP-4L电池了。

这个单片机看文档说支持啥低功耗之类的云云,但是不知道到底咋用,感觉做成个锁,大材小用了,哈哈。

好啦,大概就是这个样子了。也许是微不足道的东西,但是好歹是本菜鸟第一件单片机作品,无论怎样,值得记忆一下子。乌拉!

哦忘了,得好好感谢一下帮助过我的朋友,尤其是热情的大佬“然然爸”,有一些非常低级的问题,他也会耐心指点,感谢。其他朋友,呃,或多或少帮过的,就一并表示感谢了。



下面补几张图,虽然不咋的,但是好歹实现了预期的功能。


图片压缩了一下,凑合看吧。。






图顺序都不对,拍出来,又截图,结果还是大,又压缩,反正乱套了。。凑合看吧。

Cooper

2017-11-20

乌拉!求打赏

附件地址:链接: https://pan.baidu.com/s/1boKgHBp 密码: 6666
附件里是Keil源码+Proteus+Android端源码。




单片机作品1-密码锁【2018-3-12更新】
http://bbs.mydigit.cn/read.php?tid=2368313
本文内容包含图片或附件,获取更多资讯,请 登录 后查看;或者 注册 成为会员获得更多权限
本帖最近打赏记录:共10条打赏M币+289专家+1
离线dzy1977

发帖
2145
M币
2080
专家
1
粉丝
30
只看该作者 1楼 发表于: 2017-11-20
支持。这工作量不小。
离线一棒槌

发帖
4315
M币
72
专家
20
粉丝
98
只看该作者 2楼 发表于: 2017-11-20
不错,很有技术含量啊,不像我,只会吹水!羡慕啊··
离线真情永存

发帖
1645
M币
7420
专家
8
粉丝
20
只看该作者 3楼 发表于: 2017-11-20
万用板是亮点!
离线13212997703

发帖
1837
M币
416
专家
1
粉丝
15
只看该作者 4楼 发表于: 2017-11-20
离线水表君

发帖
1252
M币
4052
专家
42
粉丝
81
只看该作者 5楼 发表于: 2017-11-20
赞一个!功耗多大啊?
本帖最近打赏记录:共1条打赏M币+1
离线维超

发帖
920
M币
3945
专家
1
粉丝
10
只看该作者 6楼 发表于: 2017-11-20
謝謝分享。楼主辛苦了!
离线在路上795

发帖
2279
M币
1627
专家
0
粉丝
23
只看该作者 7楼 发表于: 2017-11-23
我也想学,买了书和开发板,但学起来好难,什么都没基础,C语言,电子元件等都不明白
离线13066182417
发帖
51
M币
27
专家
2
粉丝
1
只看该作者 8楼 发表于: 2017-11-26
楼主强大
离线hfshen

发帖
196
M币
5367
专家
2
粉丝
16
只看该作者 9楼 发表于: 2017-11-26
真情永存万用板是亮点!
      
这是杜洋独创的,据其视频演示,可以很方便快捷的横向、纵向与旁边的孔用焊锡连接。看了视频后想买的,觉得贵了,平时也不怎么用的到,就放弃了。
快速回复
限80 字节
温馨提示:欢迎交流讨论,请勿发布纯表情、纯引用等灌水帖子;以免被删除
 
上一个 下一个