⑴ 誰會用AT89S52單片機製作電子密碼鎖,密碼存儲於AT24C02中
//代碼很長,希望你有耐心讀下去
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
void key_scan();
uchar count0,count1,count3,num,n=0,temp,a,j,count4;
uchar mima[8]; //初始密碼存儲區
uchar tab_key[50]; //輸入密碼存儲區
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
bit enterflag; //確認鍵按下與否的標志
bit mimaflag; //密碼正確與否的標志
bit xiugaiflag; //修改密碼標志
bit enter1flag; //修改密碼確認鍵標志
sbit red=P3^7;
sbit bell=P3^6;
sbit rs=P2^0;
sbit rw=P2^1;
sbit lcden=P2^2;
sbit scl=P3^4;
sbit sda=P3^5;
uchar code table1[]="input the passco";
uchar code table2[]="de: --------";
uchar code table3[]="*";
uchar code table4[]="right (^_^) ";
uchar code table5[]="first error!!!!";
uchar code table6[]="second error!!!!";
uchar code table7[]="third error see ";
uchar code table8[]="u tomorrow (^_^)";
uchar code table9[]="define the passc";
uchar code table10[]="ode: --------";
uchar code table11[]="code is new";
//******************************鍵盤消抖函數*******************************
void delay1()
{ ;; }
void delay2(uchar x)
{
uchar a,b;
for(a=x;a>0;a--)
for(b=100;b>0;b--);
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//****************************e^2room的初始化*******************************
void start() //開始信號
{
sda=1;
delay1();
scl=1;
delay1();
sda=0;
delay1();
}
void stop() //停止
{
sda=0;
delay1();
scl=1;
delay1();
sda=1;
delay1();
}
//****************************應答信號*************************************
void respond()
{
uchar i;
scl=1;
delay1();
while((sda==1)&&(i<250))i++;
scl=0;
delay1();
}
//*****************************寫位元組操作函數**********************************
void write_byte(uchar date)
{
uchar i,temp;
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1; //保持最高位,左移到進位CY
scl=0;
delay1();
sda=CY;
delay1();
scl=1;
delay1();
}
scl=0;
delay1();
sda=1;//匯流排釋放
delay1();
}
//*******************************讀位元組操作函數*****************************
uchar read_byte()
{
uchar i,k;
scl=0;
delay1();
sda=1;
delay1();
for(i=0;i<8;i++)
{
scl=1;
delay1();
k=(k<<1)|sda; //或運算,放到最低位
scl=0;
delay1();
}
return k;
}
//**********************************寫地址函數******************************
void write_add(uchar address,uchar date)
{
start();
write_byte(0xa0);
respond();
write_byte(address);
respond();
write_byte(date);
respond();
stop();
}
//*******************************讀地址函數*************************************
uchar read_add(uchar address)
{
uchar date;
start();
write_byte(0xa0);
respond();
write_byte(address);
respond();
start();
write_byte(0xa1);
respond();
date=read_byte();
stop();
return date;
}
//****************************LCD1602的初始化*******************************
void write_com(uchar com)
{
rs=0;
lcden=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_date(uchar date)
{
rs=1;
lcden=0;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
//***************************************密碼比較函數********************************
bit mimacmp()
{
bit flag;
uchar i;
for(i=0;i<8;i++)
{
if(mima[i]==tab_key[i])
flag=1;
else
{
flag=0;
i=8;
}
}
return(flag); //返回flag
}
////**********************************LCD顯示函數開始**************************************
void lcd_display()
{
uchar i=0;
write_com(0x80+0x40+8);
for(i=0;i<n;i++)
{
write_date(table3[0]);
}
}
//****************************************鍵盤功能分配函數群開始****************************
//** 0 ** 1 **2 ** 3**
//** 4** 5** 6 **7 **
//**8** 9** 確認(A) **無效(B)
//**取消(C)**修改密碼鍵(D)**確認修改鍵(E)**無效(F)
void key_manage1()
{
tab_key[n]=0;
n++;
if(xiugaiflag==1)
{
mima[count4]=0;
count4++;
}
}
void key_manage2()
{
tab_key[n]=1;
n++;
if(xiugaiflag==1)
{
mima[count4]=1;
count4++;
}
}
void key_manage3()
{
tab_key[n]=2;
n++;
if(xiugaiflag==1)
{
mima[count4]=2;
count4++;
}
}
void key_manage4()
{
tab_key[n]=3;
n++;
if(xiugaiflag==1)
{
mima[count4]=3;
count4++;
}
}
void key_manage5()
{
tab_key[n]=4;
n++;
if(xiugaiflag==1)
{
mima[count4]=4;
count4++;
}
}
void key_manage6()
{
tab_key[n]=5;
n++;
if(xiugaiflag==1)
{
mima[count4]=5;
count4++;
}
}
void key_manage7()
{
tab_key[n]=6;
n++;
if(xiugaiflag==1)
{
mima[count4]=6;
count4++;
}
}
void key_manage8()
{
tab_key[n]=7;
n++;
if(xiugaiflag==1)
{
mima[count4]=7;
count4++;
}
}
void key_manage9()
{
tab_key[n]=8;
n++;
if(xiugaiflag==1)
{
mima[count4]=8;
count4++;
}
}
void key_manage10()
{
tab_key[n]=9;
n++;
if(xiugaiflag==1)
{
mima[count4]=9;
count4++;
}
}
//**********************************確認鍵**************************************************************
void key_manage11()
{
enterflag=1; //確認鍵按下
if(n==8) //只有輸入8個密碼後按確認才做比較
mimaflag=mimacmp();
else
mimaflag=0;
if(enterflag==1)
{
enterflag=0;
n=0;
//用FFFFFFFF清除已經輸入的密碼
for(count3=0;count3<8;count3++)
{
delay(5);
tab_key[count3]=0x0f;
}
TR1=1; //打開計數器1
count1=0; //定時器1由50MS累計到1S所用的計數器
if(mimaflag==1)
{
a=0;
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table4[count3]); //密碼正確,顯示RIGHT,綠燈亮
delay(5);
}
}
else
{
n=0;
red=0;
bell=0;
a++;
if(a==1)
{
for(count3=0;count3<8;count3++) //ffffffff清除密碼
{
delay(5);
tab_key[count3]=0x0f;
}
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table5[count3]); //密碼錯誤,顯示 first error,紅燈亮
delay(5);
}
TR1=1;
}
if(a==2)
{
for(count3=0;count3<8;count3++) //ffffffff清除密碼
{
delay(5);
tab_key[count3]=0x0f;
}
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table6[count3]); //密碼錯誤,顯示SECOND ERROR,紅燈亮
delay(5);
}
TR1=1;
}
if(a==3)
{
for(count3=0;count3<8;count3++) //ffffffff清除密碼
{
delay(5);
tab_key[count3]=0x0f;
}
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table7[count3]); //密碼錯誤,顯示third error see,紅燈亮
delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table8[count3]);//密碼錯誤,顯示 U TOMORROW ,紅燈亮
delay(5);
}
TR1=0;
}
}
}
}
void key_manage12()
{
tab_key[n]=11;
n++; //密碼計數清零
}
//****************************************************取消鍵********************************************
void key_manage13()
{
n=0; //密碼計數清零
write_com(0x80); //指針所指位置
for(count3=0;count3<16;count3++)
{
write_date(table1[count3]); //第一行顯示INPUT THE PASSPORD:
delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table2[count3]); //開機顯示--------
delay(5);
tab_key[count3]=0x0f; //用FFFFFFFF清楚已經輸入的密碼
}
}
//*******************************************修改密碼鍵**********************************
void key_manage14()
{
uchar aa=0;
n=0;
xiugaiflag=1;
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table9[count3]); //顯示define the password
delay(5);
tab_key[count3]=0x0f; //用FFFFFFFF清楚已經輸入的密碼
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table10[count3]); //顯示--------
delay(5);
}
TR0=1;
}
//******************************************修改密碼鍵的確認鍵********************************
void key_manage15()
{
n=0;
enter1flag=1;
if(enter1flag==1)
{
enter1flag=0;
count4=0;
for(count3=0;count3<16;count3++)
{
tab_key[count3]=0x0f; //用FFFFFFFF清楚已經輸入的密碼
}
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table11[count3]);
delay(100);
}
TR1=1;
count1=0;
}
}
void key_manage16()
{
tab_key[n]=15;
n++;
}
//****************************************定時器1的50MS,共延時1秒*****************************
void time_1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
if(count1<20)
{
count1++;
}
else //計時到1S
{
TR1=0;
count1=0;
mimaflag=0;
red=1;
bell=1;
//顯示FFFFFFFF
write_com(0x01);
write_com(0x80);
for(count3=0;count3<16;count3++)
{
write_date(table1[count3]); //顯示INPUT THE PASSCODE
delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table2[count3]); //開機顯示FFFFFFFF
delay(5);
}
}
}
//***********************************************定時0**********************************************
void time_0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
if(count4<8)
{
key_scan();
}
else
{
TR0=0;
count4=0;
}
}
//初始化函數
void init()
{
uchar i;
lcden=0;
write_com(0x38); //打開顯示模式設置
write_com(0x0c); //打開顯示,游標等等設置未零
write_com(0x06); //當讀或寫一個字元後地址指針加一,且游標加一,當寫一個字元後整頻顯示左移,
write_com(0x01); //清零指令
write_com(0x80); //指針所指位置
//定時器初始化
TMOD=0x11; //T0,T1工作方式1
TH0=(65536-2000)/256;
TL0=(65536-2000)%256; //T0初始化2MS
TH1=(65536-50000)/256;
TL1=(65536-50000)%256; //T1初始化50MS
TR1=0;
ET1=1;
EA=1;
TR0=0;
ET0=1;
count0=0; //初始沒有密碼輸入,故為零
enterflag=0; //沒有確認鍵按下
mimaflag=0; //密碼正確與否鍵先置零
red=1; //紅燈不亮
//************密碼存入EPROM中**********************************
sda=1;
delay(5);
scl=1;
delay(5);
for(i=0;i<8;i++)
{
write_add(i,8);
delay2(100);
}
for(i=0;i<8;i++)
{
mima[i]=read_add(i);
delay(5);
}
}
void main()
{ rw=0;
init();
write_com(0x80); //指針所指位置
for(count3=0;count3<16;count3++)
{
write_date(table1[count3]); //第一行顯示INPUT THE PASSPORD:
delay(5);
}
write_com(0x80+0x40);
for(count3=0;count3<16;count3++)
{
write_date(table2[count3]); //開機顯示FFFFFFFF
delay(5);
}
while(1)
{
key_scan(); //調用鍵盤掃描函數
lcd_display();
}
}
//**************************************************鍵盤掃描函數開始********************************
void key_scan()
{
//**********掃描第一行*********
P1=0xfe;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xee:
key_manage1();
break;
case 0xde:
key_manage2();
break;
case 0xbe:
key_manage3();
break;
case 0x7e:
key_manage4();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//**************************************************掃描第二行***********************************
P1=0xfd;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xed:
key_manage5();
break;
case 0xdd:
key_manage6();
break;
case 0xbd:
key_manage7();
break;
case 0x7d:
key_manage8();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//*********************************************掃描第三行***********************************
P1=0xfb;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xeb:
key_manage9();
break;
case 0xdb:
key_manage10();
break;
case 0xbb:
key_manage11();
break;
case 0x7b:
key_manage12();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
//***************************************************掃描第四行****************************************
P1=0xf7;
temp=P1;
temp=temp&0xf0;
if(temp!=0xf0)
{
delay(100);
if(temp!=0xf0)
{
temp=P1;
switch(temp)
{
case 0xe7:
key_manage13();
break;
case 0xd7:
key_manage14();
break;
case 0xb7:
key_manage15();
break;
case 0x77:
key_manage16();
break;
}
while(temp!=0xf0)
{
temp=P1;
temp=temp&0xf0;
}
}
}
}
⑵ 怎麼用單片機實現更改密碼
很簡單的,把密碼放在EEPROM就可以了,每次進入系統時比較這個數值就行了
⑶ 單片機中如何實現通過按鍵更改密碼
你這也不是什麼密碼呀,就是按幾次鍵就開門,太容易破譯了。
如果只想保存這個狀態的話,就不管是不是密碼了,就當是一個練習題目吧。
通過按鍵更改密碼,就是把輸入的燈光亮的次數保存下來就行了。
如果是用STC單片機,內部有EEPROM存儲器,把新的密碼保存下來,掉電了也不會丟失的。
如果其它型號的單片機內部沒有EEPROM存儲器,那就只好在外部接 一片AT24c02,這是I2C的EEPROM晶元。
按鍵開門時,把輸入的亮燈的次數與保存的次數比較,相同,密碼正確開門,不相同,密碼錯誤,報警響鈴。
⑷ 請問老師,單片機系統的FLASH與EEPROM怎樣加密請師傅指教。
一般來說有編程器的話這些都可以一次性解決了.
看了你的信息了,你要是用的AT89S51的話也可以把產品做好後通過ISP編程線來進行編程了,ISP編程線可以自己做,只要我們的PCB板上留出介面就可以,軟體可以在愛特梅爾公司的網站上下載,這些都可搜的到,我現在在越南出差,網速很慢你要是一直沒有找到的話等我回家後可以發給你個。不過給M29F040-120N1寫程序的話要用編程器,但具體的型號我一下也想不出,你可以在網路裡面搜下,我的網速很慢。
⑸ 怎麼在單片機中存密碼
你要知道,單片機不可能像計算機那樣運行,所以需要非易失性的存儲器來保存,比如EEPROM,外接24C02或者用單片機自帶的都可以。單片機每次運行的時候從eeprom讀取數據,就這樣。
⑹ 單片機密碼鎖如何設置初始密碼
源程序有吧?看源程序能分析出來密碼存儲的地址及密碼結構,然後按照這個地址和結構往24C02中寫個密碼就可以了,如果只有HEX文件,也沒有密碼在24C02中的存儲地址以及密碼的結構,那就沒有辦法了。
⑺ 求一份基於單片機的電子密碼鎖,要有電路原理圖,protues模擬,源程序,謝謝好心人,郵箱[email protected]
我在網上看到過一份基於單片機的電子密碼鎖,有電路原理圖,protues模擬,源程序,你可到「谷歌」上搜索一下「基於51單片機的電子密碼鎖系統設計製作」,這款基於51單片機的電子密碼鎖系統,單片機用STC89C52RC單片機,電路簡單,製作過程中不需要進行調試,支持密碼掉電保存功能!密碼儲存於單片機內部自帶的的EEPROM中,不需要外置AT24C01保存密碼,是學習電子密碼鎖比較好的教學試驗系統,主要功能如下:
1、1602液晶菜單顯示。
2、6位密碼,密碼可重置,重置密碼時,先輸入原始密密,正確後輸入新密碼,再交輸入新密碼,兩次輸入的密碼一致辭時,密碼修改成功。開鎖時,密碼通過鍵盤輸入,若密碼正確,則將鎖打開,諾密碼不正確時,無法開鎖,密碼輸入錯誤三次時,蜂鳴器報警並且鎖定鍵盤,10分鍾。
3、支持掉電保存密碼功能。單片機中的密碼是儲存於單片內部的EEPROM中,在密碼鎖系統斷電時,儲存在密碼鎖系統中的密碼不會丟失。
基於51單片機的電子密碼鎖系統設計製作,有套件、及組裝好的板件,含原理圖、源程序、設計說明等。
你找找,也有用AT89C51單片機的。
⑻ 一個單片機編程的問題
單片機2,程序中,缺少死循環,程序跑飛了。
加上一個 while(1);,再試。
⑼ 52單片機的電子密碼鎖,單片機就能實現密碼存儲,為什麼還要加個外部存儲器存儲密碼
具有EEPROM的單片機是可以實現存儲,沒有的就需要外部加存儲器,不然掉電備份就丟了,EEPROM=非易失存儲器。
VO是亮度對比度調節,電壓不同,亮度對比度就不同
⑽ 求單片機電子密碼鎖源程序、模擬電路圖
電子密碼鎖源程序、模擬電路圖你可到「谷歌」上搜索一下「基於51單片機的電子密碼鎖系統設計製作」,這款基於51單片機的電子密碼鎖系統,單片機用STC89C52RC單片機,電路簡單,製作過程中不需要進行調試,支持密碼掉電保存功能!密碼儲存於單片機內部自帶的的EEPROM中,不需要外置AT24C01保存密碼,是學習電子密碼鎖比較好的教學試驗系統,主要功能如下:
1、1602液晶菜單顯示。
2、6位密碼,密碼可重置,重置密碼時,先輸入原始密密,正確後輸入新密碼,再交輸入新密碼,兩次輸入的密碼一致辭時,密碼修改成功。開鎖時,密碼通過鍵盤輸入,若密碼正確,則將鎖打開,諾密碼不正確時,無法開鎖,密碼輸入錯誤三次時,蜂鳴器報警並且鎖定鍵盤,10分鍾。
3、支持掉電保存密碼功能。單片機中的密碼是儲存於單片內部的EEPROM中,在密碼鎖系統斷電時,儲存在密碼鎖系統中的密碼不會丟失。
基於51單片機的電子密碼鎖系統設計製作,有套件、及組裝好的板件,含原理圖、源程序、設計說明等。