硬體電路的設計
(末尾附檔案)
方案框圖

原理圖:
本設計選用屬于STM32系列的STM32F103C8T6單片機作為控制電路的核心部件,矩陣鍵盤用于輸入數字密碼和進行各種功能的實作,由用戶通過連接單片機的矩陣鍵盤輸入密碼,后經過單片機對用戶輸入的密碼與自己保存的密碼進行對比從而判斷密碼是否正確,然后控制引腳的高低電平傳到開鎖電路或者報警電路控制開鎖還是報警,實際使用時只要將單片機的負載由繼電器換成電子密碼鎖的電磁鐵吸合線圈即可,
各模塊功能如下:
1)鍵盤輸入模塊:分為密碼輸入按鍵與幾個功能按鍵,用于完成密碼鎖輸入功能,
2)顯示模塊:用于完成對系統狀態顯示及操作提示功能,
3)報警模塊:用于完成輸錯密碼多次時的警報功能,
4)開鎖模塊:應用繼電器及發光二極管模擬開鎖,完成開鎖及開鎖提示,
本系統外圍電路包括矩陣鍵盤輸入電路、復位電路、LCD顯示電路、報警電路、開鎖電路,根據實際情況鍵盤輸入部分選擇4×4矩陣鍵盤,顯示部分選擇字符型液晶顯示LCD1602,
按鍵輸入模塊
由于本設計所用到的按鍵數量較多而不適合用獨立按鍵式鍵盤,采用的是矩陣式按鍵鍵盤,它由行和列組成,也稱行列式鍵盤,按鍵位于行列的交叉點上,密碼鎖的密碼由鍵盤輸入完成,與獨立式按鍵鍵盤相比,要節省很多I/O口,本設計中使用的這個4×4鍵盤不但能完成密碼的輸入還能作特別功能鍵使用,鍵盤的每個按鍵功能在程式設計中設定

LCD 顯示模塊
顯示部分由液晶顯示幕LCD1602取代普通的數碼管完成,開鎖時,按下鍵盤上的開鎖按鍵后,利用鍵盤上的數字鍵0-9輸入密碼,每按下一個數字鍵后在顯示幕上顯示一個*,輸入多少位就顯示多少個*,當密碼輸入完成時,按下確認鍵,如果輸入的密碼正確的話, LCD顯示“DOOR OPEN”,單片機其中P2.0引腳會輸出低電平,使三極管T2導通,電磁鐵吸合,繼電器開關跳轉,電子密碼鎖被打開,如果密碼不正確,LCD顯示屏會顯示“CODE WRONG”,P2.0輸出的是高電平,電子密碼鎖不能打開,通過LCD顯示屏,可以清楚地判斷出密碼鎖所處的狀態,

報警模塊
報警部分由陶瓷壓電發聲裝置及外圍電路組成,加電后不發聲,當有鍵按下時,“叮”聲,每按一下,發聲一次,密碼正確時,響兩聲并開鎖,當密碼輸入錯誤時,單片機的PC13引腳為高電平,三極管T3導通蜂鳴器發出噪聲報警,如圖2.4所示,

開鎖模塊
開鎖控制電路的功能是當輸入正確的密碼后將鎖打開,系統使用單片機其中一引腳線發出信號,經三極管放大后,由繼電器驅動電磁閥動作將鎖打開,用戶通過鍵盤任意設定密碼,并儲存在FLASH中作為鎖碼指令,開鎖步驟如下:利用鍵盤上的數字鍵0-9輸入密碼,最后按下確認鍵,當用戶輸入密碼后,單片機自動識別密碼,如果密碼不符,則報警,只有當密碼正確,單片機才能使繼電器處于開鎖狀態

軟體設計

