这是基于stm32F103RCT6的六位密码锁,分为两种模式:普通模式和管理员模式 ,管理员模式下可更改密码。密码输入方式:手机通过蓝牙发
小白一个,大佬勿喷
接线:串口引脚(PA9,PA10) 手机软件:BLUESPP 可以使用其他软件 蓝牙型号(HC-06) 可以使用其他蓝牙模块 数据类型:十六进制数据 其中0X0E为模式切换 0X0F为清除指令 密码输入只能为0-9的数字
单片机源程序如下:
- /********************************六位密码锁 *************************************************
- *接线:PF0~PF7
- *矩阵按键 S16 为清除数据(清屏)
- *矩阵按键 S15 为模式切换(普通模式(默认密码 123456)和管理员模式(默认密码666666),管理员模式可更改改密码)
- *密码只能输入0-9的数字 其他无效
- *密码正确LED0和LED1将会闪烁
- *输入完6位密码,系统将会自动判断正确和错误
- *
- *已测试 可能存在BUG 自行修改
- ***************************************************************************************************/
- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "led.h"
- #include "lcd.h"
- #include "key.h"
- #include "usmart.h"
- #include "malloc.h"
- #include "rtc.h"
- #include "text.h"
-
- /*****************************************************密码掉电丢失,恢复原始密码*****************************************************************************/
- u8 open_pwd[6]={1,2,3,4,5,6};//初始密码
- u8 root_pwd[6]={6,6,6,6,6,6};;//管理员密码
- extern u8 Password[6];//输入的密码
- extern u8 Timer;//按键次数
- extern u8 ROOT,NEWROOT;//模式切换
- u8 Root,NewRoot;//管理员模式状态标志位
- int main(void)
- {
- delay_init(); //延时函数初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
- LED_Init(); //初始化与LED连接的硬件接口
- uart_init(9600); //串口初始化为115200
- LCD_Init(); //初始化LCD
- while(font_init()); //检查字库
- while(RTC_Init()); //RTC初始化 ,一定要初始化成功
- while(1)
- {
- if(NEWROOT!=ROOT)LCD_Clear(WHITE); NEWROOT=ROOT; //清屏
- Usart_ReceiveData() ;
- LCD_ShowString(10,10,200,16,16," - - ");
- LCD_ShowString(150,10,200,16,16," : : ");
- LCD_ShowNum(5,10,calendar.w_year,4,16);
- LCD_ShowNum(45,10,calendar.w_month,2,16);
- LCD_ShowNum(70,10,calendar.w_date,2,16);
- switch(calendar.week)
- {
- case 0:
- LCD_ShowString(95,10,200,16,16,"Sunday ");
- break;
- case 1:
- LCD_ShowString(95,10,200,16,16,"Monday ");
- break;
- case 2:
- LCD_ShowString(95,10,200,16,16,"Tuesday ");
- break;
- case 3:
- LCD_ShowString(95,10,200,16,16,"Wednesday");
- break;
- case 4:
- LCD_ShowString(95,10,200,16,16,"Thursday ");
- break;
- case 5:
- LCD_ShowString(95,10,200,16,16,"Friday ");
- break;
- case 6:
- LCD_ShowString(95,10,200,16,16,"Saturday ");
- break;
- }
- LCD_ShowNum(150,10,calendar.hour,2,16);
- LCD_ShowNum(174,10,calendar.min,2,16);
- LCD_ShowNum(198,10,calendar.sec,2,16);
-
- /*****************************************************普 通 用 户 模 式*****************************************************************************/
- if(ROOT==0)
- {
- if(Timer<6)
- {
- POINT_COLOR=RED;
- Show_Str(80,45,200,16,"普通模式 ",16,0);
- Show_Str(40,70,200,16,"请输入您的六位密码 ",16,0);
- Show_Str(40,110,200,16,"密码为:",16,0);
- }
- if(Timer==6)
- {
- if((Password[0]==open_pwd[0])&&(Password[1]==open_pwd[1])&&(Password[2]==open_pwd[2])&&(Password[3]==open_pwd[3])&&(Password[4]==open_pwd[4])&&(Password[5]==open_pwd[5]))
- {
- Show_Str(40,70,200,16,"密码正确,欢迎使用 ",16,0);
- LED0=!LED0;LED1=!LED1;
- }
- else
- {
- Show_Str(40,70,200,16,"密码错误,请重新输入",16,0);
- }
- }
- }
-
- /*****************************************************管 理 员 模 式**********************************************************************/
- else //管理员模式
- {
- POINT_COLOR=BLUE;
- Show_Str(80,45,200,16,"管理员模式 ",16,0);
- if(Root==0)Show_Str(40,70,200,16,"请输入管理员密码 ",16,0);
- if(Root<2)Show_Str(40,110,200,16,"密码为:",16,0);
- if(Root!=NewRoot) LCD_Fill(0,90,250,180,WHITE ); //状态发生改变 清屏
- NewRoot=Root;
- if((Timer==6)||(Root==1))
- {
- if((Password[0]==root_pwd[0])&&(Password[1]==root_pwd[1])&&(Password[2]==root_pwd[2])&&(Password[3]==root_pwd[3])&&(Password[4]==root_pwd[4])&&(Password[5]==root_pwd[5]))
- {
- if((Timer==6)&&(Root==0))Timer=0;Root=1;
- Show_Str(40,70,200,16,"密码正确,请输入新密码 ",16,0);
- }
- else
- {
- Show_Str(40,70,200,16,"密码错误,请重新输入 ",16,0);Root=2;
- LCD_Fill(0,100,250,250,WHITE );
- }
- }
- }
- }
- }
复制代码
所有资料51hei提供下载: |