嵌入式系统与单片机|技术阅读
登录|注册

您现在的位置是:嵌入式系统与单片机 > 技术阅读 > 随机密码锁设计[仿真]

随机密码锁设计[仿真]

今天的仿真分享来啦!随机密码锁设计~~需要程序和源代码的小伙伴点一波关注后台回复 “010随机密码锁”,有问题记得私信阿目。阿目希望小伙伴们不只是拿过我的仿真应付了事,而是能在阿目的分享中学习到知识,并对单片机电路和程序的设计有进一步的了解。需要讲解可以私信~

该设计是用于自动储物柜的控制部分,主要可以控制门锁的开关,随机密码的生成,密码的输入与显示。首先看下电路原理图:

电路非常简单,矩阵键盘用来输入密码,报警电路是在锁长时间未关闭的情况下报警提示,步进电机实现锁的开合。

矩阵键盘的检测原理:

初始状态P1.7~P1.4输出的低电平,P1.3~P1.0输出的高电平,假如此时1号按键按下,则P1.0端口的电平会被P1.4端口的电平拉低,此时P1.3~P1.0的电平逻辑表示为1110;第二个阶段,将P1.7~P1.4输出高电平,将P1.3~P1.0输出的低电平,由于按键还是按下状态(因为一次按下时间一般在20ms-500ms之间,程序执行更快,所以第二个阶段时,按键依然处于按下状态),所以P1.4的高电平会被p1.0的低电平拉低,造成P1.7~P1.4的逻辑电平可表示为1110。这两次的端口逻辑状态组成一个状态码即1110_1110,十六进制表示为0xee,这个状态码是唯一的且表示1号按键按下时的状态码。依次类推,其他按键的码就可以出来了,具体见程序中的key16.c。

步进电机控制部分:

步进电机需要驱动芯片ULN2003A,左边是单片机的驱动信号,右边是输出的功率可满足的驱动信号。步进电机的驱动是分周期,本设计中使用8个拍子一个周期,每个拍子的转动角度与步进电机的步距角有关。

驱动代码:

/***aim_ange:转动角度is_forward:0正转,1反转is_new:仿真中转动补偿***/float dianji1(float aim_angel, unsigned char is_forward ,unsigned char is_new){ //电机控制 unsigned int i = 0,num = 0;     static  int paizi; static int last_dir; for( ;aim_angel > 360.0;) aim_angel -= 360; //角度 控制在360内 if(is_new){ if(is_forward ==1){ paizi = 0; num = (int)((aim_angel /9.0)+0.5+2); // 计算正向拍数 } else{ paizi = 7; num = (int)((aim_angel /9.0)+0.5+3); //计算反向拍数 } last_dir = is_forward; }else{ if(last_dir != is_forward) paizi -=2; last_dir = is_forward; num = (int)((aim_angel /9.0)+0.5); } while(i<num){ while(is_t0 == 0); //等待定时器中断 if (paizi == 0){ // 一下是判断该输出的电平 也就是波形 is_t0 = 0; // 清除标志 T0_out =1; // 输出 拍子的时钟信号 这里是模拟的 INA1 = 1; //第一拍的波形 INB1 = 0; INC1 = 0; IND1 = 0;      }else if(paizi == 1){ // is_t0 = 0; T0_out =0; INA1 = 1;//第二 拍的波形 以下同 INB1 = 1; INC1 = 0; IND1 = 0; }else if(paizi == 2){ is_t0 = 0; T0_out =1; INA1 = 0; INB1 = 1; INC1 = 0; IND1 = 0; }else if(paizi == 3){ is_t0 = 0; T0_out =0; INA1 = 0; INB1 = 1; INC1 = 1; IND1 = 0;       }else if(paizi == 4){  is_t0 = 0; T0_out =1; INA1 = 0; INB1 = 0; INC1 = 1; IND1 = 0; }else if(paizi == 5){ is_t0 = 0; T0_out =0; INA1 = 0; INB1 = 0; INC1 = 1; IND1 = 1; }else if(paizi == 6){ is_t0 = 0; T0_out =1; INA1 = 0; INB1 = 0; INC1 = 0; IND1 = 1; }else if(paizi == 7){ is_t0 = 0; T0_out =0; INA1 = 1; INB1 = 0; INC1 = 0; IND1 = 1; } is_t0 = 0; i++; if(is_forward ==1){ paizi++; if(paizi >=8) paizi = 0; // 循环 输出波形 } if(is_forward ==0){ paizi--; if(paizi <0) paizi = 7; } } return aim_angel;}

该设计的相对复杂的地方是,对于储物柜状态的控制,在没有储物时处于empty状态,此时可以按键直接开锁,放入物品后按键关闭锁,然后储物柜处于using转态并且显示一个随机生成的密码,当需要取物时,按输入按键会进入密码输入界面,输入正确的密码自动开锁,最后按下按键关闭锁。整个流程结束。

随机密码的生成如下,使用C库中的随机函数种子:

void generate_code (uchar* usr_code){ // 生成密码函数 int i = 0; for(;i<code_len;i++){ srand(timer); // 初始化一个随机数种子 usr_code[i] = (uchar)(rand() %10); // 获取随机数 DelayMS(usr_code[i]*100); //延时 为了使 随机数不同 }}

生成四位的随机密码。

具体的实现见程序了,需要程序和源代码的小伙伴点一波关注后台回复 “010随机密码锁”,需要讲解可以私信~有问题也请私信阿目~~

ending~~