#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "sys.h"
#include "delay.h"
#include "lcd.h"
#include "led.h"
#include "usart.h"
#include "dht11.h"
#include "key.h"
#include "beep.h"
#include <stdio.h>
#include "stmflash.h"
#include "timer.h"
#include "exit.h"
#define ADDR_hum_up_1 0X0800b000
#define ADDR_hum_up_2 0X0800c000
int key=0;
int j=0;
u8 k1_flag=1;
u8 k2_flag=1;
u8 k3_flag=1;
u8 k4_flag=1;
int setpass_flag11=1;//標識正在設定密碼,繼電器不關閉
int err3_flag=1;
int i=0;
int djtime_flag=360;
int down_flag=0;
static u8 key_up=1;//不支持連按
u8 open_flag=1;//用于標識是否是系統的第一次打開
u8 pass_shuru=0;
u8 setpassword_flag=0;
u8 setopen_flag=1;//用于標識開機之后是否打開過
u8 setpass_flag=0;//當密碼設定成功之后的標志位
u8 err_flag=0;//輸出錯誤次數記錄標志位
u8 errtime_flag=0;//用于錯誤之后延時并重置螢屏的標志位
u8 beep_flag=1;//用于標識當按鍵按下,蜂鳴器滴一聲的時間
u8 password[]={9,9,9,9,9,9};;//記錄輸入的密碼
u8 setpassword1[6]={1,1,1,1,1,1};//設定密碼的存放位置
u8 setpassword2[6];//設定密碼的存放位置
static u8 ok_flag=0;//記錄每次判斷密碼有幾位正確
u8 flag16=1;//標志按鍵16是第幾次按下,做相應的動作
u8 cspassword[]={0,0,0,0,0,0};
u8 cjpassword[]={1,3,1,4,2,0};
u8 table0[]="===Coded Lock===";
u8 table1[]="password: ";
u8 table2[]=" open ";
u8 table3[]=" error ";
u8 table4[]="SetNewWordEnable";
u8 table5[]="input again ";
u8 table6[]="ResetPassword OK";
u8 flash1[]={0};
u8 flash2[]={1,0,0,0,0,0};
void show1(void)
{
LCD1602_Show_dat(0,1,table1[0]);
LCD1602_Show_dat(1,1,table1[1]);
LCD1602_Show_dat(2,1,table1[2]);
LCD1602_Show_dat(3,1,table1[3]);
LCD1602_Show_dat(4,1,table1[4]);
LCD1602_Show_dat(5,1,table1[5]);
LCD1602_Show_dat(6,1,table1[6]);
LCD1602_Show_dat(7,1,table1[7]);
LCD1602_Show_dat(8,1,table1[8]);
LCD1602_Show_dat(9,1,table1[9]);
for(j=0;j<i;j++)
{
LCD1602_Write_Dat('*');
}
for(j=0;j<6-i;j++)
{
LCD1602_Write_Dat(' ');
}
}
void show2(void)
{
LCD1602_Show_dat(0,1,table2[0]);
LCD1602_Show_dat(1,1,table2[1]);
LCD1602_Show_dat(2,1,table2[2]);
LCD1602_Show_dat(3,1,table2[3]);
LCD1602_Show_dat(4,1,table2[4]);
LCD1602_Show_dat(5,1,table2[5]);
LCD1602_Show_dat(6,1,table2[6]);
LCD1602_Show_dat(7,1,table2[7]);
LCD1602_Show_dat(8,1,table2[8]);
LCD1602_Show_dat(9,1,table2[9]);
LCD1602_Show_dat(0xa,1,table2[10]);
LCD1602_Show_dat(0xb,1,table2[11]);
LCD1602_Show_dat(0xc,1,table2[12]);
LCD1602_Show_dat(0xd,1,table2[13]);
LCD1602_Show_dat(0xe,1,table2[14]);
LCD1602_Show_dat(0xf,1,table2[15]);
}
void show3(void)
{
LCD1602_Show_dat(0,1,table3[0]);
LCD1602_Show_dat(1,1,table3[1]);
LCD1602_Show_dat(2,1,table3[2]);
LCD1602_Show_dat(3,1,table3[3]);
LCD1602_Show_dat(4,1,table3[4]);
LCD1602_Show_dat(5,1,table3[5]);
LCD1602_Show_dat(6,1,table3[6]);
LCD1602_Show_dat(7,1,table3[7]);
LCD1602_Show_dat(8,1,table3[8]);
LCD1602_Show_dat(9,1,table3[9]);
LCD1602_Show_dat(0xa,1,table3[10]);
LCD1602_Show_dat(0xb,1,table3[11]);
if(err3_flag==1)
{
LCD1602_Show_dat(0xc,1,table3[12]);
LCD1602_Show_dat(0xd,1,table3[13]);
LCD1602_Show_dat(0xe,1,table3[14]);
LCD1602_Show_dat(0xf,1,table3[15]);
}
else if(err3_flag==2)
{
LCD1602_Show_dat(0xc,1,0x30+djtime_flag/2/100);
LCD1602_Show_dat(0xd,1,0x30+djtime_flag/2/10%10);
LCD1602_Show_dat(0xe,1,0x30+djtime_flag/2%10);
LCD1602_Show_dat(0xf,1,'s');
}
}
void show4(void)
{
LCD1602_Show_dat(0,1,table4[0]);
LCD1602_Show_dat(1,1,table4[1]);
LCD1602_Show_dat(2,1,table4[2]);
LCD1602_Show_dat(3,1,table4[3]);
LCD1602_Show_dat(4,1,table4[4]);
LCD1602_Show_dat(5,1,table4[5]);
LCD1602_Show_dat(6,1,table4[6]);
LCD1602_Show_dat(7,1,table4[7]);
LCD1602_Show_dat(8,1,table4[8]);
LCD1602_Show_dat(9,1,table4[9]);
LCD1602_Show_dat(0xa,1,table4[10]);
LCD1602_Show_dat(0xb,1,table4[11]);
LCD1602_Show_dat(0xc,1,table4[12]);
LCD1602_Show_dat(0xd,1,table4[13]);
LCD1602_Show_dat(0xe,1,table4[14]);
LCD1602_Show_dat(0xf,1,table4[15]);
}
void show5(void)
{
LCD1602_Show_dat(0,1,table5[0]);
LCD1602_Show_dat(1,1,table5[1]);
LCD1602_Show_dat(2,1,table5[2]);
LCD1602_Show_dat(3,1,table5[3]);
LCD1602_Show_dat(4,1,table5[4]);
LCD1602_Show_dat(5,1,table5[5]);
LCD1602_Show_dat(6,1,table5[6]);
LCD1602_Show_dat(7,1,table5[7]);
LCD1602_Show_dat(8,1,table5[8]);
LCD1602_Show_dat(9,1,table5[9]);
LCD1602_Show_dat(0xa,1,table5[10]);
LCD1602_Show_dat(0xb,1,table5[11]);
LCD1602_Show_dat(0xc,1,table5[12]);
LCD1602_Show_dat(0xd,1,table5[13]);
LCD1602_Show_dat(0xe,1,table5[14]);
LCD1602_Show_dat(0xf,1,table5[15]);
}
void show6(void)
{
LCD1602_Show_dat(0,1,table6[0]);
LCD1602_Show_dat(1,1,table6[1]);
LCD1602_Show_dat(2,1,table6[2]);
LCD1602_Show_dat(3,1,table6[3]);
LCD1602_Show_dat(4,1,table6[4]);
LCD1602_Show_dat(5,1,table6[5]);
LCD1602_Show_dat(6,1,table6[6]);
LCD1602_Show_dat(7,1,table6[7]);
LCD1602_Show_dat(8,1,table6[8]);
LCD1602_Show_dat(9,1,table6[9]);
LCD1602_Show_dat(0xa,1,table6[10]);
LCD1602_Show_dat(0xb,1,table6[11]);
LCD1602_Show_dat(0xc,1,table6[12]);
LCD1602_Show_dat(0xd,1,table6[13]);
LCD1602_Show_dat(0xe,1,table6[14]);
LCD1602_Show_dat(0xf,1,table6[15]);
}
void mound(void)
{
if(open_flag==1)
{
show1();
}
else if(open_flag==2)
{
show2();
}
else if(open_flag==3)
{
show3();
}
else if(open_flag==4)
{
show4();
}
else if(open_flag==5)
{
show5();
}
else if(open_flag==6)
{
show6();
}
.
鏈接:https://pan.baidu.com/s/1G_gcOky-ssHRDY_aH9uRsQ
提取碼:1fnn
.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/281334.html
標籤:其他
