欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于51單片機的電子密碼鎖程序Proteus仿真圖設計
[打印本頁]
作者:
Shmily@
時間:
2022-10-28 16:14
標題:
基于51單片機的電子密碼鎖程序Proteus仿真圖設計
1、如果沒有裝KEIL軟件:.c .h結尾的文件即為程序,選擇記事本或C語言軟件打開。
2、若安裝有KEIL軟件:本程序有KEIL5設計,為避免版本區別帶來的問題,建議使用KEIL5打開.uvproj結尾的工程文件。
3、其中,.hex結尾的文件為燒錄文件,可以用于仿真和硬件實現。
注:其他文件為編譯時自動生成的文件,不用管。
(1)仿真代碼和源程序代碼有著些許區別,做硬件燒錄時請用文件夾1中的燒錄程序(.hex);
(2)仿真請打開“電子鎖仿真.DSN”工程文件,仿真代碼請打開“project.uvproj”文件;
(3)仿真燒錄時請打開“edoor.hex”文件;
(4)具體仿真功能為:
①輸入密碼,且輸入的密碼顯示在液晶顯示屏上;
②按下“DorBell”后,會響起門鈴聲;
③初始密碼為“1234”,輸入正確后,顯示“OK”,并且LED燈閃爍,表示開門;
④輸入密碼錯誤后,顯示“Eror”,三次輸入錯誤后會報警;
⑤按下“DELE”,清楚輸入的密碼;
特別注意:本仿真原理圖由protues8.7設計,為避免版本區別帶來的問題,請盡量使用protues8.7打開仿真文件!!!
電子密碼鎖仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.gif
(342.86 KB, 下載次數: 26)
下載附件
2022-10-28 23:26 上傳
單片機源程序如下:
/*
基于51單片機的電子密碼鎖設計
實現密碼匹配,手動門鈴等功能
設計人:訥言敏行
設計時間:2020.4.20
*/
//庫調用.宏類型定義.位定義//
#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; //報警器端口
sbit DoorBell=P3^6; //門鈴端口
uchar upxs[16]={"Password:"}; //上排存放數組
uchar dwxs[16]={""}; //下排存放數組
int tempword[8]={0}; //臨時密碼數組
int password[8]={1,2,3,4};//初始密碼
uint now=0; //數組等效指針
uint key=0; //密鑰
uint KeyValue=16; //用來存放讀取到的鍵值
uint warn=0; //錯誤累計
uint time=0; //用于定時
uint time1=0; //用于定時
uint time2=0; //用于定時
uint moshi=0; //定時器內部模式
//*********************************************************************************************************************************
//液晶驅動顯示模塊//
void delay(uint dell)//毫秒延時//
{
uchar x;
for(dell;dell>0;dell--)
for(x=110;x>0;x--);
}
void wr_com(uchar temp)//寫指令//
{
RS=0;
RW=0;
P0=temp;
E=1;
E=0;
}
void wr_data(uchar num)//寫數據//
{
RS=1;
RW=0;
P0=num;
E=1;
E=0;
}
void disp_lcd(uchar addr,char *templ)//顯示函數//
{
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)//延時函數//
{
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)//鍵盤檢測函數//
{
char a=0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f) //讀取按鍵是否按下
{
Delay10ms(); //延時10ms進行消抖
if(GPIO_KEY!=0x0f) //再次檢測鍵盤是否按下
{
//檢測列
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;
}
//檢測行
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))//按鍵松手檢測
{
Delay10ms();
a++;
}
}
}
}
//*******************************************************************************************************************************
//數據處理模塊//
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; //定時器0打開
moshi=1; //模式1為門鈴模式
KeyValue=16; break;//鍵值緩存清零
}
}
if(now==8) now=0; //只顯示八位
}
void sure(void)//密碼認證函數//
{
uchar i;
if(KeyValue==11)
{
for(i=0;i<8;i++)
{
if(password[i]!=tempword[i])//對比密碼
{
key++;
}
}
if(key==0) //密碼正確,輸出OK
{
dwxs[13]='O';
dwxs[14]='K';
shuchu=1; //開門
TR1=1; //定時器1打開,啟動倒計時
moshi=0; //輸入正確密碼可關閉報警模式
beep=0; //蜂鳴器復位
TR0=0; //并且關閉定時器0
}
if(key!=0) //密碼錯誤,次數累加
{
dwxs[12]='E';
dwxs[13]='R';
dwxs[14]='O';
dwxs[15]='R';
warn++;
if(warn==3) //輸入錯誤3次,報警
{
TR0=1; //定時器0啟動
moshi=2; //模式2啟動報警
warn=0; //累計清零
}
}
}
}
void delete(void)//清除函數//
{
uchar i;
for(i=0;i<16;i++)
{
dwxs[i]=0x20; //密碼字符清零
}
for(i=0;i<8;i++)
{
tempword[i]=0; //密碼緩存數組清零
}
upxs[12]=0x20; //SURE顯示清零
upxs[13]=0x20;
upxs[14]=0x20;
upxs[15]=0x20;
now=0; //類指針復位
key=0; //密鑰清零
KeyValue=16; //鍵值緩存清零
}
void condition_delete(void) //條件清除
{
if(KeyValue==10)
{
delete(); //按下DELE鍵清除數據
}
KeyValue=16; //鍵值緩存清零
}
//********************************************************************************************************************************8
//定時模塊//
void timer0() interrupt 1 //定時器0用于門鈴
{
switch(moshi)
{
case 1:{
DoorBell=~DoorBell;
time++;
if(time<400) //若需要拖長聲音,可以調整 400 和 800
{
TH0=(8192-700)/32; //700us 定時
TL0=(8192-700)%32;
}
else if(time<800)
{
TH0=(8192-1000)/32; //1ms 定時
TL0=(8192-1000)%32;
}
else
{
time=0; //計數清零
TR0=0; //關閉定時器
moshi=0; //跳出模式1
}
break;
}
case 2:{
beep=~beep;
time++;
if(time<400) //若需要拖長聲音,可以調整 400
{
TH0=(8192-700)/32; //700us 定時
TL0=(8192-700)%32;
}
else
{
time=0; //計數清零
}
break;
}
}
}
void timer1() interrupt 3 //定時器1用于自動關門
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
time1++;
if(time1==20)//一秒
{
time2++;
time1=0;
}
}
//**********************************************************************************************************************************
//主函數//
void main(void)//主函數
{
TMOD=0x10; //0001 0000//定時器1方式1,定時器0方式0
TH0=(8192-700)/32; //定時器0 700us 定時
TL0=(8192-700)%32;
TH1=(65536-50000)/256; //定時器1 50ms
TL1=(65536-50000)%256;
EA=1;
ET0=1;
ET1=1;
shuchu=0; //門鎖初始化
beep=0; //警報初始化
DoorBell=0; //門鈴初始化
lcd_init(); //液晶初始化
while(1)
{
KeyDown(); //按鍵檢測
keysend(); //數據傳遞
lcdxianshi(); //輸入顯示
sure(); //密碼認證
condition_delete(); //按鍵清除
if(time2==4) //門鎖打開后4秒關閉
{
shuchu=0;
time2=0;
delete(); //自動清除
TR1=0; //關閉定時器1
}
}
}
復制代碼
Keil代碼與Proteus仿真下載:
基于51單片機的電子密碼鎖設計.7z
(2.39 MB, 下載次數: 89)
2022-10-28 23:27 上傳
點擊文件名下載附件
摘
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1