原理圖PCB:Altium Designer
程序編譯器:keil 5
編程語言:C語言
設(shè)計編號:C0059
設(shè)計介紹
STM32F103C8T6最小系統(tǒng)+LCD1602液晶+蜂鳴器+LED指示燈模塊+繼電器驅(qū)動模塊+矩陣鍵盤模塊+AT24C02芯片模塊;
具體功能:
1.采用矩陣鍵盤輸入、1602液晶顯示、繼電器模擬開鎖;
2.六位數(shù)字密碼(0-9),更改密碼時需要先驗證初始密碼,初始密碼正確,輸入兩次新密碼,兩次輸入一致即更改密碼成功;
3.開鎖時密碼輸入錯誤,聲光報警提示;
4.如修改的密碼忘記,可以通過管理員重置;
原理圖
1按鍵輸入模塊
由于本設(shè)計所用到的按鍵數(shù)量較多而不適合用獨立按鍵式鍵盤。采用的是矩陣式按鍵鍵盤,它由行和列組成,也稱行列式鍵盤,按鍵位于行列的交叉點上,密碼鎖的密碼由鍵盤輸入完成,與獨立式按鍵鍵盤相比,要節(jié)省很多I/O口。本設(shè)計中使用的這個4×4鍵盤不但能完成密碼的輸入還能作特別功能鍵使用。鍵盤的每個按鍵功能在程序設(shè)計中設(shè)置。它與單片機(jī)的連接如圖2-2所示
2.2 LCD顯示模塊
顯示部分由液晶顯示器LCD1602取代普通的數(shù)碼管完成。開鎖時,按下鍵盤上的開鎖按鍵后,利用鍵盤上的數(shù)字鍵0-9輸入密碼,每按下一個數(shù)字鍵后在顯示器上顯示一個*,輸入多少位就顯示多少個*。當(dāng)密碼輸入完成時,按下確認(rèn)鍵,如果輸入的密碼正確的話, LCD顯示“DOOR OPEN”,單片機(jī)其中P2.0引腳會輸出低電平,使三極管T2導(dǎo)通,電磁鐵吸合,繼電器開關(guān)跳轉(zhuǎn),電子密碼鎖被打開,如果密碼不正確,LCD顯示屏會顯示“CODE WRONG”,P2.0輸出的是高電平,電子密碼鎖不能打開。通過LCD顯示屏,可以清楚地判斷出密碼鎖所處的狀態(tài)。電路圖如圖2.3所示。
2.3報警模塊
報警部分由陶瓷壓電發(fā)聲裝置及外圍電路組成,加電后不發(fā)聲,當(dāng)有鍵按下時,“叮”聲,每按一下,發(fā)聲一次,密碼正確時,響兩聲并開鎖,當(dāng)密碼輸入錯誤時,單片機(jī)的PC13引腳為高電平,三極管T3導(dǎo)通蜂鳴器發(fā)出噪聲報警。如圖2.4所示。
2.4開鎖模塊
開鎖控制電路的功能是當(dāng)輸入正確的密碼后將鎖打開。系統(tǒng)使用單片機(jī)其中一引腳線發(fā)出信號,經(jīng)三極管放大后,由繼電器驅(qū)動電磁閥動作將鎖打開。用戶通過鍵盤任意設(shè)置密碼,并儲存在FLASH中作為鎖碼指令。開鎖步驟如下:利用鍵盤上的數(shù)字鍵0-9輸入密碼,最后按下確認(rèn)鍵。當(dāng)用戶輸入密碼后,單片機(jī)自動識別密碼,如果密碼不符,則報警。只有當(dāng)密碼正確,單片機(jī)才能使繼電器處于開鎖狀態(tài)。具體電路如圖2.5所示。
PCB
程序
main函數(shù)
#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;//標(biāo)識正在設(shè)置密碼,繼電器不關(guān)閉
int err3_flag=1;
int i=0;
int djtime_flag=360;
int down_flag=0;
static u8 key_up=1;//不支持連按
u8 open_flag=1;//用于標(biāo)識是否是系統(tǒng)的第一次打開
u8 pass_shuru=0;
u8 setpassword_flag=0;
u8 setopen_flag=1;//用于標(biāo)識開機(jī)之后是否打開過
u8 setpass_flag=0;//當(dāng)密碼設(shè)置成功之后的標(biāo)志位
u8 err_flag=0;//輸出錯誤次數(shù)記錄標(biāo)志位
u8 errtime_flag=0;//用于錯誤之后延時并重置屏幕的標(biāo)志位
u8 beep_flag=1;//用于標(biāo)識當(dāng)按鍵按下,蜂鳴器滴一聲的時間
u8 password[]={9,9,9,9,9,9};;//記錄輸入的密碼
u8 setpassword1[6]={1,1,1,1,1,1};//設(shè)置密碼的存放位置
u8 setpassword2[6];//設(shè)置密碼的存放位置
static u8 ok_flag=0;//記錄每次判斷密碼有幾位正確
u8 flag16=1;//標(biāo)志按鍵16是第幾次按下,做相應(yīng)的動作
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();
}
if(key!=240 &&key_up==1)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);//
delay_ms(20);
GPIO_ResetBits(GPIOC,GPIO_Pin_13);//
key_up=0;
if(key>=0 && key<=9)
{
if(pass_shuru==0)
{
if(i==0)
{
password[0]=1;
password[1]=3;
password[2]=1;
password[3]=4;
password[4]=2;
password[5]=0;
}
password[i]=key;
i++;
}
else if(pass_shuru==1)
{
if(i==0)
{
password[0]=1;
password[1]=3;
password[2]=1;
password[3]=4;
password[4]=2;
password[5]=0;
}
open_flag=1;
setpassword1[i]=key;
i++;
}
else if(pass_shuru==2)
{
if(i==0)
{
password[0]=1;
password[1]=3;
password[2]=1;
password[3]=4;
password[4]=2;
password[5]=0;
}
open_flag=1;
setpassword2[i]=key;
if(key==setpassword1[i])
{
ok_flag++;
}
i++;
}
}
if(key==13)
{
TIM_Cmd(TIM2, DISABLE);
//手動關(guān)閉繼電器
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
open_flag=1;
pass_shuru=0;
}
if(key==14)
{
if(i!=0)
{
i--;
}
}
if(key==15)
{
if(i==6)
{
if(pass_shuru==0)
{
if(setpass_flag==1)
{
for(i=0;i<6;i++)
{
if(password[i]==setpassword1[i])
{
ok_flag++;
}
}
i=0;
// LCD1602_Show_dat(0,0,0x30+ok_flag/10);
// LCD1602_Show_dat(1,0,0x30+ok_flag%10);
if(ok_flag==6)
{
open_flag=2;
ok_flag=0;
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_13);//
TIM_Cmd(TIM2, ENABLE); //使能TIMx
setopen_flag=2;
err_flag=0;
}
else
{
ok_flag=0;
for(i=0;i<6;i++)
{
if(password[i]==cjpassword[i])
{
ok_flag++;
}
}
i=0;
if(ok_flag==6)
{
open_flag=2;
ok_flag=0;
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_13);//
TIM_Cmd(TIM2, ENABLE); //使能TIMx
setopen_flag=2;
err_flag=0;
}
else
{
open_flag=3;
ok_flag=0;
err_flag++;
if(err_flag<3)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);//
TIM_Cmd(TIM4, ENABLE); //使能TIMx
}
else if(err_flag==3)
{
TIM_Cmd(TIM4, ENABLE);
err3_flag=2;
}
}
}
}
else
{
for(i=0;i<6;i++)
{
if(password[i]==cspassword[i])
{
ok_flag++;
}
}
i=0;
// LCD1602_Show_dat(0,0,0x30+ok_flag/10);
// LCD1602_Show_dat(1,0,0x30+ok_flag%10);
if(ok_flag==6)
{
open_flag=2;
ok_flag=0;
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_13);//
TIM_Cmd(TIM2, ENABLE); //使能TIMx
setopen_flag=2;
err_flag=0;
}
else
{
ok_flag=0;
for(i=0;i<6;i++)
{
if(password[i]==cjpassword[i])
{
ok_flag++;
}
}
i=0;
if(ok_flag==6)
{
open_flag=2;
ok_flag=0;
GPIO_SetBits(GPIOB,GPIO_Pin_0);
GPIO_SetBits(GPIOC,GPIO_Pin_13);//
TIM_Cmd(TIM2, ENABLE); //使能TIMx
setopen_flag=2;
err_flag=0;
}
else
{
open_flag=3;
ok_flag=0;
err_flag++;
if(err_flag<3)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);//
TIM_Cmd(TIM4, ENABLE); //使能TIMx
}
else if(err_flag==3)
{
TIM_Cmd(TIM4, ENABLE);
err3_flag=2;
}
}
}
}
}
}
else
{
i=0;
open_flag=3;
ok_flag=0;
err_flag++;
if(err_flag<3)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);//
TIM_Cmd(TIM4, ENABLE); //使能TIMx
}
else if(err_flag==3)
{
TIM_Cmd(TIM4, ENABLE);
err3_flag=2;
}
}
}
if(key==16)
{
if(GPIO_ReadOutputDataBit(GPIOB,GPIO_Pin_0))
{
setpass_flag11=2;
if(flag16==1)
{
open_flag=4;
pass_shuru=1;
flag16=2;
i=0;
}
else if(flag16==2)
{
open_flag=5;
pass_shuru=2;
flag16=3;
i=0;
}
else if(flag16==3)
{
i=0;
if(ok_flag==6)
{
setpass_flag=1;
flash1[0]=setpass_flag;
STMFLASH_Write(ADDR_hum_up_1,(u16*)flash1,sizeof(flash1));
for(j=0;j<6;j++)
{
flash2[j]=setpassword1[j];
}
STMFLASH_Write(ADDR_hum_up_2,(u16*)flash2,sizeof(flash2));
j=0;
open_flag=6;
ok_flag=0;
TIM_Cmd(TIM2, ENABLE); //使能TIMx
}
else
{
open_flag=3;
ok_flag=0;
TIM_Cmd(TIM4, ENABLE); //使能TIMx
}
flag16=0;
pass_shuru=0;
setpass_flag11=1;
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}
}
}
}
}
//
void KEY_Scan(void) //實現(xiàn)矩陣鍵盤。返回值為,各按鍵的鍵值,此鍵值由用戶自己定義。
{
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
if(P5==1 && P6==1 && P7==1&& P8==1)
{
key=240;
key_up=1;
}
else if(key_up==1&&(P5==0 || P6==0 || P7==0 || P8==0))
{
GPIO_SetBits(GPIOB,GPIO_Pin_14);
GPIO_SetBits(GPIOB,GPIO_Pin_15);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_13);
if(P5==0 || P6==0 || P7==0 || P8==0) //如果PA8.15.14.13全為0,則沒有鍵按下。此時,返回值為-1.
{
if(P8==0)
{
key=1;
}
else if(P7==0)
{
key=2;
}
else if(P6==0)
{
key=3;
}
else if(P5==0)
{
key=11;
}
}
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_SetBits(GPIOB,GPIO_Pin_15);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_14);
if(P5==0 || P6==0 || P7==0 || P8==0) //如果PA8.15.14.13全為0,則沒有鍵按下。此時,返回值為-1.
{
if(P8==0)
{
key=4;
}
else if(P7==0)
{
key=5;
}
else if(P6==0)
{
key=6;
}
else if(P5==0)
{
key=12;
}
}
GPIO_SetBits(GPIOB,GPIO_Pin_14);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_SetBits(GPIOA,GPIO_Pin_8);
GPIO_ResetBits(GPIOB,GPIO_Pin_15);
if(P5==0 || P6==0 || P7==0 || P8==0) //如果PA8.15.14.13全為0,則沒有鍵按下。此時,返回值為-1.
{
if(P8==0)
{
key=7;
}
else if(P7==0)
{
key=8;
}
else if(P6==0)
{
key=9;
}
else if(P5==0)
{
key=13;
}
}
GPIO_SetBits(GPIOB,GPIO_Pin_14);
GPIO_SetBits(GPIOB,GPIO_Pin_13);
GPIO_SetBits(GPIOB,GPIO_Pin_15);
GPIO_ResetBits(GPIOA,GPIO_Pin_8);
if(P5==0 || P6==0 || P7==0 || P8==0) //如果PA8.15.14.13全為0,則沒有鍵按下。此時,返回值為-1.
{
if(P8==0)
{
key=14;
}
else if(P7==0)
{
key=0;
}
else if(P6==0)
{
key=15;
}
else if(P5==0)
{
key=16;
}
}
}
}
int main(void)
{
BEEP_Init();
LED_Init();
delay_init();
LCD1602_Init();
KEY_Init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級,2位響應(yīng)優(yōu)先級
TIM2_Int_Init(4999,7199);
TIM3_Int_Init(29,35999);
TIM4_Int_Init(4999,7199);//每500ms計算一次速度的值,并顯示
LCD1602_Show_dat(0,0,table0[0]);
LCD1602_Show_dat(1,0,table0[1]);
LCD1602_Show_dat(2,0,table0[2]);
LCD1602_Show_dat(3,0,table0[3]);
LCD1602_Show_dat(4,0,table0[4]);
LCD1602_Show_dat(5,0,table0[5]);
LCD1602_Show_dat(6,0,table0[6]);
LCD1602_Show_dat(7,0,table0[7]);
LCD1602_Show_dat(8,0,table0[8]);
LCD1602_Show_dat(9,0,table0[9]);
LCD1602_Show_dat(0xa,0,table0[10]);
LCD1602_Show_dat(0xb,0,table0[11]);
LCD1602_Show_dat(0xc,0,table0[12]);
LCD1602_Show_dat(0xd,0,table0[13]);
LCD1602_Show_dat(0xe,0,table0[14]);
LCD1602_Show_dat(0xf,0,table0[15]);
// flash1[0]=100;
//STMFLASH_Write(ADDR_hum_up_1,(u16*)flash1,sizeof(flash1));
//STMFLASH_Write(ADDR_hum_up_2,(u16*)flash2,sizeof(flash2));
TIM_Cmd(TIM3, ENABLE);
STMFLASH_Read(ADDR_hum_up_1,(u16*)flash1,sizeof(flash1));
setpass_flag=flash1[0];
STMFLASH_Read(ADDR_hum_up_2,(u16*)flash2,sizeof(flash2));
for(j=0;j<6;j++)
{
setpassword1[j]=flash2[j];
}
j=0;
open_flag=1;
pass_shuru=0;
while(1)
{
mound();
if(down_flag==2)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}
if(down_flag==5)
{
down_flag=0;
if(setpass_flag11==2)
{
TIM_Cmd(TIM2, DISABLE);
}
else
{
open_flag=1;
pass_shuru=0;
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
TIM_Cmd(TIM2, DISABLE);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
}
}
if(errtime_flag==2)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}
if(errtime_flag==3)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
if(errtime_flag==4)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}
if(errtime_flag==5)
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
if(errtime_flag==6)
{
open_flag=1;
pass_shuru=0;
errtime_flag=0;
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
TIM_Cmd(TIM4, DISABLE);
}
}
}
void TIM2_IRQHandler(void) //TIM2中斷
{
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET) //檢查TIM3更新中斷發(fā)生與否
{
TIM_ClearITPendingBit(TIM2, TIM_IT_Update ); //清除TIMx更新中斷標(biāo)志
}
down_flag++;
}
//定時器3中斷服務(wù)程序
void TIM3_IRQHandler(void) //TIM3中斷
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //檢查TIM3更新中斷發(fā)生與否
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx更新中斷標(biāo)志
}
if(err_flag<3)
{
KEY_Scan();
}
}
//定時器4中斷服務(wù)程序
void TIM4_IRQHandler(void) //TIM4中斷
{
if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET) //檢查TIM3更新中斷發(fā)生與否
{
TIM_ClearITPendingBit(TIM4, TIM_IT_Update ); //清除TIMx更新中斷標(biāo)志
}
if(err3_flag==1)
{
errtime_flag++;
}
else if(err3_flag==2)
{
TIM_Cmd(TIM3, DISABLE);
if(err_flag==3)
{
open_flag=3;
djtime_flag--;
if(djtime_flag%2==0)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_13);
}
else
{
GPIO_SetBits(GPIOC,GPIO_Pin_13);
}
if(djtime_flag==0)
{
open_flag=1;
pass_shuru=0;
err_flag=0;
djtime_flag=360;
TIM_Cmd(TIM4, DISABLE);
TIM_Cmd(TIM3, ENABLE);
}
}
}
}
設(shè)計說明書
? 本設(shè)計選用屬于STM32系列的STM32F103C8T6單片機(jī)作為控制電路的核心部件,矩陣鍵盤用于輸入數(shù)字密碼和進(jìn)行各種功能的實現(xiàn)。由用戶通過連接單片機(jī)的矩陣鍵盤輸入密碼,后經(jīng)過單片機(jī)對用戶輸入的密碼與自己保存的密碼進(jìn)行對比從而判斷密碼是否正確,然后控制引腳的高低電平傳到開鎖電路或者報警電路控制開鎖還是報警,實際使用時只要將單片機(jī)的負(fù)載由繼電器換成電子密碼鎖的電磁鐵吸合線圈即可。系統(tǒng)整體框圖如圖1-1所示。各模塊功能如下:
1)鍵盤輸入模塊:分為密碼輸入按鍵與幾個功能按鍵,用于完成密碼鎖輸入功能。
2)顯示模塊:用于完成對系統(tǒng)狀態(tài)顯示及操作提示功能。
3)報警模塊:用于完成輸錯密碼多次時的警報功能。
4)開鎖模塊:應(yīng)用繼電器及發(fā)光二極管模擬開鎖,完成開鎖及開鎖提示。