仅供参考,微机的老师讲的很好,所以请还是要先自己完成咯。
免责声明,本人菜只因一只,内容仅供参考,错了不负责哈
这次课设是小组作业,成员分别是涵哥,婕哥和本菜只因。
特别鸣谢涵哥和婕哥的提携o(* ̄▽ ̄*)ブ
在这里展示报告的绝大部分,需要源码可以邮箱交流:[email protected]
一、设计内容
1.1设计背景与应用场景:(这部分是口水话,请略过)
目前市场上的智能锁包括指纹锁、电子密码锁、感应锁等,然而这些智能锁功能并不完善,智能性、人性化有待提高,且对于学校集体宿舍或普通家庭来说价格较昂贵,无法大范围的普及,因此目前在普通家庭广泛使用的仍旧是普通门锁。但在日常生活中我们难免会出现忘带钥匙或丢失钥匙的情况,往往造成日常生活的不便。另外,普通钥匙锁开门较繁琐,且钥匙携带不便、容易丢失和被复制。除此之外,这些门锁不具有防盗报警的功能,容易造 成人身和财产安全隐患。在保障财产安全的同时,如何让门锁更加方便、智能,已成为当前的研究热点。[1]
1.2 产品功能
我们小组设计的是基于STC10F08XE型号的51单片机开发板完成的智能门锁模型。该系统有以下功能:
基础功能:初始密码为123456、输入正确流水灯和数码管依次闪烁;输入错误时蜂鸣器报警。
附加功能:(1)多次错误后锁机(2)可修改密码
1.3 产品使用说明书
(1)上电后有初始密码为“123456”,输入密码时每输入一个数字,流水灯会按从左到右的顺序一次闪烁。若密码正确,输入完毕后流水灯和数码管会流动闪烁,以示“开锁成功”。若密码错误,则蜂鸣器会报警1s以示“密码错误”。
(2)多次错误后锁机:若连续输错三次密码,门锁将“锁机”。即12s内不得再次输入密码,且数码管会显示倒计时,提高了智能锁的安全性。
(3)修改初始密码:按下INT0开始重置密码功能。先输入旧密码,如果输入正确,流水灯和数码管会依次闪烁。然后再输入新密码,密码就修改成功;如果输入错误蜂鸣器会报警。
二、主程序模块设计
3.1主程序工作流程图
图1:总工作流程图
3.2程序中所用到的RAM储存单元和寄存器
所用到的RAM区空间:30~35H存放初始6位密码(以及修改后的密码)
所用到的寄存器:A、B,第一组R0~R7
三、分立模块设计
3.1子程序概述
该系统代码有8个子程序分别对应八个模块功能。分别是:。下面依次分析介绍。
3.2.1初始密码设置模块Initial_passwords
(1)子程序功能:设置初始密码为123456并存放在RAM区30H~35H
(2)子程序工作流程及流程图
工作流程为:将30H放入R0作为RAM区初始地址,将6放入R1作为接下来循环的循环次数,将1放入累加器作为即将置入的初始密码第一位。
然后进入循环,将1放入RAM区30H,让RAM区地址加1,下一位密码加1(因为密码是123456),然后对R1减一并判断是否为零,若为零结束循环,初始密码设置完毕;若不为零继续循环。
(3)入口参数及出口参数:无
3.2.2输入密码模块INPUT_Passwords:
(1)子程序功能:可实现在键盘输入数字
1. 硬件原理图分析(流水灯、矩阵键盘)
整个完整的系统有多处用到流水灯,在此分析其原理。其他模块用到时不再赘述。
图3:流水灯电路原理图
分析:P0.0-P0.7分别接在LED0~7上,若要单独某一个灯亮/灭,就让SETB或SETBP0.X若需要流水灯则用循环依次置位和清零。
图4:矩阵键盘原理图
分析:首先注意该图与单片机实物对应需要旋转九十;该矩阵键盘硬件接法为行列式键盘,因此我们可以使用键扫描法和线反转法来得到直接键值。我们小组使用线反转法。
(3)子程序工作流程及流程图
工作流程:密码输入即单片机键盘接口的控制,主要方法为矩阵键盘反级法。
1:先让行线全为0列线全为1.读取列线电平,出现0的列属有键被按下。加入延时去抖再读P1口状态判断按键稳定。
2:列线全送出0而行线全为1.读入行线电平,出现0的行数有键被按下。读P1口判断按键稳定。
3:将以上两个读数进行或运算得到直接键值。
4:检测按键是否释放,并等待按键释放。
5:将直接键值转化为顺序键值,然后用穷举法从0-F依次查询直接键值表。若相等则得到按下的按键。
6:对键值进行压栈保护,然后依次点亮流水灯。(按一个按键亮一个流水灯)
7:以上所有流程循环六次实现六位密码输入。
3.2.3密码检查模块CHECK_Passwords
(1)子程序功能:
在六位密码输入完毕后检查密码是否正确。若正确流水灯和数码管闪烁;若失败则蜂鸣器报警。
(2)硬件原理图分析(蜂鸣器)
图6:蜂鸣器电路原理图
分析:P1.3送低电平,蜂鸣器报警;送高电平没有现象。
(3)子程序工作流程及流程图
工作流程:
1:按位依次比对正确密码和输入密码是否相同。若相同则跳到EXIT2出口;若不相等则跳到EXIT1出口。
2:EXIT2出口(密码正确)流水灯和数码管流动闪烁5次
3:EXIT1出口(密码错误)首先蜂鸣器报警且延时1s。然后设置一个判断标志R3为3(主函数以定义)。密码每错误一次R3减1。当R3不为0时,返回主程序等待下一次输入;若R3为0,则跳转到“多次错误锁机模块Wrong_3times。
图7:密码检查模块流程图
(4)数及出口参数:无
3.2.4延时去抖模块DELAY
(1)子程序功能:实现按键输入延时去抖。
(2)子程序工作流程及流程图
工作流程
1:对R7进行压栈出栈做数据保护
2:R7(已赋值18)在循环中递减,利用程序的机器周期实现大致0.1s延时。
(3)入口参数及出口参数:无
3.2.4 延时子程序(蜂鸣器)Delay1
(1)子程序功能:延时0.1s(循环十次实现蜂鸣器连续报警1s左右)
(2)子程序工作流程及流程图
工作流程:通过循环嵌套,让该程序循环200*250次实现延时
工作流程图:与3.2.3类似,不再赘述
(3)入口参数及出口参数:入口参数R7=#18
3.2.5修改密码模块Change_passwords
(1)子程序功能:按下修改密码按键(INT0)。先输入原密码,若原密码正确则再输入六位新密码则密码修改成功;若原密码输入错误则跳出模块回到主程序等待输入。
(2)硬件原理图
图9:独立中断按键原理图(INT0)
分析:当按下KEY1时,INT0被清零,INT0中断被触发。
(2)子程序工作流程及流程图
工作流程:
1:按下INT0中断(0003H)则中断当前程序,跳至修改密码模块Change_passwords。
2:对子程序需用到的寄存器R0,R1,R2进行压栈数据保护。
3:调用密码输入模块以输入旧密码
4:调用密码检查模块以检查旧密码是否输入正确,若正确则可修改密码;若错误则跳转到FAIL(R0R1R2出栈后,回到主函数等待输入)。
5:旧密码正确后P0.1亮灯以示正在修改密码。然后输入新密码,程序结构与“密码输入模块INPUT_passwords”基本一致,但会将新密码储存至RAM区30~35H代替原密码。循环六次。
6:密码修改完成后P0.0会亮灯0.5s左右以示修改密码成功。
图10:修改密码模块流程图
(3)入口参数及出口参数:无
3.2.6多次错误锁机模块
(1)子程序功能:在连续输错密码三次后进行锁机,锁机期间不能输入密码。期间调用数码管显示锁机倒计时。
(2)子程序工作流程及流程图
工作流程:
1:将判断标志(R3)重置为#3,方便下一次的错误锁机。
2:关闭外部中断,在锁机期间不能修改密码操作。
3:对定时器T0进行初始化(工作于方式1,预置初值高字节,预置初值低字节)设置,并启动定时器,到000BH,再跳转到T0的中服子程序:倒计时模块。倒计时每计一秒,跳回“多次错误锁机“模块。
4:清空P0.0~P0.3,使位选无效,关数码管,显示个位数字,跳转到数码管显示模块,送对应段码,点亮P0.1;清空P0.0~P0.3,使位选无效,关数码管,显示十位数字,跳转到数码管显示模块,送对应段码,点亮P0,0;
5:循环显示,直至12次,关定时器,开外部中断,跳回主程序等待输入。
图11:多次错误锁机模块流程图
(3)入口参数及出口参数:无
3.2.7数码管(倒计时)显示模块
(1)子程序功能:接收需要显示的数字,向“多次错误锁机模块“发送对应段码。
(2)子程序工作流程及流程图
工作流程:
1:将让DPTR指向SMGTAB数码管段码表,并根据A查询对应的数字的段码。
2:将对应段码传回。
3:点亮LED灯,显示段码对应的数字
图12:数码管显示模块流程图
(3)入口参数及出口参数:入口参数为需要显示的数字A(放于累加器);出口参数为需显示数字对应的段码。
四、程序调试与结果分析
4.1遇到的困难及其解决方法
略
4.2各功能演示效果
4.2.1输入密码且输入第几位密码就亮第几个LED灯
4.2.2密码输入正确则流水灯流动闪烁、数码管闪烁
图14:密码正确效果
4.3.3密码错误时蜂鸣器报警(无法图示,因此在此不赘述)
4.3.4多次错误时12s锁机(以10s,6s,4s效果演示为例)数码管显示倒计时且流水灯全部亮灯。
4.3.5修改密码:按下INT0,LED1亮灯,示意准备修改密码
图16:按下INT0准备修改密码
4.3.6修改密码:先输入正确密码,效果与4.2.1一致不再赘述。
图17:LED1亮灯以示正在修改密码
4.3.7修改密码:输入新密码时,LED1一直亮灯示意正在修改密码,输完新密码后LED0亮灯以示修改密码成功。
五、改进方案
5.1:IC卡与射频天线模块介绍
我们小组的完整设计方案为“IC卡与射频天线外设接触式开锁”+单片机本身密码锁。
由中断来强制切换模式。但因为C语言和汇编的混合编程不够熟练因此最后没能在有限时间实现两种功能的融合。
因此本系统的改进方向为将两者合在一起。在此大致介绍和分析IC卡+射频天线接触式开锁模块的实现原理和代码。
5.2:硬件分析(这一部分价值不大,建议不要参考hhh)
5.2.1:硬件工作原理
读写器向M1卡发一组固定频率的电磁波,卡片内有一个 LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。
图19:RFID RC522射频模块及IC卡实物图
5.2.2:硬件接线
接线方式如下表
5.2.3:IC卡ID读写
射频发出信号,在IC卡反射信号时,该信号携带的信息为该IC卡的ID。大部分IC卡的ID都可以修改。可通过“NFC助手”类型软件读出IC卡信息(16位,存放在IC卡扇区),也可以通过NFC助手对密码进行修改,而这个16位信息将在软件中作为判断该IC卡是否是正确IC卡依据。
5.3:代码分析
在此主要分析main.c和main.h
略
六、课程设计总结
略
七、程序清单附录
如有需要源码可以发邮件至QQ邮箱交流[email protected]
我没有记错的话汇编部分的代码思路我还是写的比较认真的,错误应该不多,基本可以按照流程图很容易复现,当然在❀工的你们肯定能有比这更好的结构咯hhh。
参考文献