今天的仿真分享来啦!随机密码锁设计~~需要程序和源代码的小伙伴点一波关注后台回复 “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;
;aim_angel > 360.0;) aim_angel -= 360; //角度 控制在360内
if(is_new){
=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{
!= is_forward)
paizi -=2;
last_dir = is_forward;
num = (int)((aim_angel /9.0)+0.5);
}
while(i<num){
= 0); //等待定时器中断 =
if (paizi == 0){ // 一下是判断该输出的电平 也就是波形
is_t0 = 0; // 清除标志
T0_out =1; // 输出 拍子的时钟信号 这里是模拟的
INA1 = 1; //第一拍的波形
INB1 = 0;
INC1 = 0;
IND1 = 0;
= 1){ // =
is_t0 = 0;
T0_out =0;
INA1 = 1;//第二 拍的波形 以下同
INB1 = 1;
INC1 = 0;
IND1 = 0;
if(paizi == 2){
is_t0 = 0;
T0_out =1;
INA1 = 0;
INB1 = 1;
INC1 = 0;
IND1 = 0;
if(paizi == 3){
is_t0 = 0;
T0_out =0;
INA1 = 0;
INB1 = 1;
INC1 = 1;
IND1 = 0;
= 4){ =
is_t0 = 0;
T0_out =1;
INA1 = 0;
INB1 = 0;
INC1 = 1;
IND1 = 0;
if(paizi == 5){
is_t0 = 0;
T0_out =0;
INA1 = 0;
INB1 = 0;
INC1 = 1;
IND1 = 1;
if(paizi == 6){
is_t0 = 0;
T0_out =1;
INA1 = 0;
INB1 = 0;
INC1 = 0;
IND1 = 1;
if(paizi == 7){
is_t0 = 0;
T0_out =0;
INA1 = 1;
INB1 = 0;
INC1 = 0;
IND1 = 1;
}
is_t0 = 0;
i++;
=1){ =
paizi++;
>=8) paizi = 0; // 循环 输出波形
=0){ =
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~~