很感谢你们能点击进来看我写的博客
第一次写博客,也是第一次写这种程序,如果这些可以帮到你们那样最好,如果有错误或者我写的很菜也请各位大神大佬不要太过于打击我。谢谢
1.1目的
这是我在学习了STM32以后第一次自己设计应用型程序,这套密码锁是为了给学校一个社团实验室用的,目的是为了解决只有一把钥匙的问题。
1.2系统组成
本设计使用的单片机型号为STM32F103C8T6(网上买的小型开发板),蜂汇蓝牙4.0模块(选它是因为它可以在微信上用小程序直接连接),12V直流电机,限位开关
1.3系统分析
系统工作原理:系统在正常工作时,当有手机连接到密码锁的蓝牙以后,蓝牙模块的连接指示引脚(PB6)会由高电平变为低电平,该引脚连接在开发板上的PA0引脚,当有电平变化时,会产生一个外部中断判断是连接还是断开,如果是连接,则初始化验证变量,并向手机发送提示信息,然后进入学号验证阶段。
该系统使用数组存储了50位学生的学号、密码信息,学号为10位数字,密码格式不限。当学号信息从手机发送至密码锁后,首先判断学号长度是否符合,若不符合,则提示学号格式不符,并退出系统,若格式符合,则进行学号验证。学号验证成功后,进入密码验证阶段,密码为事先设定好的,不可修改(时间仓促,没有写修改密码的相关程序),同学号验证一样,首先进行长度比对,若通过,再进行密码验证,并且密码是一个学号对应一个密码,密码验证成功,执行开锁程序;若密码验证失败(共有三次机会),进入下次验证或者系统进入安全模式。进入安全模式后,系统被锁定,只能重新连接蓝牙才能恢复(其实这里可以加更多功能)
1.4部分代码分析
1.4.1串口接收中断
当一包数据接收完成后,ReceiveState标志位置1,用于跳出等待输入循环
1.4.2蓝牙连接中断
当PA0引脚电平变化上升下降沿都会产生中断,进入中断后判断引脚电平状态,若是低电平,说明手机已连接蓝牙,初始化所有有关标志位,并发送提示信息,等待学号输入
1.4.3等待信息输入程序
当一帧数据接收完成后,数据帧标志位置1,在这个函数中判断这个标志位,如果被置1就将其清0并跳出循环,进入数据验证阶段
1.4.4数据验证程序
while(1)
{
RxCounter = RxCounter_last;
t=0;
if(RxCounter != 12)//如果输入的数据长度不匹配
{
delay_ms(50);
printf("student number format err\r\n");//学号格式错误
delay_ms(50);
printf("Please enter again\r\n");//请再次输入
RxCounter = 0;
break;//跳出循环
}
printf("RxC_C:%d\r\n",RxCounter);
while(RxCounter--)//学号验证程序
{
if(USART_RX_BUF[t] != xuehao1[member][t])
i++;
t++;
}
if(i!=0)//如果学号验证未通过
{
i=0;
member+=1;//成员标志位加1,准备验证下一成员
delay_ms(50);
if(member>50)//最大成员数限定
{
dengji = 0;
delay_ms(50);
printf("Without this member\r\n");//没有改成员
delay_ms(50);
printf("The system will exit\r\n");//系统即将退出
member = 0;//成员标志位清0
j = 1;开锁失败
break;
}
}
else
{
printf("Please enter passWord\r\n");
dengji=1;//进入密码验证
i = 0;
RxCounter=0;
break;
}
}
通过蓝牙传输过来的数据将经过该函数验证,通过后才能执行下一步操作,密码验证与此类似,不再描述
1.4.5模式标志位相关程序
由于本人水平有限,最近也挺忙,所以只写了这么多,待机模式还不会,只能找一只狗狗看着它,然后等着它罢工吧