仿真版本:Proteus8.6及以上版本
程序編譯:Keil5 C51
編程語言:C語言
設(shè)計編號:【N03】
1.? 簡介
? 本文提出了一種基于51單片機(jī)的簡易密碼鎖設(shè)計。該設(shè)計在硬件方面主要采用AT89C51單片機(jī)作為主控核心,結(jié)合矩陣鍵盤、LCD1602、LED燈、蜂鳴器,實現(xiàn)修改用戶密碼、關(guān)鎖、退格、密碼錯誤報警等功能。
2.? 主要功能
a.本設(shè)計為了防止密碼被竊取要求在輸入密碼時在數(shù)碼管上顯示*號。
b.設(shè)計開鎖密碼位6位密碼的電子密碼鎖。
c.能夠在密碼正確時紅燈亮,LCD1602顯示OPEN。
d.4×4的矩陣鍵盤其中包括0-9的數(shù)字鍵和A-F的功能鍵
e.本產(chǎn)品具備報警功能,當(dāng)輸入密碼錯誤時蜂鳴器響,連續(xù)三次輸錯密碼鎖定鍵盤。
f.密碼可以由用戶自己修改設(shè)定。
3.? 源程序(Keil5)
本設(shè)計采用keil5 C51軟件(內(nèi)附安裝包)實現(xiàn)程序設(shè)計。如需用keil4打開程序,可自行通過.c和.h文件新建工程即可。
//包含頭文件
#include <REG51.h>
#include<intrins.h>
//宏定義
#define LCM_Data P0 //將P0口定義為LCM_Data
#define uchar unsigned char
#define uint unsigned int
//1602的控制腳
sbit lcd1602_rs=P2^5;
sbit lcd1602_rw=P2^6;
sbit lcd1602_en=P2^7;
sbit Scl=P3^4; //24C02串行時鐘
sbit Sda=P3^5; //24C02串行數(shù)據(jù)
sbit ALAM = P2^1; //報警
sbit KEY = P3^6; //開鎖
bit pass=0; //密碼正確標(biāo)志
bit ReInputEn=0; //重置輸入允許標(biāo)志
bit s3_keydown=0; //3秒按鍵標(biāo)志位
bit key_disable=0; //鎖定鍵盤標(biāo)志
unsigned char countt0,second; //t0中斷計數(shù)器,秒計數(shù)器
void Delay5Ms(void); //聲明延時函數(shù)
unsigned char code a[]={0xFE,0xFD,0xFB,0xF7}; //控盤掃描控制表
//液晶顯示數(shù)據(jù)數(shù)組
unsigned char code start_line[] = {"password: "};
unsigned char code name[] = {"===Coded Lock==="}; //顯示名稱
unsigned char code Correct[] = {" correct "}; //輸入正確
unsigned char code Error[] = {" error "}; //輸入錯誤
unsigned char code codepass[] = {" pass "};
unsigned char code LockOpen[] = {" open "}; //OPEN
unsigned char code SetNew[] = {"SetNewWordEnable"};
unsigned char code Input[] = {"input: "}; //INPUT
unsigned char code ResetOK[] = {"ResetPasswordOK "};
unsigned char code initword[] = {"Init password..."};
unsigned char code Er_try[] = {"error,try again!"};
unsigned char code again[] = {"input again "};
unsigned char InputData[6]; //輸入密碼暫存區(qū)
unsigned char CurrentPassword[6]={0,0,0,0,0,0}; //讀取EEPROM密碼暫存數(shù)組
unsigned char TempPassword[6];
unsigned char N=0; //密碼輸入位數(shù)記數(shù)
unsigned char ErrorCont; //錯誤次數(shù)計數(shù)
unsigned char CorrectCont; //正確輸入計數(shù)
unsigned char ReInputCont; //重新輸入計數(shù)
unsigned char code initpassword[6]={0,0,0,0,0,0}; //輸入管理員密碼后將密碼初始為000000
unsigned char code adminpassword[6]={1,3,1,4,2,0}; //輸入管理員密碼后將密碼初始為000000
//=====================5ms延時==============================
void Delay5Ms(void)
{
unsigned int TempCyc = 5552;
while(TempCyc--);
}
//===================400ms延時==============================
void Delay400Ms(void)
{
unsigned char TempCycA = 5;
unsigned int TempCycB;
while(TempCycA--)
{
TempCycB=7269;
while(TempCycB--);
}
}
//=============================================================================================
//================================24C02========================================================
//=============================================================================================
void mDelay(uint t) //延時
{
uchar i;
while(t--)
{
for(i=0;i<125;i++)
{;}
}
}
void Nop(void) //空操作
{
_nop_(); //僅作延時用一條語句大約1us
_nop_();
_nop_();
_nop_();
}
/*****24c02程序參照24c02時序圖*****/
/*起始條件*/
void Start(void)
{
Sda=1;
Scl=1;
Nop();
Sda=0;
Nop();
}
/*停止條件*/
void Stop(void)
{
Sda=0;
Scl=1;
Nop();
Sda=1;
Nop();
}
/*應(yīng)答位*/
void Ack(void)
{
Sda=0;
Nop();
Scl=1;
Nop();
Scl=0;
}
/*反向應(yīng)答位*/
void NoAck(void)
{
Sda=1;
Nop();
Scl=1;
Nop();
Scl=0;
}
4.? 仿真proteus8.6
? 本設(shè)計采用proteus8.6軟件(內(nèi)附安裝包)實現(xiàn)仿真設(shè)計,如下圖所示。proteus軟件一般存在高低版本兼容問題,該仿真是通過proteus8.6導(dǎo)出的,所以請盡量使用proteus8.6打開文件,低于proteus8.6的版本不能夠正常使用,高于proteus8.6的版本除了proteus8.8/8.9理論上可以正常使用。
初始界面:
開鎖:
5.? 設(shè)計報告
設(shè)計報告主要包括硬件電路、軟件設(shè)計、仿真調(diào)試等等,僅供參考。
6.? 資料清單
設(shè)計資料主要包括C程序+仿真+設(shè)計報告+使用說明+元件清單+操作視頻等。
7.? 資料獲取鏈接
百度網(wǎng)盤下載鏈接:【N03】百度網(wǎng)盤下載鏈接
更多單片機(jī)仿真設(shè)計合集:單片機(jī)仿真設(shè)計合集