|
本系統(tǒng)采用以單片機(jī)為核心元件的控制方案。由于單片機(jī)種類繁多,各種型號(hào)都有其一定的應(yīng)用環(huán)境,因此在選用時(shí)要多加比較,合理選擇,以獲得最佳的性價(jià)比。一般來(lái)說(shuō)在選取單片機(jī)時(shí)從下面幾個(gè)方面考慮:性能、存儲(chǔ)器、運(yùn)行速度、I/O口、定時(shí)/計(jì)數(shù)器、串行接口、模擬電路功能、工作電壓、功耗、封裝形式、抗干擾性、保密性,除了以上的一些方面外,還有一些最基本的條件,比如:中斷源的數(shù)量和優(yōu)先級(jí)、工作溫度范圍、有沒(méi)有低電壓檢測(cè)功能、單片機(jī)內(nèi)有無(wú)時(shí)鐘振蕩器、有無(wú)上電復(fù)位功能等。在開發(fā)過(guò)程中還要考慮開發(fā)工具、編程器、開發(fā)成本、開發(fā)人員的適應(yīng)性、技術(shù)支持和服務(wù)等因素。基于以上因素本設(shè)計(jì)選用單片機(jī)STC89C516作為本設(shè)計(jì)的核心元件,利用單片機(jī)靈活的編程設(shè)計(jì)和豐富的I/O端口,及其控制的準(zhǔn)確性,實(shí)現(xiàn)基本的密碼鎖功能。在單片機(jī)的外圍電路外接輸入鍵盤用于密碼的輸入和一些功能的控制,外接AT24C02芯片用于密碼的存儲(chǔ),外接LCD1602顯示器用于顯示作用。
二、 硬件設(shè)計(jì)硬件連接如下:
P1 -->矩陣鍵盤
P20--> EEPROM模塊SDA
P21--> EEPROM模塊SCL
P22-->繼電器模塊J15
其他管腳說(shuō)明:
P0 LCD1602_DATAPINS
P2^7 LCD1602_E;
P2^5 LCD1602_RW;
P2^6 LCD1602_RS;
P1 矩陣鍵盤
P2^1; 存儲(chǔ)模塊 24C02 SCL
P2^0 存儲(chǔ)模塊 24C02 SDA
2.1 主控芯片
2.2存儲(chǔ)模塊24c02
存儲(chǔ)模塊的設(shè)計(jì)是把WP引腳接到GND上因?yàn)橐屍骷M(jìn)行正常的讀/寫操作,把SDA串行數(shù)據(jù)/地址與單片機(jī)的P2.0引腳使AT24C02與單片機(jī)進(jìn)行所有數(shù)據(jù)的發(fā)送或接收,把SCL串行時(shí)鐘引腳與單片機(jī)的P2.1引腳相連接,讓單片機(jī)產(chǎn)生一個(gè)AT24C02工作的時(shí)鐘,使其正常的工作。存儲(chǔ)模塊電路如圖所示。
AT24C02的特點(diǎn):數(shù)據(jù)線看門狗定時(shí)器;可編程復(fù)位門級(jí);高數(shù)據(jù)傳輸速率400kHz速率和I2C總線;2.7V至7V電壓;低功耗CMOS工藝兼容;16 bespate寫緩沖區(qū);反撇寫保護(hù)芯片;高低電平復(fù)位信號(hào)輸出;100萬(wàn)擦除周期;保存長(zhǎng)達(dá)100年。
2.3顯示模塊LCD1602
如果想要了解系統(tǒng)的運(yùn)行與工作狀態(tài)顯示器是不可缺少的,顯示器是一個(gè)典型的輸出設(shè)備并且它的實(shí)際應(yīng)用也是極為廣泛的,幾乎所有的電子產(chǎn)品都會(huì)使用到顯示器其差別僅在于顯示器的結(jié)構(gòu)類型不同而已。最簡(jiǎn)單的顯示器可以是LED發(fā)光二極管或者數(shù)碼管,它可以給出一個(gè)簡(jiǎn)單的開關(guān)信息或者數(shù)字顯示,而需要顯示復(fù)雜的完整的信息上述的器件就不能勝任,而液晶的出現(xiàn)就很好的解決了這一問(wèn)題,它不僅顯示內(nèi)容豐富而且好節(jié)約了單片機(jī)的管腳資源。本設(shè)計(jì)采用的是液晶顯示LCD1602。LCD1602內(nèi)部的字符已經(jīng)儲(chǔ)存了不同的字符形式,每一個(gè)字符都有一個(gè)固定的代碼,其代碼與標(biāo)準(zhǔn)的ASCII字符代碼一致。因此只要寫入顯示字符的ASCII碼即可,這種標(biāo)準(zhǔn)化的設(shè)計(jì)給使用帶來(lái)很大的方便。比如英文字母“C”的ASCII代碼是01000011(43H),顯示時(shí)單片機(jī)往液晶模塊寫入顯示指令,模塊就會(huì)把地址為43H中的點(diǎn)陣字符圖形識(shí)別出,并會(huì)在液晶屏相應(yīng)位置上看到字母“C”。
目前市場(chǎng)字符液晶絕大多數(shù)是基于HD44780的液晶芯片,控制原理是完全相同的,因此基于HD44780的寫控制程序可以很容易地應(yīng)用到市場(chǎng)上大部分的字符液晶。LCD1602液晶的幾個(gè)特性:+5V電壓、對(duì)比度可調(diào)、內(nèi)含復(fù)位電路;提供各種控制命令,如:清屏、字符閃爍、光標(biāo)閃爍、顯示移位等多種功能;有80字節(jié)顯示數(shù)據(jù)存儲(chǔ)器DDRAM;內(nèi)建有160個(gè)5X7點(diǎn)陣的字型的字符發(fā)生器CGROM 8個(gè)可由用戶自定義的5X7的字符發(fā)生器CGRAM。1602的引腳如下所示:
LCD1602采用標(biāo)準(zhǔn)的16腳接口,其中VSS為地電源,VDD接5V正電源,VEE為液晶顯示器。RS為寄存器選擇,高電平時(shí)選擇數(shù)據(jù)寄存器、低電平時(shí)選擇指令寄存器。RW為讀寫信號(hào)線,高電平1時(shí)進(jìn)行讀操作,低電平0時(shí)進(jìn)行寫操作。E端為使能端。D0~D7為8位雙向數(shù)據(jù)線。
2.4鍵盤輸入模塊
鍵盤是單片機(jī)十分重要的輸入設(shè)備,是實(shí)現(xiàn)人機(jī)對(duì)話的紐帶。鍵盤是由一組規(guī)則排列的按鍵組成,一個(gè)按鍵實(shí)際上就是一個(gè)開關(guān)元件,即鍵盤是一組規(guī)則排列的開關(guān)。根據(jù)按鍵與單片機(jī)的連接方式不同,按鍵主要分為獨(dú)立式按鍵和矩陣式按鍵 ,有了這些按鍵,對(duì)單片機(jī)的控制就方便多了。
本設(shè)計(jì)按鍵數(shù)量較多,所以采用矩陣式按鍵以節(jié)省I/O口線。將16個(gè)按鍵分為4排4列排列好,下圖是矩陣鍵盤硬件結(jié)構(gòu)。當(dāng)有一個(gè)鍵按下時(shí),通過(guò)某一邊引腳賦低電平,掃描全部引腳看是否與最初的賦值一樣,不一樣則根據(jù)相應(yīng)的算法(通過(guò)改變后的值與初始值相或,根據(jù)結(jié)果賦值)確定是哪個(gè)鍵按下。
2.5開鎖電路
開鎖電路的功能是當(dāng)輸入正確的密碼后密碼鎖將被鎖定,既開鎖。當(dāng)單片機(jī)P2.2引腳發(fā)出信號(hào)經(jīng)三極管放大后,觸動(dòng)電磁閥即會(huì)把鎖打開。一旦輸入密碼,單片機(jī)便會(huì)與初始密碼進(jìn)行比對(duì),如果密碼輸入3次都與原始密碼不相符即會(huì)報(bào)警。其原理圖如圖3-11所示
單片機(jī)源程序如下:
- /**************************************************************************************
- * 電子密碼鎖 *
- 實(shí)現(xiàn)現(xiàn)象:下載程序輸入正確密碼,會(huì)聽到繼電器吸合的聲音
- 硬件連接:
- P1 -->矩陣鍵盤
- P20--> EEPROM模塊SDA
- P21--> EEPROM模塊SCL
- P22-->繼電器模塊J15
-
- 矩陣鍵盤:
- 0 1 2 3
-
- 4 5 6 7
-
- 8 9 返回 確定
-
- $ $ $ $
- 注意事項(xiàng):無(wú)
- ***************************************************************************************/
- #include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
- #include "lcd.h"
- #include "key.h"
- #include "i2c.h"
- #define u16 unsigned int //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
- #define u8 unsigned char
- sbit AS=P2^2; //繼電器
- /*****************************************************************************/
- /*****************************************************************************/
- u8 pw_num,Error_Num,PassWord_Length=6;
- u8 PASSWORD[]={6,6,6,6,6,6,6,6,6,6};
- u8 INPUT_PW_Tab[10];
- u8 key_num,Step,Step5,Load_first_flag=0;
- /*****************************************************************************/
- /*******************************************************************************/
- bit result_flag,Input_suc_flag;
- bit List1=0;
- /*****************************************************************************/
- /*******************************************************************************/
- void Step_0();
- void Step_1();
- void Step_2();
- void Step_3();
- void Step_4();
- void Step_5();
- void Step5_0();
- void Step5_1();
- void Step5_2();
- void Step5_3();
- void Step5_4();
- void Step5_5();
- void Step_6();
- /********************************************************************************/
- /*******************************************************************************/
- void CipherComparison();
- void input_password(bit m);
- void Read_Password();
- /*******************************************************************************
- * 函 數(shù) 名 : main
- * 函數(shù)功能 : 主函數(shù)
- * 輸 入 : 無(wú)
- * 輸 出 : 無(wú)
- *******************************************************************************/
- void main()
- {
- u8 data1,a;
- // ShowString(0x00," Pechin Science ");
- // At24c02Write(0,0); //開機(jī)顯示密碼
- LcdWriteCom(0x01); //清屏
- for(data1=0;data1<PassWord_Length+2;data1++)
- {
- a=At24c02Read(data1)+0x30;
- LcdWriteData(a);
- delay(1000);
- }
-
- delay(1000);
- LcdInit();
- delay(1000);
- Step=0;
- Step5=0;
- Error_Num=0x00;
- Read_Password();
-
- //保存 密碼長(zhǎng)度
- // for(j=0;j<10;j++)
- // {
- // At24c02Write(j,j);
- // delay(100);
- // }
- //
-
- while(1)
- {
- key_num=KeyDown(); //讀取輸入值
- switch(Step)
- {
- case 0:
- {Step_0();break;}
- case 1:
- {Step_1();break;}
- case 2:
- {Step_2();break;}
- case 3:
- {Step_3();break;}
- case 4:
- {Step_4();break;}
- case 5:
- {Step_5();break;}
- case 6:
- {Step_6();break;}
-
- }
- }
- }
- /*****************************************************************************/
- /*******************************************************************************/
- void Step_0()
- {
- LcdInit();
- ShowString(0x00," Pechin Science "); //第一行顯示Pechin Science
- ShowString(0x10," WELCOME! "); // 第二行顯示 WELCOME!
- while(KeyDown()==0xff)Step=1; // 有按鍵按下進(jìn)入下一步
- }
- /*****************************************************************************/
- /*******************************************************************************/
- void Step_1()
- {
- LcdWriteCom(0x01); //清屏
- ShowString(0x00,"Unlock");
- ShowString(0x0f,"<"); //1602第一行顯示unlock
- ShowString(0x10,"Change Password");
- ShowString(0x1f," "); // 1602第二行顯示Change Password
- Step=2; //
- }
- /*****************************************************************************/
- /*******************************************************************************/
- void Step_2()
- {
- if(key_num!=0x0b)
- {
- if((key_num==0x01) ||( key_num==0x09)) //1鍵或9鍵按下
- {
- List1=~List1; //Change Password
- if(List1==0)
- {
- ShowString(0x0f,"<"); // Unlock <
- ShowString(0x1f," "); // Change Password
- }
- else
- {
- ShowString(0x0f," "); // Unlock
- ShowString(0x1f,"<"); // Change Password <
- }
- }
- }
- else //確認(rèn)鍵按下
- {
- if(List1==0){Step=3;}
- else {Step=5;List1=0;}
- }
- }
- /*****************************************************************************/
- /*******************************************************************************/
- void Step_3() //
- {
- Step=4;
- pw_num=0;
- LcdInit();
- ShowString(0x00,"Pass Word: ");
-
-
- }
- /*****************************************************************************/
- /*******************************************************************************/
- void Step_4()
- {
- input_password(0); //輸入密碼并以*顯示
- if(Input_suc_flag==1){Step=6;} //密碼輸入完成進(jìn)入下一步
- Input_suc_flag=0; //清除密碼輸入完成標(biāo)志
- }
- /*****************************************************************************/
- /*******************************************************************************/
- void Step_5() //修改密碼
- {
- switch(Step5)
- {
-
- case 0: {Step5_0();} break;
- case 1: {Step5_1();} break;
- case 2: {Step5_2();} break;
- case 3: {Step5_3();} break;
- case 4: {Step5_4();} break;
- case 5: {Step5_5();} break;
- }
- }
- /*****************************************************************************/
- /*******************************************************************************/
- void Step_6()
- {
- CipherComparison(); //密碼比對(duì)
- if(result_flag==1) //密碼正確
- {
- LcdInit();
- ShowString(0x00," WELCOME!");
- AS=0; //開繼電器
- delay(60000);
- delay(60000);
- AS=1; //關(guān)繼電器
- }
- else //密碼錯(cuò)誤
- {
- LcdInit();
- ShowString(0x00,"Error 01!");
- }
-
- Step=0;
-
- }
- /****************************************************************************************
- 密碼輸入函數(shù)
- 密碼長(zhǎng)度:pw_num
- 密碼輸入完成標(biāo)志:Input_suc_flag
- *****************************************************************************************/
- void Step5_0()
- {
- LcdWriteCom(0x01); //清屏
- ShowString (0x00,"Input PassWord:"); //1602顯示:輸入密碼
- Step5=1;
- pw_num=0;
- }
- void Step5_1()
- {
- input_password(0); // 輸入密碼并以*顯示
- if(Input_suc_flag==1) //密碼輸入完成
- {
- Step5=2; //
- Input_suc_flag=0; //清除密碼輸入完成標(biāo)志
- }
- }
- void Step5_2() //
- {
- CipherComparison(); //密碼比對(duì)
- Step5=3;
- }
- void Step5_3() //
- {
- if(result_flag==0) // 密碼錯(cuò)誤
- {
- if(Error_Num<3) //輸出錯(cuò)誤次數(shù)小于3
- {
- Error_Num++;
- LcdInit();
- ShowString (0x00,"Error 01");
- delay(20000);
- Step5=0;
- }
- else //密碼錯(cuò)誤次數(shù)大于3
- {
- Error_Num=0;
- Step=0;
- }
-
- }
- else //密碼正確
- {
- LcdInit();
- ShowString (0x00,"New PassWord:");
- pw_num=0;
- Step5=4;
- }
-
-
- }
- void Step5_4()
- {
- input_password(1); //輸入密碼并顯示
- if(Input_suc_flag==1) //輸入完成
- {
- Step5=5;
- Input_suc_flag=0;
- LcdWriteCom(0x01); //清屏
- ShowString (0x00," OK!");
- }
- }
- void Step5_5()
- {
- unsigned char j;
-
- PassWord_Length=pw_num; //讀取輸入密碼長(zhǎng)度
- At24c02Write(0,Load_first_flag);
- delay(100);
- At24c02Write(1,PassWord_Length); //保存 密碼長(zhǎng)度
- delay(100);
- for(j=0;j<PassWord_Length;j++)
- {
- PASSWORD[j]=INPUT_PW_Tab[j]; //讀取密碼
- At24c02Write(j+2,INPUT_PW_Tab[j]); //保存密碼至EEPROM
- delay(100);
- }
- Step5=0;
- Step=0;
- }
- void Read_Password()
- {
- unsigned char j;
- Load_first_flag=At24c02Read(0x00);
- if(Load_first_flag==0) //初次運(yùn)行
- {
-
- Load_first_flag=1;
- At24c02Write(0,0x01);
- delay(100);
- At24c02Write(1,0x06); //寫默認(rèn)密碼長(zhǎng)度6至EEPROM
- delay(100);
- for(j=0;j<PassWord_Length;j++)
- {
- At24c02Write(j+2,8); //寫默認(rèn)密碼888888至EEPROM
- PASSWORD[j]=INPUT_PW_Tab[j]; //讀密碼
- delay(100);
- }
- }
-
- Load_first_flag=At24c02Read(0x00);
- PassWord_Length=At24c02Read(0x01); //讀取密碼長(zhǎng)度
- for(j=0;j<PassWord_Length;j++) //讀取密碼
- {
- PASSWORD[j]=At24c02Read(j+2);
- }
-
- }
- void input_password(bit m)
- {
- unsigned char j;
- if(key_num!=0x0b) //ok鍵沒(méi)有按下
- {
- if(key_num<0x0a) //1-9按下
- {
- INPUT_PW_Tab[pw_num]=key_num; //保存至輸入密碼數(shù)組
- pw_num=pw_num+1; //密碼長(zhǎng)度+1
-
- LcdWriteCom(0xc0);
- for(j=0;j<pw_num;j++)
- {
- if(m==0) {LcdWriteData('*'); } //密碼隱藏
- else {LcdWriteData(INPUT_PW_Tab[j]+0x30);} //顯示密碼
- }
-
- }
- if(key_num==0x0a) //返回鍵按下
- {
- if(pw_num!=0) {pw_num=pw_num-1;}
- else {Step=0;}
-
-
- // ShowString (0x00,"Pass Word:");
- LcdWriteCom(0xc0);
- for(j=0;j<pw_num;j++)
- {
- if(m==0) {LcdWriteData('*'); } //密碼隱藏
- else {LcdWriteData(INPUT_PW_Tab[j]+0x30);} //顯示密碼
- }
- LcdWriteData(' ');
- }
- }
- else //ok鍵按下
- {
- if(pw_num==0)
- {
- Step=0;
- LcdWriteCom(0x01);
- ShowString (0x00,"Error 02!");
- delay(10000);
- }
-
- else{
- Input_suc_flag=1;
- }
- //AS=0;
- }
- }
- /*******************************************************
- 密碼比對(duì)
- ********************************************************/
- void CipherComparison()
- {
- u8 i,j=0;
- if(PassWord_Length==pw_num) //密碼長(zhǎng)度比對(duì)
- {
- for(i=0;i<PassWord_Length;i++) //密碼比對(duì)
- {
-
- if(PASSWORD[i]!=INPUT_PW_Tab[i])
- {
- result_flag=0;break; //密碼錯(cuò)誤
- }
- else
- {
- result_flag=1; //密碼正確
- }
- INPUT_PW_Tab[i]=0XFF; //清除密碼緩存數(shù)組
- }
- }
- else
- {result_flag=0;}
-
- }
復(fù)制代碼
所有程序51hei提供下載:
程序.zip
(63.28 KB, 下載次數(shù): 15)
2020-12-15 17:38 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
|
|