加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入

基于STM32設(shè)計(jì)的電子密碼鎖電路方案

08/07 09:24
3787
服務(wù)支持:
技術(shù)交流群

完成交易后在“購(gòu)買成功”頁(yè)面掃碼入群,即可與技術(shù)大咖們分享疑惑和經(jīng)驗(yàn)、收獲成長(zhǎng)和認(rèn)同、領(lǐng)取優(yōu)惠和紅包等。

虛擬商品不可退

當(dāng)前內(nèi)容為數(shù)字版權(quán)作品,購(gòu)買后不支持退換且無(wú)法轉(zhuǎn)移使用。

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論
放大
實(shí)物圖
相關(guān)方案
  • 方案介紹
  • 相關(guān)文件
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

(程序+原理圖+PCB+設(shè)計(jì)說(shuō)明書(shū)+視頻講解)

原理圖PCB:Altium Designer

程序編譯器:keil 5

編程語(yǔ)言:C語(yǔ)言

設(shè)計(jì)編號(hào):C0059

設(shè)計(jì)介紹

STM32F103C8T6最小系統(tǒng)+LCD1602液晶+蜂鳴器+LED指示燈模塊+繼電器驅(qū)動(dòng)模塊+矩陣鍵盤(pán)模塊+AT24C02芯片模塊;

具體功能:

1.采用矩陣鍵盤(pán)輸入、1602液晶顯示、繼電器模擬開(kāi)鎖;

2.六位數(shù)字密碼(0-9),更改密碼時(shí)需要先驗(yàn)證初始密碼,初始密碼正確,輸入兩次新密碼,兩次輸入一致即更改密碼成功;

3.開(kāi)鎖時(shí)密碼輸入錯(cuò)誤,聲光報(bào)警提示;

4.如修改的密碼忘記,可以通過(guò)管理員重置;

imgimg

原理圖

1按鍵輸入模塊

由于本設(shè)計(jì)所用到的按鍵數(shù)量較多而不適合用獨(dú)立按鍵式鍵盤(pán)。采用的是矩陣式按鍵鍵盤(pán),它由行和列組成,也稱行列式鍵盤(pán),按鍵位于行列的交叉點(diǎn)上,密碼鎖的密碼由鍵盤(pán)輸入完成,與獨(dú)立式按鍵鍵盤(pán)相比,要節(jié)省很多I/O口。本設(shè)計(jì)中使用的這個(gè)4×4鍵盤(pán)不但能完成密碼的輸入還能作特別功能鍵使用。鍵盤(pán)的每個(gè)按鍵功能在程序設(shè)計(jì)中設(shè)置。它與單片機(jī)的連接如圖2-2所示

img

2.2 LCD顯示模塊

顯示部分由液晶顯示器LCD1602取代普通的數(shù)碼管完成。開(kāi)鎖時(shí),按下鍵盤(pán)上的開(kāi)鎖按鍵后,利用鍵盤(pán)上的數(shù)字鍵0-9輸入密碼,每按下一個(gè)數(shù)字鍵后在顯示器上顯示一個(gè)*,輸入多少位就顯示多少個(gè)*。當(dāng)密碼輸入完成時(shí),按下確認(rèn)鍵,如果輸入的密碼正確的話, LCD顯示“DOOR OPEN”,單片機(jī)其中P2.0引腳會(huì)輸出低電平,使三極管T2導(dǎo)通,電磁鐵吸合,繼電器開(kāi)關(guān)跳轉(zhuǎn),電子密碼鎖被打開(kāi),如果密碼不正確,LCD顯示屏會(huì)顯示“CODE WRONG”,P2.0輸出的是高電平,電子密碼鎖不能打開(kāi)。通過(guò)LCD顯示屏,可以清楚地判斷出密碼鎖所處的狀態(tài)。電路圖如圖2.3所示。

img

2.3報(bào)警模塊

報(bào)警部分由陶瓷壓電發(fā)聲裝置及外圍電路組成,加電后不發(fā)聲,當(dāng)有鍵按下時(shí),“?!甭?,每按一下,發(fā)聲一次,密碼正確時(shí),響兩聲并開(kāi)鎖,當(dāng)密碼輸入錯(cuò)誤時(shí),單片機(jī)的PC13引腳為高電平,三極管T3導(dǎo)通蜂鳴器發(fā)出噪聲報(bào)警。如圖2.4所示。

img

2.4開(kāi)鎖模塊

開(kāi)鎖控制電路的功能是當(dāng)輸入正確的密碼后將鎖打開(kāi)。系統(tǒng)使用單片機(jī)其中一引腳線發(fā)出信號(hào),經(jīng)三極管放大后,由繼電器驅(qū)動(dòng)電磁閥動(dòng)作將鎖打開(kāi)。用戶通過(guò)鍵盤(pán)任意設(shè)置密碼,并儲(chǔ)存在FLASH中作為鎖碼指令。開(kāi)鎖步驟如下:利用鍵盤(pán)上的數(shù)字鍵0-9輸入密碼,最后按下確認(rèn)鍵。當(dāng)用戶輸入密碼后,單片機(jī)自動(dòng)識(shí)別密碼,如果密碼不符,則報(bào)警。只有當(dāng)密碼正確,單片機(jī)才能使繼電器處于開(kāi)鎖狀態(tài)。具體電路如圖2.5所示。

