仿真圖proteus8.16(有低版本)
程序編譯器:keil 4/keil 5
編程語言:C語言
設計編號:P14
1.主要功能:
基于51單片機AT89C51/52(與AT89S51/52、AT89C51/52、STC89C51/52等51內(nèi)核單片機通用)
基于51單片機的密碼鎖LCD1602液晶顯示設計
1.按鍵設置6位密碼,輸入密碼若密碼正確,則鎖打開。顯示open!開鎖指示燈點亮。
2.密碼可以自己修改(6位密碼),必須是開始狀態(tài)才能改密。為防止誤操作,修改密碼得輸入兩次。
3.若密碼輸入錯誤次數(shù)超過3次,蜂鳴器報警并且鎖定鍵盤,需復位重新開始操作。
4.系統(tǒng)具有24C02有復位、掉電保存密碼功能。
5.需要在Proteus軟件和普中51開發(fā)板實現(xiàn)功能驗證。
(目前僅完全適配普中開發(fā)板A234,其他普中開發(fā)板型號可能需要做代碼修改或接線)
需注意仿真中51單片機芯片是兼容的,AT89C51,AT89C52是51單片機的具體型號,內(nèi)核是一樣的。相同的原理圖里,無論stc還是at都一樣,引腳功能都是一樣的,程序是兼容的,芯片可以替換為STC89C52/STC89C51/AT89C52/AT89C51等51單片機芯片。
講解視頻:
仿真講解+實物演示+代碼講解
2.仿真
開始仿真
打開仿真工程,雙擊proteus中的單片機,選擇hex文件路徑,然后開始仿真。
1、首次使用時輸入:131420,對密碼進行初始化,當顯示:initpassword, 證明密碼初始化完成,此時的密碼為:000000。然后可以改密了。
(如密碼忘記就再輸入131420初始化,然后密碼就是000000)
2.輸入密碼正確,LCD顯示open,繼電器導通模擬開鎖動作。
3當輸入密碼錯誤后,LCD顯示error,報警并鎖定鍵盤3秒鐘。
3. 程序代碼
使用keil4或者keil5編譯,代碼有注釋,可以結合報告理解代碼含義。
//==================================================================================================
//=======================================LCD1602====================================================
//==================================================================================================
#define yi 0x80 //LCD第一行的初始位置,因為LCD1602字符地址首位D7恒定為1(100000000=80)
#define er 0x80+0x40 //LCD第二行初始位置(因為第二行第一個字符位置地址是0x40)
//----------------延時函數(shù),后面經(jīng)常調(diào)用----------------------
void delay(uint xms)//延時函數(shù),有參函數(shù)
{
uint x,y;
for(x=xms;x>0;x--)
for(y=110;y>0;y--);
}
//--------------------------寫指令---------------------------
void write_1602com(uchar com)//****液晶寫入指令函數(shù)****
{
lcd1602_rs=0;//數(shù)據(jù)/指令選擇置為指令
lcd1602_rw=0; //讀寫選擇置為寫
P0=com;//送入數(shù)據(jù)
delay(1);
lcd1602_en=1;//拉高使能端,為制造有效的下降沿做準備
delay(1);
lcd1602_en=0;//en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}
//-------------------------寫數(shù)據(jù)-----------------------------
void write_1602dat(uchar dat)//***液晶寫入數(shù)據(jù)函數(shù)****
{
lcd1602_rs=1;//數(shù)據(jù)/指令選擇置為數(shù)據(jù)
lcd1602_rw=0; //讀寫選擇置為寫
P0=dat;//送入數(shù)據(jù)
delay(1);
lcd1602_en=1; //en置高電平,為制造下降沿做準備
delay(1);
lcd1602_en=0; //en由高變低,產(chǎn)生下降沿,液晶執(zhí)行命令
}
//-------------------------初始化-------------------------
void lcd_init(void)
{
write_1602com(0x38);//設置液晶工作模式,意思:16*2行顯示,5*7點陣,8位數(shù)據(jù)
write_1602com(0x0c);//開顯示不顯示光標
write_1602com(0x06);//整屏不移動,光標自動右移
write_1602com(0x01);//清顯示
}
//========================================================================================
//=========================================================================================
//==============將按鍵值編碼為數(shù)值=========================
unsigned char coding(unsigned char m)
{
unsigned char k;
switch(m)
{
case (1): k=1;break;
case (2): k=2;break;
case (3): k=3;break;
case (4): k='A';break;
case (5): k=4;break;
case (6): k=5;break;
case (7): k=6;break;
case (8): k='B';break;
case (9): k=7;break;
case (10): k=8;break;
case (11): k=9;break;
case (12): k='C';break;
case (13): k='*';break;
case (14): k=0;break;
case (15): k='#';break;
case (16): k='D';break;
}
return(k);
}
//=====================按鍵檢測并返回按鍵值===============================
void delay_uint(unsigned int i)//延時
{
while(i--);
}
完整代碼見文末下載鏈接
unsigned char keynum(void)
{
unsigned char i, j; // 定義變量i和j分別存儲行列索引
i = 0;
j = 0;
// 設置P1端口的低四位輸出為0,高四位保持不變,準備讀取鍵盤列信號
P1 = 0x0f;
// 判斷是否有鍵被按下(即P1端口的值不全為0x0f)
if(P1 != 0x0f) {
// 延時去抖,等待10ms再次檢測,確保按鍵穩(wěn)定
delay_uint(10000);
// 再次檢查,確認按鍵確實被按下
if(P1 != 0x0f) {
// 根據(jù)P1的值判斷是哪一行被按下
switch(P1) {
case 0x0e: i = 3; break; // 第1行
case 0x0d: i = 2; break; // 第3行
case 0x0b: i = 1; break; // 第3行
case 0x07: i = 0; // 第4行
}
// 設置P1端口的高四位輸出為0,低四位保持不變,準備讀取鍵盤行信號
P1 = 0xf0;
// 根據(jù)P1的新值判斷是哪一列被按下
switch(P1) {
case 0xe0: j = 13; break; // 第1列
case 0xd0: j = 9; break; // 第2列
case 0xb0: j = 5; break; // 第3列
case 0x70: j = 1; // 第4列
}
}
}
// 檢查新獲取的按鍵值(行列索引組合)是否與上一次的不同
if(key != i + j) {
// 更新按鍵值并返回
key = i + j;
return key;
} else {
// 如果按鍵值沒有變化,返回0表示沒有新按鍵事件
return 0;
}
}
//=======================一聲提示音,表示有效輸入========================
void OneAlam(void)
{
beep_cnt=1;
beep_time=BEEP_TIME;
}
//========================二聲提示音,表示操作成功========================
void TwoAlam(void)
{
beep_cnt=2;
beep_time=BEEP_TIME;
}
//========================三聲提示音,表示錯誤========================
void ThreeAlam(void)
{
beep_cnt=3;
beep_time=BEEP_TIME;
}
//=======================顯示提示輸入=========================
void DisplayChar(void)
{
unsigned char i;
if(pass==1)
{
//DisplayListChar(0,1,LockOpen);
write_1602com(er); //在二行開始顯示
for(i=0;i<16;i++)
{
write_1602dat(LockOpen[i]); //顯示open 開鎖成功
}
}
else
{
if(N==0)
{
//DisplayListChar(0,1,Error);
write_1602com(er);
for(i=0;i<16;i++)
{
write_1602dat(Error[i]); //顯示錯誤
}
}
else
{
//DisplayListChar(0,1,start_line);
write_1602com(er);
for(i=0;i<16;i++)
{
write_1602dat(start_line[i]);//顯示開始輸入
}
}
}
}
//========================重置密碼==================================================
//==================================================================================
void ResetPassword(void)
{
unsigned char i;
unsigned char j;
if(pass==0)
{
pass=0;
DisplayChar(); //顯示錯誤
ThreeAlam(); //沒開鎖時按下重置密碼報警3聲
}
else //開鎖狀態(tài)下才能進行密碼重置程序
{
if(ReInputEn==1) //開鎖狀態(tài)下,ReInputEn置1,重置密碼允許
{
if(N==6) //輸入6位密碼
{
ReInputCont++; //密碼次數(shù)計數(shù)
if(ReInputCont==2) //輸入兩次密碼
{
for(i=0;i<6;)
{
if(TempPassword[i]==InputData[i]) //將兩次輸入的新密碼作對比
i++;
else //如果兩次的密碼不同
{
//DisplayListChar(0,1,Error);
write_1602com(er);
for(j=0;j<16;j++)
{
write_1602dat(Error[j]); //顯示錯誤Error
}
ThreeAlam(); //錯誤提示
pass=0; //關鎖
ReInputEn=0; //關閉重置功能,
ReInputCont=0;
DisplayChar();
break;
}
}
if(i==6)
{
//DisplayListChar(0,1,ResetOK);
write_1602com(er);
for(j=0;j<16;j++)
{
write_1602dat(ResetOK[j]); //密碼修改成功,顯示
}
TwoAlam(); //操作成功提示
WrToROM(TempPassword,0,6); //將新密碼寫入24C02存儲
ReInputEn=0;
}
ReInputCont=0;
CorrectCont=0;
}
else //輸入一次密碼時
{
OneAlam();
//DisplayListChar(0, 1, again); //顯示再次輸入一次
write_1602com(er);
for(j=0;j<16;j++)
{
write_1602dat(again[j]); //顯示再輸入一次
}
for(i=0;i<6;i++)
{
TempPassword[i]=InputData[i]; //將第一次輸入的數(shù)據(jù)暫存起來
}
}
N=0; //輸入數(shù)據(jù)位數(shù)計數(shù)器清零
}
}
}
}
//=======================輸入密碼錯誤超過三過,報警并鎖死鍵盤======================
void Alam_KeyUnable(void)
{
P1=0x00;
{
beep_cnt=255;
beep_time=BEEP_TIME;
}
}
//=======================取消所有操作============================================
void Cancel(void)
{
unsigned char i;
unsigned char j;
//DisplayListChar(0, 1, start_line);
write_1602com(er);
for(j=0;j<16;j++)
{
write_1602dat(start_line[j]); //顯示開機輸入密碼界面
}
TwoAlam(); //提示音
for(i=0;i<6;i++)
{
InputData[i]=0; //將輸入密碼清零
}
KEY=1; //關閉鎖
pass=0; //密碼正確標志清零
ReInputEn=0; //重置輸入充許標志清零
ErrorCont=0; //密碼錯誤輸入次數(shù)清零
CorrectCont=0; //密碼正確輸入次數(shù)清零
ReInputCont=0; //重置密碼輸入次數(shù)清零
s3_keydown=0;
key_disable=0; //鎖定鍵盤標志清零
N=0; //輸入位數(shù)計數(shù)器清零
}
4. 設計報告
12485字設計報告,內(nèi)容包括目錄,硬件設計、軟件設計、軟硬件框圖、調(diào)試、結論等
20世紀80年代后,隨著電子鎖專用集成電路的出現(xiàn),電子鎖的體積縮小,可靠性提高,成本較高,是適合使用在安全性要求較高的場合,且需要有電源提供能量,使用還局限在一定范圍,難以普及,所以對它的研究一直沒有明顯進展。
目前,在西方發(fā)達國家,電子密碼鎖技術相對先進,種類齊全,電子密碼鎖已被廣泛應用于智能門禁系統(tǒng)中,通過多種更加安全,
更加可靠的技術實現(xiàn)大門的管理。在我國電子鎖整體水平尚處于國際上70年代左右,電子密碼鎖的成本還很高,市場上仍以按鍵電子鎖為主,按鍵式和卡片鑰匙式電子鎖已引進國際先進水平,現(xiàn)國內(nèi)有幾個廠生產(chǎn)供應市場。但國內(nèi)自行研制開發(fā)的電子鎖,其市場結構尚未形成,應用還不廣泛。國內(nèi)的不少企業(yè)也引進了世界上先進的技術,發(fā)展前景非??捎^。希望通過不斷的努力,使電子密碼鎖在我國也能得到廣泛應用
5. 設計資料內(nèi)容清單&&下載鏈接
資料設計資料包括仿真,程序代碼、講解視頻、功能要求、設計報告、軟硬件設計框圖等。
0、常見使用問題及解決方法–必讀!?。。?/p>
1、仿真圖
2、程序源碼注釋
3、功能要求
4、開題報告
5、設計報告
6、軟硬件流程框圖
7、燒錄工具
8、講解視頻
9、實物圖
Altium Designer 安裝破解
KEIL+proteus 單片機仿真設計教程
KEIL安裝破解
Proteus元器件查找
Proteus安裝
Proteus簡易使用教程
單片機學習資料
普中-2&普中-3&普中-4開發(fā)板原理圖.pdf
相關數(shù)據(jù)手冊
答辯技巧
設計報告常用描述
鼠標雙擊打開查找嘉盛單片機51 STM32單片機課程畢業(yè)設計.url
資料下載鏈接:
https://docs.qq.com/doc/DS2pPenNRaHB6SlR1