標題: 電子鎖相關提問 [打印本頁]
作者: 玄佑 時間: 2017-4-28 14:38
標題: 電子鎖相關提問
這是網上找的一個電子鎖程序,自己進行仿真了,但是輸入密碼環節不知道初始密碼,也好像沒法設定初始密碼,有沒有大神可以幫我看一下,是不是程序問題,還是我自己沒搞懂?
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P1^2;
sbit lcdrs=P1^0;
sbit lcdrw=P1^1;
sbit p17=P1^7; //開門指示:指示燈和蜂鳴器
uchar table1[8]={'N','A','M','E',':'}; //定義數碼管的第一行"name: "
uchar table2[8]={'C','O','D','E',':'}; //定義數碼管的第二行"lode: "
uchar name[10]={'0','1','2','3'};
uchar cod[20]={'0','0','0','0','1','1','1','1','2','2','2','2','3','3','3','3'}; //定義四個用戶,并設置對應的用戶和密碼,
//其中用戶0定義為超級用戶0,用戶1、用戶2和用戶3為普通用戶
uint in_name; //保存輸入的用戶名
uint error_num; //輸入密碼錯誤的次數
uchar in_code1[4]; //保存第一次輸入的密碼
uchar in_code2[4]; //保存第二次輸入的密碼
uchar code sup[11]={'S','U','P','E','R',' ','U','S','E','R','!'}; //輸入用戶為超級用戶
uchar code nor[12]={'N','O','R','M','A','L',' ','U','S','E','R','!'}; //輸入用戶為普通用戶
uchar code err[6]={'E','R','R','O','R','!'}; //輸入用戶名或密碼錯誤
uchar wait[8]={'W','A','I','T','I','N','G','!'}; //等待
uchar aga[11]={'I','N','P','U','T',' ','A','G','A','I','N'}; //再次輸入密碼
uchar ame[9]={'A','M','E','N','D','I','N','G','!'}; //正在修改密碼
uchar fun[6]={'a','b','c','d','e','f'}; //ABCDEF功能鍵
//====================延時函數======================//
void delay(uint x)
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
//=================1602寫指令===============//
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
//==============1602寫數據================//
void write_data(uchar dat)
{
lcdrs=1;
P0=dat;
delay(10);
lcden=1;
delay(10);
lcden=0;
}
//===============1602在指定的位置顯示一個字符=============//
void disp_char(uchar x,uchar y,uchar dat)
{
uint i;
uchar addr;
if(y==1)
addr=0x80+x;
else
addr=0xc0+x;
write_com(addr);
for(i=0;i<2;i++);
write_data(dat);
for(i=0;i<2;i++);
}
//==================1602數碼管初始化函數==================//
void display()
{
lcden=0;
lcdrw=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
}
//=============4*4鍵盤掃描函數=================//
uint keyscan()
{
uchar temp;
uint key=16; //key=16表示沒有按下任何鍵
P2=0xfe; //第一行被置為低電平,開始掃描第一行
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(1);
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case(0xee):
key=0;
break;
case(0xde):
key=1;
break;
case(0xbe):
key=2;
break;
case(0x7e):
key=3;
break;
}
while(temp!=0xf0) //等待按鍵釋放
{
temp=P2;
temp=temp&0xf0;
}
}
}
///////////////////////////////////////////
P2=0xfd; //第二行被置為低電平,開始掃描第二行
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(1);
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case(0xed):
key=4;
break;
case(0xdd):
key=5;
break;
case(0xbd):
key=6;
break;
case(0x7d):
key=7;
break;
}
while(temp!=0xf0) //等待按鍵釋放
{
temp=P2;
temp=temp&0xf0;
}
}
}
////////////////////////////////////////
P2=0xfb; //第三行被置為低電平,開始掃描第三行
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(1);
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case(0xeb):
key=8;
break;
case(0xdb):
key=9;
break;
case(0xbb):
key=10;
break;
case(0x7b):
key=11;
break;
}
while(temp!=0xf0) //等待按鍵釋放
{
temp=P2;
temp=temp&0xf0;
}
}
}
//////////////////////////////////////////////
P2=0xf7; //第四行被置為低電平,開始掃描第四行
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(1);
temp=P2;
temp=temp&0xf0;
if(temp!=0xf0)
{
temp=P2;
switch(temp)
{
case(0xe7):
key=12;
break;
case(0xd7):
key=13;
break;
case(0xb7):
key=14;
break;
case(0x77):
key=15;
break;
}
while(temp!=0xf0) //等待按鍵釋放
{
temp=P2;
temp=temp&0xf0;
}
}
}
return(key);
}
/*/---------------B鍵的功能,刪除用戶--------------------//
void delete_user()
{
;
}
//--------------D鍵的功能,添加用戶----------------------//
void add_user()
{
;
} */
//----------------E鍵的功能,修改密碼-------------//
void amend_code()
{
uint i,j,k=16;
display();
for(i=0;i<5;i++)
disp_char(i,1,table1); //第一行顯示NAME:及對應的用戶名
disp_char(5,1,name[in_name]);
for(i=0;i<5;i++)
disp_char(i,2,table2); //第二行顯示CODE:AMENDING!
for(i=0;i<9;i++)
disp_char(i+5,2,ame);
for(j=0;j<4;j++)
{k=keyscan();
while(k==16)
k=keyscan();
cod[in_name*4+i]=fun[k-10];
}
}
//================F鍵的功能,開門,蜂鳴器間斷響================//
void open_door()
{
uint i,j;
for(i=0;i<6;i++)
for(j=0;j<10000;j++)
{
if((j/5000)%2==0)
p17=1;
else
p17=0;
}
p17=0;
}
//===================超級用戶相關操作======================//
void super_user()
{
uint k=16;
uint flag=0;
while(flag==0)
{
k=keyscan();
while(!(k==10||k==11||k==13||k==14||k==15)) //當A、B、D、E、F均未被按下時,繼續掃描
k=keyscan();
if(k==10) // 當A鍵被按下時,返回
flag=1;
if(k==11) // 當B鍵被按下時,刪除用戶
{
flag=1;
// delete_user();
}
if(k==13) // 當D鍵被按下時,添加用戶
{
flag=1;
// add_user();
}
if(k==14) // 當E鍵被按下時,修改密碼
{
flag=1;
amend_code();
}
if(k==15) // 當F鍵被按下時,開門
{
flag=1;
open_door();
}
}
delay(6000);
}
//===================普通用戶相關操作:改密、開門========================//
void normal_user()
{
uint k=16;
uint flag=0;
while(flag==0)
{
k=keyscan();
while(!(k==14||k==15)) //當沒有按下E、F鍵時,繼續掃描
k=keyscan();
if(k==14); //對應于E鍵
{
flag=1; //普通用戶完成一項操作
amend_code(); //修改當前用戶的密碼
}
if(k==15)
{
flag=1; //普通用戶完成一項操作
open_door(); //F鍵的功能,開門
}
}
delay(6000);
}
//=================第二次輸入密碼函數====================//
void input_code2()
{
uint i,j,flag2=0;
uint k2=16;
error_num=0;
while(flag2==0&&error_num<3)
{
for(i=0;i<4;i++) //輸入4位數密碼,保存在in_code2中
{
k2=keyscan();
while(k2==16)
k2=keyscan();
in_code2=fun[k2-10];
display();
for(j=0;j<5;j++)
disp_char(j,1,table1[j]); //第一行顯示NAME:及對應的用戶名
disp_char(5,1,name[in_name]);
for(j=0;j<5;j++)
disp_char(j,2,table2[j]); //第二行先后顯示CODE:*,CODE:**,CODE:***,CODE:****
for(j=0;j<i+1;j++)
disp_char(5+j,2,'*');
delay(10);
}
delay(10);
//------檢驗輸入的密碼是否與第一次輸入的密碼一致-------//
if(in_code2[0]==in_code1[0]&&in_code2[1]==in_code1[1]&&in_code2[2]==in_code1[2]&&in_code2[3]==in_code1[3])
{
flag2=1; //輸入密碼正確,退出while循環
p17=1; //指示燈亮,蜂鳴器響,表示密碼正確
delay(400);
p17=0;
}
else
{
flag2=0; //輸入密碼錯誤重新輸入
error_num++;
display();
for(j=0;j<5;j++) //第一行顯示NAME:及對應的用戶名
disp_char(j,1,table1[j]);
disp_char(5,1,name[in_name]);
for(j=0;j<5;j++) //第二行顯示CODE:ERROR!2
disp_char(j,2,table2[j]);
for(j=0;j<6;j++)
disp_char(j+5,2,err[j]);
disp_char(11,2,'2');
delay(10);
}
}
}
//=================第一次輸入密碼函數====================//
void input_code1()
{
uint i,j,n,flag1=0,k1=16;
error_num=0;
while(flag1==0&&error_num<3)
{
for(i=0;i<4;i++) //輸入4位數密碼,保存在in_code1中
{
k1=16;
k1=keyscan();
while(k1==16)
k1=keyscan();
in_code1=fun[k1-10];
display();
for(j=0;j<5;j++)
disp_char(j,1,table1[j]); //第一行顯示NAME:及對應的用戶名
disp_char(5,1,name[in_name]);
for(j=0;j<5;j++)
disp_char(j,2,table2[j]); //第二行先后顯示CODE:*,CODE:**,CODE:***,CODE:****
for(n=0;n<i+1;n++)
disp_char(5+n,2,'*');
delay(10);
}
delay(600);
//-------------檢驗輸入的密碼是否正確---------//
if(in_code1[0]==cod[in_name*4+0]&&in_code1[1]==cod[in_name*4+1]&&in_code1[2]==cod[in_name*4+2]&&in_code1[3]==cod[in_name*4+3])
{
flag1=1; //輸入密碼正確,退出wlile循環,等待第二次輸入密碼
display();
for(j=0;j<5;j++)
disp_char(j,1,table1[j]); //第一行顯示NAME:及對應的用戶名
disp_char(5,1,name[in_name]);
for(j=0;j<5;j++)
disp_char(j,2,table2[j]); //第二行顯示CODE:INPUT AGAIN
for(j=0;j<11;j++)
disp_char(j+5,2,aga[j]); //INPUT AGAIN
delay(10);
p17=0; //指示燈亮,蜂鳴器響,表示密碼正確
delay(400);
p17=1;
}
else
{
flag1=0; //輸入密碼錯誤重新輸入
error_num++;
display();
for(j=0;j<5;j++) //第一行顯示NAME:及對應的用戶名
disp_char(j,1,table1[j]);
disp_char(5,1,name[in_name]);
for(j=0;j<5;j++) //第二行顯示CODE:ERROR!1
disp_char(j,2,table2[j]);
for(j=0;j<6;j++)
disp_char(j+5,2,err[j]);
disp_char(11,2,'1');
delay(100);
}
}
}
//=================輸入用戶名函數===================//
void input_name()
{
uint j,flag0=0,error_num=0;
uint k0=16;
while(flag0==0)
{
k0=keyscan();
while(k0==16) //k0=16表示未輸入用戶名
k0=keyscan();
//-----------------------------//
if(k0>=0&&k0<4) //輸入為用戶0、用戶1、用戶2、用戶3
{
flag0=1; //flag=1表示輸入一個正確的用戶
in_name=k0; //記下所輸入的正確用戶的序號
display();
for(j=0;j<5;j++) //第一行顯示NAME:及輸入的用戶
disp_char(j,1,table1[j]);
disp_char(5,1,k0);
for(j=0;j<5;j++) //第二行顯示CODE:
disp_char(j,2,table2[j]);
delay(10);
p17=0; //指示燈亮,蜂鳴器響,表示用戶名正確
delay(400);
p17=1;
}
//-------------------------------//
if((k0>=4&&k0<=15)) //輸入的用戶錯誤
{
flag0=0;
error_num++;
display();
for(j=0;j<5;j++) //第一行顯示NAME:ERROR!
disp_char(j,1,table1[j]);
disp_char(5,1,fun[k0-10]);
for(j=0;j<6;j++)
disp_char(j+7,1,err[j]);
for(j=0;j<5;j++) //第二行顯示CODE:
disp_char(j,2,table2[j]);
delay(10);
}
}
}
void init()
{
uint m;
p17=0;
display(); //等待輸入用戶名
for(m=0;m<5;m++)
disp_char(m,1,table1[m]);
for(m=0;m<8;m++)
disp_char(m+7,1,wait[m]);
for(m=0;m<5;m++) //第二行顯示CODE:
disp_char(m,2,table2[m]);
delay(10);
}
//====================主函數=====================//
void main()
{
uint m;
init();
while(1)
{
input_name(); //進入用戶名輸入函數
input_code1(); //用戶名正確,接下來第一次輸入密碼
if(error_num<3)
{
input_code2(); //第一次輸入密碼正確,第二次輸入密碼
if(error_num<3)
{
if(in_name==0)
{
// display();
for(m=0;m<5;m++) //第一行顯示NAME:及對應的用戶名
disp_char(m,1,table1[m]);
disp_char(5,1,name[in_name]);
for(m=0;m<11;m++) //第二行顯示輸入用戶為超級用戶
disp_char(m,2,sup[m]);
delay(10);
super_user(); //進入超級用戶相關操作
}
else
{
// display();
for(m=0;m<5;m++) //第一行顯示NAME:及對應的用戶名
disp_char(m,1,table1[m]);
disp_char(5,1,name[in_name]);
for(m=0;m<12;m++) //第二行顯示輸入用戶為普通用戶
disp_char(m,2,nor[m]);
delay(10);
normal_user(); //進入普通用戶相關操作
}
}
}
delay(500);
}
}
作者: zl2168 時間: 2017-4-28 21:52
本帖最后由 zl2168 于 2017-4-29 11:03 編輯
網上亂七八糟的,大都有bug,看看我給你推薦的。
功能齊全的電子密碼鎖
⑴ 電路設計 …
電子密碼鎖電路.jpg (98.1 KB, 下載次數: 77)
下載附件
2017-4-28 22:47 上傳
⑵ 功能設計 …
電子密碼鎖功能1.jpg (171.96 KB, 下載次數: 95)
下載附件
2017-4-28 22:47 上傳
電子密碼鎖功能2.jpg (181.75 KB, 下載次數: 78)
下載附件
2017-4-28 22:47 上傳
電子密碼鎖功能3.jpg (192.6 KB, 下載次數: 72)
下載附件
2017-4-28 22:47 上傳
⑶ 程序設計 …
電子密碼鎖流程圖.jpg (147.99 KB, 下載次數: 84)
下載附件
2017-4-28 22:47 上傳
⑷ Proteus仿真 …
先Proteus仿真一下,確認有效,驗證上述功能。
電子密碼鎖1.rar
(1.13 MB, 下載次數: 12)
2017-4-28 22:49 上傳
點擊文件名下載附件
仿真電路和Hex文件能在清華出版社網站免費下載,程序源代碼只能到書上看了。到圖書館借,或到新華書店翻閱,或到網上書店打折購買。
以上摘自張志良編著《80C51單片機實用教程》ISBN978-7-04-044532-9,高教社出版。書中電路和程序設計有詳細說明,程序語句條條有注解。
歡迎咨詢,zzlls@126.com
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
国产高清在线观看
|
天天曰天天操
|
国产精品亚洲精品
|
亚洲精品无
|
午夜在线影院
|
一区二区三区四区视频
|
国产美女精品
|
精品国产一区二区在线观看
|
国模一区二区
|
日韩欧美精品
|
操操操干干干
|
国产精选av|
亚洲欧美日韩另类
|
深夜免费福利
|
欧美日韩在线一区二区三区
|
中文在线观看视频
|
懂色av成人一区二区三区
|
国产精品欧美日韩
|
国产精品国产精品国产专区不卡
|
自拍偷在线精品自拍偷无码专区
|
97精品在线视频
|
亚洲免费黄色
|
欧美精品在线观看
|
亚洲午夜在线观看
|
精品欧美黑人一区二区三区
|
午夜网站在线观看
|
在线视频福利
|
中文字幕在线观看亚洲
|
男女av在线|
国产免费a|
国产精品国产
|
国产天堂网
|
五月伊人网
|
一级片av
|
色婷婷久久综合
|
欧美视频一区二区三区
|
日日夜夜艹
|
欧美黑人性猛交
|
欧美精品在线视频
|
天天干干干
|
日本青青草
|