img

img

PCB

img

程序

img

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í)正在設(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)識(shí)是否是系統(tǒng)的第一次打開(kāi)

u8 pass_shuru=0;

u8 setpassword_flag=0;
u8 setopen_flag=1;//用于標(biāo)識(shí)開(kāi)機(jī)之后是否打開(kāi)過(guò)
u8 setpass_flag=0;//當(dāng)密碼設(shè)置成功之后的標(biāo)志位
u8 err_flag=0;//輸出錯(cuò)誤次數(shù)記錄標(biāo)志位
u8 errtime_flag=0;//用于錯(cuò)誤之后延時(shí)并重置屏幕的標(biāo)志位
u8 beep_flag=1;//用于標(biāo)識(shí)當(dāng)按鍵按下,蜂鳴器滴一聲的時(shí)間
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)的動(dò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);
			//手動(dòng)關(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) //實(shí)現(xiàn)矩陣鍵盤(pá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,則沒(méi)有鍵按下。此時(shí),返回值為-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,則沒(méi)有鍵按下。此時(shí),返回值為-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,則沒(méi)有鍵按下。此時(shí),返回值為-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,則沒(méi)有鍵按下。此時(shí),返回值為-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)先級(jí),2位響應(yīng)優(yōu)先級(jí)
	TIM2_Int_Init(4999,7199);
  TIM3_Int_Init(29,35999);
	TIM4_Int_Init(4999,7199);//每500ms計(jì)算一次速度的值,并顯示
	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)  //檢查T(mén)IM3更新中斷發(fā)生與否
		{
		TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //清除TIMx更新中斷標(biāo)志 
		}

		down_flag++;
		





		
}

//定時(shí)器3中斷服務(wù)程序
void TIM3_IRQHandler(void)   //TIM3中斷
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //檢查T(mén)IM3更新中斷發(fā)生與否
		{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中斷標(biāo)志 
		}
	if(err_flag<3)
	{
		KEY_Scan();


	}



}


//定時(shí)器4中斷服務(wù)程序
void TIM4_IRQHandler(void)   //TIM4中斷
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  //檢查T(mén)IM3更新中斷發(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è)計(jì)說(shuō)明書(shū)

img

? 本設(shè)計(jì)選用屬于STM32系列的STM32F103C8T6單片機(jī)作為控制電路的核心部件,矩陣鍵盤(pán)用于輸入數(shù)字密碼和進(jìn)行各種功能的實(shí)現(xiàn)。由用戶通過(guò)連接單片機(jī)的矩陣鍵盤(pán)輸入密碼,后經(jīng)過(guò)單片機(jī)對(duì)用戶輸入的密碼與自己保存的密碼進(jìn)行對(duì)比從而判斷密碼是否正確,然后控制引腳的高低電平傳到開(kāi)鎖電路或者報(bào)警電路控制開(kāi)鎖還是報(bào)警,實(shí)際使用時(shí)只要將單片機(jī)的負(fù)載由繼電器換成電子密碼鎖的電磁鐵吸合線圈即可。系統(tǒng)整體框圖如圖1-1所示。各模塊功能如下:

1)鍵盤(pán)輸入模塊:分為密碼輸入按鍵與幾個(gè)功能按鍵,用于完成密碼鎖輸入功能。

2)顯示模塊:用于完成對(duì)系統(tǒng)狀態(tài)顯示及操作提示功能。

3)報(bào)警模塊:用于完成輸錯(cuò)密碼多次時(shí)的警報(bào)功能。

4)開(kāi)鎖模塊:應(yīng)用繼電器及發(fā)光二極管模擬開(kāi)鎖,完成開(kāi)鎖及開(kāi)鎖提示。

器件清單

img

資料清單

img

資料下載鏈接

  • 設(shè)計(jì)資料獲取聯(lián)系方式.doc

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
STM32F427VIT6 1 STMicroelectronics High-performance advanced line, Arm Cortex-M4 core with DSP and FPU, 2 Mbytes of Flash memory, 180 MHz CPU, ART Accelerator, Chrom-ART Accelerator,FSMC

ECAD模型

下載ECAD模型
$22.31 查看
ATXMEGA128D4-CU 1 Microchip Technology Inc IC MCU 8BIT 128KB FLASH 49VFBGA
$16.33 查看
TMS320F28335PGFA 1 Texas Instruments C2000&trade; 32-bit MCU with 150 MIPS, FPU, 512 KB flash, EMIF, 12b ADC 176-LQFP -40 to 85

ECAD模型

下載ECAD模型
$29.61 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