標(biāo)題:
新手寫的單片機(jī)密碼鎖程序
[打印本頁]
作者:
times_love
時間:
2019-8-23 10:30
標(biāo)題:
新手寫的單片機(jī)密碼鎖程序
功能:1,點擊開鎖后,輸入密碼,設(shè)置的初始密碼為666666,LED燈亮
2,點擊上鎖,密碼鎖鎖上,LED燈關(guān)閉
3,點擊修改密碼,先輸入原密碼,正確后輸入新密碼,屏幕顯示save over,點擊保存密碼,密碼保存在EEPROM中(因為不知道怎么在PROTEUS中使用EEPROM所以這個功能實現(xiàn)不了,但是要是在單片機(jī)開發(fā)板上就可以)
4,開鎖10秒后自動上鎖
5,串口可以使用虛擬串口,但由于學(xué)的不多,只能傳入單個字符選擇需要實現(xiàn)的功能,然后用鍵盤實現(xiàn)功能
6,初學(xué)以來第一次做的比學(xué)單個功能時稍大一點的程序,可能有些地方考慮不周,可以交流一下嘛^-^.
電路原理圖如下:
捕獲.PNG
(217.58 KB, 下載次數(shù): 90)
下載附件
2019-8-23 10:29 上傳
單片機(jī)源程序如下:
#include<reg52.h>
#include"lcd.h"
#include"eeprom.h"
#include"keyboard.h"
#include"sounder.h"
#include"led.h"
#define u8 unsigned char
#define u16 unsigned int
unsigned long pass=666666;
unsigned int Timer0=0;
unsigned char uartvalue=0;
u8 code str1[]=" Password: ";
u8 code str2[]=" Close ";
u8 code str3[]=" Old Password: ";
u8 code str4[]="0123456789";
u8 code str5[]=" OPEN ";
u8 code str6[]=" Password Lock ";
u8 code str7[]=" Wrong! ";
u8 code str8[]=" New Password: ";
u8 code str9[]="******";
u8 code str10[]=" Change Over ";
u8 code str11[]=" Save Over ";
u8 code str12[]="修改密碼";
u8 code kong[]=" ";
u8 strbuff[16];
void E2init()//EEPROM初始值
{
unsigned long num1,num2,num3,date1,date2,date3;
num1=pass/10000;
num2=pass/100%100;
num3=pass%100;
At24c02write(1,num1);
At24c02write(2,num2);
At24c02write(3,num3);
date1=At24c02read(1);
date2=At24c02read(2);
date3=At24c02read(3);
pass=(date1*10000+date2*100+date3);
}
void Lockinit()//最初屏顯
{
unsigned char i;
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str6[i]);
}
}
void clear(unsigned char j)//清屏
{
unsigned char i;
if(j==0)
{
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(kong[i]);
}
}
if(j==1)
{
Write_cmd(0x80+0x40);
for(i=0;i<16;i++)
{
Write_dat(kong[i]);
}
}
}
void open()//開鎖
{
unsigned char i=0,j=0;
unsigned long mima=0;
while(1)
{
Keyvalue();
if(keystate==1&&(value>=0&&value<=9||value==14))//輸入密碼
{
keystate=0;
Write_cmd(0x80+0x40+j);
Write_dat(str9[j]);
j++;
mima=mima*10+value;
if(value==14)
{
clear(1);
j=0;
mima=0;
}
}
if(j==6)//密碼輸入完畢,判斷
{
delay(50000);
if(mima==pass)//正確
{
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str5[i]);
}
TR0=1;
clear(1);
LED=0;
}
else//錯誤
{
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str7[i]);
}
clear(1);
LED=1;
}
break;
}
}
}
void change()//修改密碼
{
unsigned char i,j=0;
unsigned long mima=0,changemima=0;
TR0=0;
Timer0=0;
while(1)
{
Keyvalue();
if(keystate==1&&(value>=0&&value<=9||value==14))//輸入密碼
{
keystate=0;
Write_cmd(0x80+0x40+j);
Write_dat(str4[value]);
j++;
mima=mima*10+value;
if(value==14)
{
clear(1);
j=0;
mima=0;
}
}
if(j==6)//輸入完畢,判斷
{
delay(50000);
clear(1);
if(mima==pass)//密碼正確
{
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str8[i]);
}
i=0;
while(1)
{
Keyvalue();
if(keystate==1&&(value>=0&&value<=9||value==14))//輸入需要修改的密碼
{
keystate=0;
Write_cmd(0x80+0x40+i);
Write_dat(str4[value]);
changemima=changemima*10+value;
i++;
if(value==14)
{
clear(1);
i=0;
changemima=0;
}
}
if(i==6)//輸入完畢,保存
{
delay(50000);
pass=changemima;
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str10[i]);
}
clear(1);
break;
}
}
}
else//舊密碼輸入錯誤
{
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str7[i]);
}
clear(1);
LED=1;
}
break;
}
}
}
void save()//保存密碼
{
unsigned char i;
unsigned long num1,num2,num3;
TR0=0;
Timer0=0;
num1=pass/10000;
num2=pass/100%100;
num3=pass%100;
At24c02write(1,num1);
At24c02write(2,num2);
At24c02write(3,num3);
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str11[i]);
}
clear(1);
}
void KeyBoard()//鍵值功能
{
unsigned char i=0;
unsigned char keylock = 0;
while(1)
{
Keyvalue();
if(value==10)//開鎖
{
keystate=0;
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str1[i]);
}
keylock=1;
}
if(value==11)//上鎖
{
keystate=0;
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str2[i]);
}
clear(1);
LED=1;
break;
}
if(value==12)//修改密碼
{
keystate=0;
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str3[i]);
}
keylock=2;
}
if(value==13)//保存密碼
{
keystate=0;
keylock=3;
}
switch(keylock)
{
case 1:keylock = 0;open();value=15;break;
case 2:keylock = 0;change();value=15;break;
case 3:keylock = 0;save();value=15;break;
default:break;
}
}
}
void main()
{
TMOD=0X21; //定時器1方式2,定時器0方式1
SCON=0X50; //串口設(shè)置
PCON=0X80; //波特率加倍
TH1=0XFA; //設(shè)置波特率為9600
TL1=0XFA;
TH0=0XF8; //定時2ms
TL0=0XCC;
EA=1;
ES=1;
ET0=1;
TR1=1;
Lcdinit(); //LCD1602初始化
Lockinit();
E2init();
while(1)
{
KeyBoard();
}
}
void ledonoff() interrupt 1
{
unsigned char i;
TH0=0XF8;
TL0=0XCC;
if(LED==0)
{
Timer0++;
}
if(Timer0==5000)
{
LED=1;
Timer0=0;
Write_cmd(0x80);
for(i=0;i<16;i++)
{
Write_dat(str2[i]);
}
TR0=0;
}
}
void Uart() interrupt 4
{
unsigned char UART_buff;
if(RI)
{
UART_buff=SBUF;
if(UART_buff=='0') value=10;
if(UART_buff=='1') value=11;
if(UART_buff=='2') value=12;
if(UART_buff=='3') value=13;
SBUF=UART_buff;
}
if(TI)
{
TI=0;
}
}
復(fù)制代碼
源程序51hei下載,但是沒有仿真,求大神分享個仿真圖啊:
test_23,門禁.zip
(72.98 KB, 下載次數(shù): 50)
2019-8-23 10:28 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
a1091182805
時間:
2020-4-12 14:18
hhh附件里好像沒有仿真。
作者:
nifu9110
時間:
2020-6-4 22:41
附件里沒有仿真。。。。。。
作者:
times_love
時間:
2020-8-29 13:12
額,這是很早做的了,仿真已經(jīng)刪除了,但是上面我貼的圖就是仿真圖嘛,可以根據(jù)那個畫一個
作者:
faridzled
時間:
2020-8-31 07:36
thanks for sharing
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1