標(biāo)題:
基于51單片機(jī)的電子密碼鎖程序Proteus仿真圖設(shè)計(jì)
[打印本頁(yè)]
作者:
Shmily@
時(shí)間:
2022-10-28 16:14
標(biāo)題:
基于51單片機(jī)的電子密碼鎖程序Proteus仿真圖設(shè)計(jì)
1、如果沒(méi)有裝KEIL軟件:.c .h結(jié)尾的文件即為程序,選擇記事本或C語(yǔ)言軟件打開(kāi)。
2、若安裝有KEIL軟件:本程序有KEIL5設(shè)計(jì),為避免版本區(qū)別帶來(lái)的問(wèn)題,建議使用KEIL5打開(kāi).uvproj結(jié)尾的工程文件。
3、其中,.hex結(jié)尾的文件為燒錄文件,可以用于仿真和硬件實(shí)現(xiàn)。
注:其他文件為編譯時(shí)自動(dòng)生成的文件,不用管。
(1)仿真代碼和源程序代碼有著些許區(qū)別,做硬件燒錄時(shí)請(qǐng)用文件夾1中的燒錄程序(.hex);
(2)仿真請(qǐng)打開(kāi)“電子鎖仿真.DSN”工程文件,仿真代碼請(qǐng)打開(kāi)“project.uvproj”文件;
(3)仿真燒錄時(shí)請(qǐng)打開(kāi)“edoor.hex”文件;
(4)具體仿真功能為:
①輸入密碼,且輸入的密碼顯示在液晶顯示屏上;
②按下“DorBell”后,會(huì)響起門(mén)鈴聲;
③初始密碼為“1234”,輸入正確后,顯示“OK”,并且LED燈閃爍,表示開(kāi)門(mén);
④輸入密碼錯(cuò)誤后,顯示“Eror”,三次輸入錯(cuò)誤后會(huì)報(bào)警;
⑤按下“DELE”,清楚輸入的密碼;
特別注意:本仿真原理圖由protues8.7設(shè)計(jì),為避免版本區(qū)別帶來(lái)的問(wèn)題,請(qǐng)盡量使用protues8.7打開(kāi)仿真文件。。
電子密碼鎖仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
(342.86 KB, 下載次數(shù): 26)
下載附件
2022-10-28 23:26 上傳
單片機(jī)源程序如下:
/*
基于51單片機(jī)的電子密碼鎖設(shè)計(jì)
實(shí)現(xiàn)密碼匹配,手動(dòng)門(mén)鈴等功能
設(shè)計(jì)人:訥言敏行
設(shè)計(jì)時(shí)間:2020.4.20
*/
//庫(kù)調(diào)用.宏類(lèi)型定義.位定義//
#include <reg52.h>
//#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define GPIO_KEY P1
sbit RS = P2^2; //液晶顯示器控制端口
sbit RW = P2^3;
sbit E = P3^7;
sbit shuchu=P2^0; //繼電器控制端口
sbit beep=P2^1; //報(bào)警器端口
sbit DoorBell=P3^6; //門(mén)鈴端口
uchar upxs[16]={"Password:"}; //上排存放數(shù)組
uchar dwxs[16]={""}; //下排存放數(shù)組
int tempword[8]={0}; //臨時(shí)密碼數(shù)組
int password[8]={1,2,3,4};//初始密碼
uint now=0; //數(shù)組等效指針
uint key=0; //密鑰
uint KeyValue=16; //用來(lái)存放讀取到的鍵值
uint warn=0; //錯(cuò)誤累計(jì)
uint time=0; //用于定時(shí)
uint time1=0; //用于定時(shí)
uint time2=0; //用于定時(shí)
uint moshi=0; //定時(shí)器內(nèi)部模式
//*********************************************************************************************************************************
//液晶驅(qū)動(dòng)顯示模塊//
void delay(uint dell)//毫秒延時(shí)//
{
uchar x;
for(dell;dell>0;dell--)
for(x=110;x>0;x--);
}
void wr_com(uchar temp)//寫(xiě)指令//
{
RS=0;
RW=0;
P0=temp;
E=1;
E=0;
}
void wr_data(uchar num)//寫(xiě)數(shù)據(jù)//
{
RS=1;
RW=0;
P0=num;
E=1;
E=0;
}
void disp_lcd(uchar addr,char *templ)//顯示函數(shù)//
{
uchar i;
wr_com(addr);
delay(50);
for(i=0;i<16;i++)
{
wr_data(templ[i]);
delay(50);
}
}
void lcd_init()//初始化液晶//
{
wr_com(0x30);
delay(50);
wr_com(0x38);
delay(50);
wr_com(0x01);
delay(50);
wr_com(0x06);
delay(50);
wr_com(0x0c);
delay(50);
}
void lcdxianshi(void)//液晶總顯示//
{
disp_lcd(0x80,upxs);
disp_lcd(0xc0,dwxs);
}
//*********************************************************************************************************************************
//按鍵掃描模塊//
void Delay10ms(void)//延時(shí)函數(shù)//
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=38;b>0;b--)
for(a=130;a>0;a--);
}
void KeyDown(void)//鍵盤(pán)檢測(cè)函數(shù)//
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f) //讀取按鍵是否按下
{
Delay10ms(); //延時(shí)10ms進(jìn)行消抖
if(GPIO_KEY!=0x0f) //再次檢測(cè)鍵盤(pán)是否按下
{
//檢測(cè)列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=1;break;
case(0X0d): KeyValue=2;break;
case(0X0e): KeyValue=3;break;
}
//檢測(cè)行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue;break;
case(0Xb0): KeyValue=KeyValue+4;break;
case(0Xd0): KeyValue=KeyValue+8;break;
case(0Xe0): KeyValue=KeyValue+12;break;
}
while((a<10)&&(GPIO_KEY!=0xf0))//按鍵松手檢測(cè)
{
Delay10ms();
a++;
}
}
}
}
//*******************************************************************************************************************************
//數(shù)據(jù)處理模塊//
void keysend(void)//鍵值傳遞//
{
switch(KeyValue)
{
case 0:{dwxs[now]='0';tempword[now]=0;now++;break;}
case 1:{dwxs[now]='1';tempword[now]=1;now++;break;}
case 2:{dwxs[now]='2';tempword[now]=2;now++;break;}
case 3:{dwxs[now]='3';tempword[now]=3;now++;break;}
case 4:{dwxs[now]='4';tempword[now]=4;now++;break;}
case 5:{dwxs[now]='5';tempword[now]=5;now++;break;}
case 6:{dwxs[now]='6';tempword[now]=6;now++;break;}
case 7:{dwxs[now]='7';tempword[now]=7;now++;break;}
case 8:{dwxs[now]='8';tempword[now]=8;now++;break;}
case 9:{dwxs[now]='9';tempword[now]=9;now++;break;}
case 11:{
upxs[12]='S';
upxs[13]='U';
upxs[14]='R';
upxs[15]='E'; break;
}
case 15:{
TR0=1; //定時(shí)器0打開(kāi)
moshi=1; //模式1為門(mén)鈴模式
KeyValue=16; break;//鍵值緩存清零
}
}
if(now==8) now=0; //只顯示八位
}
void sure(void)//密碼認(rèn)證函數(shù)//
{
uchar i;
if(KeyValue==11)
{
for(i=0;i<8;i++)
{
if(password[i]!=tempword[i])//對(duì)比密碼
{
key++;
}
}
if(key==0) //密碼正確,輸出OK
{
dwxs[13]='O';
dwxs[14]='K';
shuchu=1; //開(kāi)門(mén)
TR1=1; //定時(shí)器1打開(kāi),啟動(dòng)倒計(jì)時(shí)
moshi=0; //輸入正確密碼可關(guān)閉報(bào)警模式
beep=0; //蜂鳴器復(fù)位
TR0=0; //并且關(guān)閉定時(shí)器0
}
if(key!=0) //密碼錯(cuò)誤,次數(shù)累加
{
dwxs[12]='E';
dwxs[13]='R';
dwxs[14]='O';
dwxs[15]='R';
warn++;
if(warn==3) //輸入錯(cuò)誤3次,報(bào)警
{
TR0=1; //定時(shí)器0啟動(dòng)
moshi=2; //模式2啟動(dòng)報(bào)警
warn=0; //累計(jì)清零
}
}
}
}
void delete(void)//清除函數(shù)//
{
uchar i;
for(i=0;i<16;i++)
{
dwxs[i]=0x20; //密碼字符清零
}
for(i=0;i<8;i++)
{
tempword[i]=0; //密碼緩存數(shù)組清零
}
upxs[12]=0x20; //SURE顯示清零
upxs[13]=0x20;
upxs[14]=0x20;
upxs[15]=0x20;
now=0; //類(lèi)指針復(fù)位
key=0; //密鑰清零
KeyValue=16; //鍵值緩存清零
}
void condition_delete(void) //條件清除
{
if(KeyValue==10)
{
delete(); //按下DELE鍵清除數(shù)據(jù)
}
KeyValue=16; //鍵值緩存清零
}
//********************************************************************************************************************************8
//定時(shí)模塊//
void timer0() interrupt 1 //定時(shí)器0用于門(mén)鈴
{
switch(moshi)
{
case 1:{
DoorBell=~DoorBell;
time++;
if(time<400) //若需要拖長(zhǎng)聲音,可以調(diào)整 400 和 800
{
TH0=(8192-700)/32; //700us 定時(shí)
TL0=(8192-700)%32;
}
else if(time<800)
{
TH0=(8192-1000)/32; //1ms 定時(shí)
TL0=(8192-1000)%32;
}
else
{
time=0; //計(jì)數(shù)清零
TR0=0; //關(guān)閉定時(shí)器
moshi=0; //跳出模式1
}
break;
}
case 2:{
beep=~beep;
time++;
if(time<400) //若需要拖長(zhǎng)聲音,可以調(diào)整 400
{
TH0=(8192-700)/32; //700us 定時(shí)
TL0=(8192-700)%32;
}
else
{
time=0; //計(jì)數(shù)清零
}
break;
}
}
}
void timer1() interrupt 3 //定時(shí)器1用于自動(dòng)關(guān)門(mén)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time1++;
if(time1==20)//一秒
{
time2++;
time1=0;
}
}
//**********************************************************************************************************************************
//主函數(shù)//
void main(void)//主函數(shù)
{
TMOD=0x10; //0001 0000//定時(shí)器1方式1,定時(shí)器0方式0
TH0=(8192-700)/32; //定時(shí)器0 700us 定時(shí)
TL0=(8192-700)%32;
TH1=(65536-50000)/256; //定時(shí)器1 50ms
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
shuchu=0; //門(mén)鎖初始化
beep=0; //警報(bào)初始化
DoorBell=0; //門(mén)鈴初始化
lcd_init(); //液晶初始化
while(1)
{
KeyDown(); //按鍵檢測(cè)
keysend(); //數(shù)據(jù)傳遞
lcdxianshi(); //輸入顯示
sure(); //密碼認(rèn)證
condition_delete(); //按鍵清除
if(time2==4) //門(mén)鎖打開(kāi)后4秒關(guān)閉
{
shuchu=0;
time2=0;
delete(); //自動(dòng)清除
TR1=0; //關(guān)閉定時(shí)器1
}
}
}
復(fù)制代碼
Keil代碼與Proteus仿真下載:
基于51單片機(jī)的電子密碼鎖設(shè)計(jì).7z
(2.39 MB, 下載次數(shù): 89)
2022-10-28 23:27 上傳
點(diǎn)擊文件名下載附件
摘
下載積分: 黑幣 -5
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1